... und da habe ich keine Ahnung
Hallo Niclaus,
du verwendest den Fortschrittsbalken in der StatusBar? Das finde ich richtig interessant. Wie geht das? Das habe ich noch nie gemacht. keine Ahnung.
Zum Thema "Fortschrittsbalken ohne Schleifen": Ich hatte mal eine Anfrage, wo der Fortschrittsbalken möglichst "zeitecht" sein sollte (ohen Schleifen). Ich habe dann erst mal versucht, rauszufinden, wie lange der Makro für einzelne Teile braucht. Dafür habe ich die Windows API Funktion GetTickCount benutzt. Sie gibt die Zeit seit dem Rechnerstart in Millisekunden aus. Damit kann man also berechnen, wieviel Zeit ein bestimmter Teil eine Makros braucht. Hier mal Pseudocode für einen Makro ohne Schleifen:
Code:
Public Declare PtrSafe Function GetTickCount Lib "kernel32.dll" () As Long
Sub ZeitTesten
Dim jetzt As Long
Dim zeit1 as Long
Dim zeit2 as Long
Dim zeit 3 as Long
jetzt = GetTickCount
' Hier läuft Teil 1 des Makros
zeit1=GetTickCount - jetzt
' Hier läuft Teil 2 des Makros
zeit2 = GetTickCount - zeit1
' Hier läuft Teil 3 des Makros
zeit3 = GetTickCount - zeit2
End Sub
Wir haben also jetzt 3 Zeiten (in ms) für die 3 Teile des Makros.
Auf eine Userform (nennen wir sie "UserForm1") setzen wir einen Forschrittsbalken. Dieser ist in der Liste der Steuerelemente anfangs nicht vorhanden. Mach einen Rechtsklick auf die Steuerelemente-Toolbox und klicke "Zusätzliche Steuerelemente".
Dann kreuze in der Liste "Microsoft ProgressBar Contol, version 6.0" an und klicke OK.
Jetzt kannst du den Fortschrittsbalken auf deine UserForm ziehen.
Nun addiere die 3 Zeiten zeit1, zeit2 und zeit3 aus deinem Code und setzte die Summe als Max-Wert des Fortschrittsbalkens auf deiner UserForm ein.
Jetzt kannst du deinen Code noch erweitern:
Code:
Public Declare PtrSafe Function GetTickCount Lib "kernel32.dll" () As Long
Sub ZeitTesten
Dim jetzt As Long
Dim zeit1 as Long
Dim zeit2 as Long
Dim zeit 3 as Long
jetzt = GetTickCount
UserForm1.ProgressBar.Value = 0
' Hier läuft Teil 1 des Makros
zeit1=GetTickCount - jetzt
UserForm1.Progressbar.Value = zeit1
' Hier läuft Teil 2 des Makros
zeit2 = GetTickCount - zeit1
UserForm1.Progressbar.Value = zeit1 + zeit2
' Hier läuft Teil 3 des Makros
zeit3 = GetTickCount - zeit2
UserForm1.Progressbar.Value = zeit1 + zeit2 + zeit3
End Sub
In deinem eingetlichen Code musst du also zu Anfang die Userform1 anzeigen lassen:
UserForm1.Show vbModeless
vbModeless ist eine VBA-Konstante (0), die angibt, dass die UserForm quasi als eigene Instanz läuft. D.h., die UserForm wird angezeigt, aber der Makro läuft trotzdem weiter. Lässt man das "vbModeless" weg, würde die UserForm auch erscheinen. Der Makro läuft aber erste weiter, wenn die UserForm wieder geschlossen wird.
Mit vbModeless läuft also der Makro weiter.
Wenn er dann an die Zeile "UserForm1.Progressbar.Value = zeit1" kommt, wird der Fortschrittsbalken aktualisiert, und zwar genau mit dem Wert, den der Makro bis dahin an Zeit gebraucht hat.
Usw., bis er beim Maximalwert angekommen ist.
Wenn man also im Test mal mit der Windows API GetTickCount die Zeiten ausgemessen hat, die der Makro für bestimmte Teile braucht, kann man den Fortschrittsbalken recht genaue Zeiten anzeigen lassen.
Ich hoffe, das war jetz nicht zu kryptisch und kompliziert. Melde dich, wenns noch weitere Fragen gibt.
Grüße und einen schönen Abend,
Andreas