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

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

Wenn man viele Daten verarbeiten muss, kann es hilfreich sein, dem Anwender anzuzeigen, wieweit die Verarbeitung fortgeschritten ist. Leider bietet VBA im Gegensatz zu VB keine Unterstützung in Form eines entsprechenden Controls.
Will man nicht auf externe Controls/Lösungen zurückgreifen, bleibt einem nichts anderes übrig, als sich einen Fortschrittsbalken (Laufleiste) selbst zu erstellen. Wie man das machen kann, zeigt folgendes Beispiel.

Fortschrittsbalken

Ein Fortschrittsbalken setzt sich im Prinzip aus mindestens zwei Teilen zusammen:

  • der Laufleiste
  • dem Laufbalken
  • eine Fortschrittswert-Anzeige (optional)

Dabei zeigt die Breite des Laufbalkens den aktuellen Fortschritt und der Fortschrittswert den aktuellen Verarbeitungsschritt an. Alle Bestandteile lassen sich mit Textfeldern (Labels) realisieren, wobei es darauf ankommt, die Textfelder passend zu positionieren. Dabei wird zuerst die Laufleiste, dann der Laufbalken und zum Schluss die Wert-Anzeige auf die Userform eingefügt, damit die Lage (z-Achse) der einzelnen Textfelder stimmt. Anschließend werden alle Textfelder in den Abmessungen und der Position angeordnet. Mit geeigneter Wahl der Rahmen kann ein 3D Effekt erzielt werden (siehe Beispiel).

Kernstück des Fortschrittsbalkens ist die Berechnung der Laufbalkenbreite in Abhängigkeit von der Laufleistenbreite und des Maximalwertes.
Diese Berechnung erfolgt in der Funktion  lblLeisteSchritt, die als Parameter den aktuellen Fortschrittswert und den Maximalwert erwartet. Zurückgeliefert wird von der Funktion die Breite des Laufbalken.

Private Function lblLeisteSchritt(iWert As Long, iMax As Long) As Long  
lblLeisteSchritt = Int(lblBackground.Width / iMax * iWert)
End Function 

Wenn die einzelnen Funktinsaufrufe sehr schnell hintereinander erfolgen, da z.B. die Verarbeitungsschritte schnell ausgeführt werden können, ist vom Fortschrittsbalken nicht viel zu sehen, da sofort der Maximalwert erreicht würde. Um eine Pause zwischen den einzelnen Schritten zu erreichen, kann auf das API Sleep zurückgegriffen werden. Dieses API unterbricht die Verarbeitung für die angegebene Zeitspanne (in Millisekunden), bevor der Code fortgesetzt wird.

Private Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)

Das folgende Beispiel zeigt, wie sich die Fortschrittsanzeige und somit auch die Verarbeitung stoppen lässt; dabei wird einfach nur eine Schleife durchlaufen und die Beschriftung der Schaltfläche geprüft.
Über die Schaltfläche CmdStart wird die Fortschrittsanzeige gestartet. Gleichzeitig wird die Beschriftung der Schaltfläche auf "Stop" geändert. Solange die Beschriftung auf "Stop" steht und der Maximalwert nicht erreicht ist, läuft die Anzeige. Wird erneut auf die Schaltfläche geklickt, ändert sich die Beschriftung und die Anzeige wird gestoppt. Mit einem erneuten Klick wird die Fortschrittsanzeige wieder vom Anfang an gestartet.
Wichtig für diese Abfrage der Beschriftung ist der Befehl DoEvents, der die Kontrolle an das Betriebssystem zurück gibt, so dass auf Aktionen wie der Schaltlfächenklick reagiert werden kann.

Const C_START = "Start"
Const C_STOP = "Stop"
'
Private Sub CmdStart_Click()  
Dim b As Long 
Dim intMax As Long 
intMax = fkt_Max
If intMax = 0 Then Exit Sub 
If CmdStart.Caption = C_STOP Then 
  CmdStart.Caption = C_START
Else 
  CmdStart.Caption = C_STOP
  lblLeiste.Width = 0
  Do While b < intMax And CmdStart.Caption = C_STOP
    DoEvents 
    Sleep 10
    b = b + 1
    lblLeiste.Width = lblLeisteSchritt(b, intMax)
    ' Fortschritt in Einzelpunkten
    txtcounter.Caption = b
    ' Fortschritt in Prozent
    txtcounter.Caption = Int(b / intMax * 100) & "%"
    DoEvents 
  Loop 
  CmdStart.Caption = C_START
End If 
End Sub 

Das fertige Beispiel demonstriert die Möglichkeiten, die einem zur Verfügung stehen und die als Anhaltspunkte für eigene Erweiterungen dienen können.
So lassen sich die Farbe des Laufbalkens sowie die Rahmen des Lauffeldes und des Laufbalkens über die Optionsfelder zur Laufzeit ändern.

Das folgende Beispiel zeigt, wie sich dieser Fortschrittsbalken aus anderen Prozeduren aufrufen lässt:
Dazu werden die eigentlichen Funktionen zum Setzen der Laufbalkenbreite in eine eigene Funktion ausgelagert. Dieser Funktion werden dann nur der aktuelle Wert und der Maximalwert im Aufruf mitgegeben. Das Ergebnis wird dann in der Userform angezeigt.
Der Funktionsaufruf erfolgt dann in einer beliebigen Prozedur. In dieser muss nur die Userform eingeblendet und die neue Funktion  setPos() mit den jeweiligen Werten aufgerufen werden.

Sub Aufruf()
Dim i As Long 
Dim iMax As Long 
' Userform aufrufen  
frmFortschrittsBalken.Show vbModeless
' Maximalwert festlegen  
iMax = 1999
' als Beispiel eine Schleife durchlaufen  
' es kann auch ein einzelner Schritt verwendet werden  
For i = 1 To iMax
  setPos i, iMax
Next i
End Sub  
Function setPos(i As Long, intMax As Long)
With frmFortschrittsBalken
  .lblLeiste.Width = 0
  .txtMax = intMax
  If i <= intMax Then 
    .lblLeiste.Width = Int(.lblBackground.Width / intMax * i)
    .txtcounter.Caption = Int(i / intMax * 100) & "%"
    DoEvents 
  End If 
End With 
End Function 

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