Forschrittsbalken im Eigenbau |
|
|||||||||||||||||||||
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.
Ein Fortschrittsbalken setzt sich im Prinzip aus mindestens zwei Teilen zusammen:
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. 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. 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. Das folgende Beispiel zeigt, wie sich dieser Fortschrittsbalken aus anderen Prozeduren aufrufen lässt: 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) |