Einer für drei: Der Befehl SysCmd

Fortschrittsbalken

Beim Ausführen längerer Abfragen zeigt Access automatisch einen blauen Fortschrittsbalken links unten in der Statuszeile an. Diesen Fortschrittsbalken können Sie mit SysCmd selber erzeugen. Dazu benötigen Sie drei Aufrufe, nämlich den Start, das Weiterzählen und die Entfernung am Ende. Damit der Aufruf übersichtlich bleibt, werden diese Teilaufgaben wie in Listing 2 in Prozeduren gekapselt.

Sub FortschrittStarten(strMeldung As String, _
lngGesamt As Long)
Application.SysCmd acSysCmdInitMeter, _
strMeldung, lngGesamt
End Sub
Sub FortschrittWeiter(lngTeilwert)
Application.SysCmd acSysCmdUpdateMeter, lngTeilwert
End Sub
Sub FortschrittEnde()
Application.SysCmd acSysCmdRemoveMeter
End Sub

In Listing 3 ist mit einer einfachen Schleife zu sehen, wie ein Fortschrittsbalken erzeugt wird. Die Gesamtlänge des Balkens und sein Text müssen bereits beim Start mit angegeben werden. Das bedeutet, dass er für Do-Loop-Schleifen mit ihrer nicht vorhersehbaren Anzahl an Durchläufen ungeeignet ist.

Sub TesteFortschritt()
Dim L As Long
Const conGesamt = 100000
FortschrittStarten "Los gehts!", conGesamt
For L = 1 To conGesamt
FortschrittWeiter L
Next
FortschrittEnde
End Sub

Der angezeigte Text lässt sich außerdem während des Fortschritts nicht mehr ändern, um beispielsweise zugehörige Prozentwerte einzublenden. Es gibt zwar einen Aufruf acSysCmd- SetStatus, der einen Textwechsel ermöglicht (Listing 4), dafür schaltet er aber den blauen Balken aus und flackert ordentlich. Zudem lässt er sich nicht mit den drei anderen Prozeduren kombinieren, sondern setzt diese wieder zurück auf den Anfang. Daher ist es auf jeden Fall sinnvoller, DoCmd.Echo einzusetzen, wenn Sie einen Text in der Statuszeile benötigen.

Sub FortschrittAendern(strMeldung As String)
'eigentlich:
'Application.SysCmd acSysCmdSetStatus, strMeldung
'aber flackerfreier:
DoCmd.Echo True, strMeldung
End Sub
Sub TesteFortschritt2()
Dim L As Long
Const conGesamt = 1000
For L = 1 To conGesamt
FortschrittAendern "Prozent: " & _
Format(L / conGesamt, "0.0%")
Next
End Sub