2
www.ChF-Online.de  

Forschrittsbalken im Eigenbau

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
aktiv aktiv Form-Sachen
 Auflösungs-Erscheinung
 Fenster-Splitter
aktiv  Fortschrittliches
 Hyperlinks in Userformen
 Kontextmenü erstellen
 Pflichtfeldprüfung
 Vorgabewerte ändern
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
 Fix-und-Fertiges/Projekte
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
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 

 Besucher: 1 online  |  10 heute  |  1349 diesen Monat  |  683059 insgesamt | Seitenaufrufe: 88   Letzte Änderung: 24.06.2006 © 2001-18 Christian Freßdorf
  Da man Macht haben muß, um das Gute durchzusetzen, setzt man zunächst das Schlechte durch, um Macht zu gewinnen.
Ludwig Marcuse
 powered by phpCMS and PAX