Aktuelle Seite:
/vba/vbasplitter.htm
Letzte Änderung: 24.06.2006

Getestet unter Word2000Getestet unter WordXP  
Beispiel anzeigen
Makro/Datei speichern
Print

Ein Splitter ist in VB ein zweigeteiltes Fenster mit einem verschiebbaren Mittelsteg. Der Mittelsteg kann dabei mit gedrückter Maustaste vertikal oder horizontal verschoben werden, wobei sich gleichzeitig die beiden Fensterhälften in der Breite bzw. Höhe mitändern.
Während man in VB inzwischen auf fertige Controls zurückgreifen kann, möchte ich hier zeigen, wie man sich auch in VBA ohne zusätzliche Controls einen solchen Splitter selber bauen kann.

Fenster-Splitter

Der Mittelsteg ist jedoch kein eigenes Control, sondern er ergibt sich aus dem Abstand der beiden benachbarten Controls auf der Userform.

Das Geheimnis, das hinter der angeblichen Verschiebung steckt, ist nun, dass nicht der Mittelsteg verschoben wird, sondern die Breite der beiden Controls abhängig vom Mauszeiger verändert wird. Dazu wird ein Ereignis der Userform abgefragt, das wohl eher selten verwendet wird: Das .MouseMove-Ereignis.
Bei jeder Veränderung des Mauszeigers über der Userform wird darin geprüft, ob sich der Mauszeiger innerhalb der Breite des Mittelstegs befindet. Ist dies der Fall, wird zum einen der Mauszeiger geändert (was leider nicht sehr zuverlässig funktioniert) und zum anderen wird dann die Funktion  fkt_MoveSplitter zum Anpassen der Control-Breiten aufgerufen. Dieser Funktion werden die beiden Controls, die verändert werden sollen, und die aktuelle Cursorposition im Aufruf mitgegeben.

Private Sub UserForm_MouseMove(ByVal Button As Integer,  _
  ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
If (y > ListBox1.Top) And (y < (ListBox1.Top + ListBox1.Height)) Then 
  If (x > (intXPosTrenn - intTrennBreite)) And (x < ( _
    intXPosTrenn + intTrennBreite)) Then 
      Me.MousePointer = fmMousePointerSizeWE
  Else 
    If Button = 0 Then 
      Me.MousePointer = fmMousePointerDefault
      intXPosTrenn = ListBox2.Left - intTrennBreiteHalb
    End If 
  End If 
Else 
    Me.MousePointer = fmMousePointerDefault
End If 
If (Button = 1) And (Me.MousePointer = fmMousePointerSizeWE) Then 
  fkt_MoveSplitter ListBox1, ListBox2, x, y
End If 

In der Funktion  fkt_MoveSplitter wird neben der Berechnung der beiden Control-Breiten auch kontrolliert, dass die Verschiebung des Mittelstegs nach links und rechts nicht eine Mindestbreite der Controls überschreitet.
Nachdem alle Berechnungen erfolgt sind, werden zum Schluss die beiden Controls über die .Move-Methode mit der neuen Breite positioniert.

Function fkt_MoveSplitter(ByRef ctl1 As Control, ByRef ctl2 As Control, _
  ByVal x As Single, ByVal y As Single)
Dim intBreiteCtl2 As Long 
Dim intBreiteCtl1 As Long 
Dim minXPosTrenn As Long 
Dim maxXPosTrenn As Long 
intXPosTrenn = x
'Verschiebung des Trennbalkens nach links begrenzen  
minXPosTrenn = intMinBreite + intRandLinks + intTrennBreiteHalb
If intXPosTrenn < minXPosTrenn Then 
  intXPosTrenn = minXPosTrenn
End If 
'Verschiebung des Trennbalkens nach rechts begrenzen  
maxXPosTrenn = Me.Width - (intMinBreite + intRandLinks + intTrennBreiteHalb)
If intXPosTrenn > maxXPosTrenn Then 
  intXPosTrenn = maxXPosTrenn
End If 
'Breite Control 1 (links)  
intBreiteCtl1 = intXPosTrenn - (intRandLinks + intTrennBreiteHalb)
'Breite Control 2 (rechts)  
intBreiteCtl2 = Me.Width - (intRandLinks + intBreiteCtl1 + intTrennBreite + _
  intRandLinks)
ctl1.Move intRandLinks, intRandOben, intBreiteCtl1
ctl2.Move intXPosTrenn + intTrennBreiteHalb, intRandOben, intBreiteCtl2
End Function  

 www.chf-online.de/vba/vbasplitter.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)