wie kann ich eine Progressbar nicht vor der eigentlichen Routine, sondern erst aus der laufenden Routine heraus starten?
Danke für die Hilfe
Lutz
Sub Progressbar1()
Dim SW As Long
Dim i As Long
Dim Schritt
Dim Länge
PB1.Show 0
SW = 3005
Länge = 0
Schritt = PB1.Label1.Width / SW
For i = 11 To SW
Cells(i, 25) = "Zeile " & i
Cells(i, 25).Interior.ColorIndex = 6
Länge = Länge + Schritt
PB1.Label2.Width = Länge
PB1.Label3.Caption = Format(i / SW, "0 %")
DoEvents
Next
Application.Wait (Now + TimeValue("0:00:2"))
Unload PB1
End Sub
den weiteren Code, der direkt der Progressbar zugeordnet ist, bitte löschen, dieses Makro reicht.
allerdings muss ich Horst recht geben, bei halbwegs intelligenter Programmierung wird die Progressbar obsolet:
Sub Progressbar2()
SW = 3005
With Cells(11, 25).Resize(SW - 10, 1)
.FormulaLocal = "=""Zeile ""&Zeile()"
.Formula = .Value
.Interior.ColorIndex = 6
End With
Gruß, Daniel
Private Sub CommandButton1_Click()
Call Makro1 'diverse Codezeilen
PB1.Show
Call Makro2 'diverse Codezeilen
End Sub
Gruß Tino
Sub Progressbar1()
Call Makro1 'diverse Codezeilen
SW = 3005
Länge = 0
Schritt = PB1.Label1.Width / SW
For i = 11 To SW
Cells(i, 25) = "Zeile " & i
Cells(i, 25).Interior.ColorIndex = 6
Länge = Länge + Schritt
PB1.Label2.Width = Länge
PB1.Label3.Caption = Format(i / SW, "0 %")
PB1.Repaint
Next
Call Makro2 'diverse Codezeilen
Application.Wait (Now + TimeValue("0:00:2"))
Unload PB1
End Sub
Gruß Tino
Sub Progressbar(Erfüllungsgrad As Double, Optional Segmente As Integer = 10)
Dim Anz1 As Integer
Dim Anz2 As Integer
Select Case Erfüllungsgrad
Case 0
Application.StatusBar = False
Case Else
With WorksheetFunction
Erfüllungsgrad = .Min(Erfüllungsgrad, 1)
Anz1 = Round(Erfüllungsgrad * Segmente, 0)
Anz2 = Segmente - Anz1
Application.StatusBar = .Rept(ChrW(9679), Anz1) & .Rept(ChrW(3664), Anz2)
End With
End Select
End Sub
der Erfüllungsgrad ist ein Wert von 0-1 (1 = 100% erfüllung), die Segmentanzahl kannst du beliebig von 1-x wählen, halt soviele Zeichen wie in die Statuszeile reinpassen.
zum Aktualisieren rufts du einfach das Makro auf, z.b. so:
Sub Test
dim x as long
for x = 1 to 10000
Cells(x, 1).Value = "Zeile " & x
Call Progressbar(x/10000, 100)
next
call Progressbar(0)
End Sub
mit Call Progessbar(0) wird die Statuszeile wieder für die normalen Excelmeldungen freigegeben.
Gruß, Daniel
ps leider ist die Statuszeile nur mit der Schriftart Tahoma formatierbar, daher ist es nicht ganz so leicht, passende Zeichen zu finden.