Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
148to152
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
148to152
148to152
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

ProgressBar

ProgressBar
15.08.2002 12:20:28
Ingo
Hallo,
ich will während eines längeren rechenprozesses gerne eine ProgressBar anzeigen lassen. ich hab ein wenig gestöbert und probiert, wobei ich auf diesen Ansatz kam:

UserForm1.Show
With ProgressBar1
Dim dblRow As Double
Application.ScreenUpdating = False
UserForm1.Caption = "Bitte warten..."
For dblRow = 1 To 10000
If dblRow Mod 10 = 0 Then
ProgressBar1.Width = 222 * (dblRow / 10000)
ProgressBar1.Caption = Format(dblRow / 10000, "0%")
DoEvents
End If
Cells(dblRow, 1) = "Zeile " & dblRow
Next dblRow
Cells.ClearContents
Unload Me
End With

Leider funzts net. in der zeile nach if stoppt er und sagt "objekt erforderlich"!?
auch weiß ich net so recht wo dann der restliche code rein muß, damit der parallel bearbeitet wird.

bitte helft mir,
ingo

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: ProgressBar
15.08.2002 14:05:17
Ingo
hallo mathias,
danke, hatte ich nicht entdeckt.
kannst du mir noch ein wenig weiterhelfen?

Des läuft jetzt net mit einer progressbar, sondern mit rahmen?
soll heißen, ich kann meine progressbar rauslöschen, oder soll ich sie anstelle des hintergrundrahmens nehmen?

ich habe jetzt also die vier Codes im modul. hier gehts los hab ich mit dem button verlinkt. bei frmPB.show gabs nen fehler, also habe ich userform show gemacht. er blendet dann die uf ein und is fertig!?
Sub HierGehtsLos()
Sub startLangesMakro()
Sub initPB(lTotalSteps As Long)
Sub refreshPB()

irgendwie blick ich des noch net ganz...

Anzeige
Re: ProgressBar
15.08.2002 14:23:44
mathias r.
Wenn du die original Progressbar nimmst, gibt es evtl. das Problem, das die nicht auf jedem Rechner regestriert/lizensiert ist. Wenn du diese selbst zur Verfügung hast, liegts daran das du a)Visual Basic oder b) Office Developer Edition installiert hast.
(Bin nicht sicher ob die bei "Standard" Office 2000 auch dabei ist, glaube aber eher nicht?)
Das dazu.
Unabhängig wie du es machst, eine Userform(UF) brauchst du ja sowieso. Der "Trick" ist nun, das beim Aufruf der UF (Userform_Activate) dein Makro aufrufst. Innerhalb deines Makros rufst du dann an geeigneter Stelle jeweils refreshPB auf.
Warum?
Wenn man nur die UF aufruft läuft der Code ja erst weiter wenn die UF wieder geschlossen wird. Also muß di UF selbst deine Routine aufrufen.
Anzeige
Re: ProgressBar
15.08.2002 14:45:37
Ingo
Beginne zu verstehen...
Also:

Sub HierGehtsLos()
UserForm1.Show
DoEvents
End Sub

ruft die uf auf. das doevents veranlaßt dann den ablauf des in der uf hinterlegten makros:

Private Sub UserForm1_Activate()
Call startLangesMakro
Unload Me
End Sub

hier wird festgelegt, daß die uf verschwindet, nachdem upr startlangesmakro ausgeführt wurde.
soll heißen in dieses muß auch mein eigentliches makro rein.
das andere upr dient dem "aufbau des Balkens":

Sub initPB(lTotalSteps As Long)
With frmPB
.PBx.Width = 0
mfStep = .PB100.Width / lTotalSteps
End With
End Sub

d.h. statt lTotalSteps schreib ich einfach eine zahl zwischen 1 und 100, diese gibt die schrittbrreite an!?
jetzt bleibt nur noch der eigentlich kern, hier muß ja dann irgendwo der relevante code rein...:

Sub startLangesMakro()
Dim i As Integer
Call initPB(2000)
For i = 1 To 2000
Sheets(1).Range("a1") = i
Call refreshPB
Next
End Sub

wo genau soll das rein, und vorallem, Sheets(1).Range("a1") = i is ja schön, aber der soll ja nett in meine tabellenblätter schreiben!?

liege ich soweit richtig? und was muß ich jetzt noch änder?
Vielen Dank,
Gruß
Ingo

Anzeige
Re: ProgressBar
15.08.2002 16:21:44
mathias r.
Ja schon ganz richtig...
als lTotalsTeps ist der Wert zu verstehen, wie oft der Code ausgeführt wird den du in der Progressbar darstellen willst.
Dafür muß man natürlich wissen wie oft der Code durchlaufen wird.
Im Beispiel ist dies 2000mal -> Call initPB(2000)
Also jede PB-Aktualisierung vergrößert den Balken um ein 1/2000 der Gesamtbreite des Balkens.

"-----"
Sub HierGehtsLos()
UserForm1.Show
DoEvents
End Sub

ruft die uf auf. das doevents veranlaßt dann den ablauf des in der uf hinterlegten makros:

Nicht ganz. Das Makro läuft auch ohne DoEvents. Nehme an ich habe es damals hingeschrieben, damit nach Beendigung der Prozeduren die UF vom Bildschirm verschwindet. Sonst kann es u.U. dazu kommen das der Bildschirm nicht aktualisiert wird.
"----"

"---"
wo genau soll das rein, und vorallem, Sheets(1).Range("a1") = i is ja schön, aber der soll ja nett in meine tabellenblätter schreiben!?

Das Schreiben in die Zelle demonstriert nur den Code der lange dauert. Hier muß dann dein Code hin, bzw. deine Prozedur anstatt "startLangesMakro" aufgerufen werden. Innerhalb deiner Prozedur (wahrscheinlich enthält sie eine For Next-Schleife?) kommt dann in die Schleife "Call refreshPB"
"---"

Anzeige
Re: ProgressBar
15.08.2002 16:48:49
Ingo
danke,
habe soweit alles kapiert, und auch schon hingepfriemelt... hab mich nur grad selber ausgetrickst... mache im Makro eine printpreview und habe die uf vorher net ausgeblendet.. da bleibter stehen und macht nix mehr... *grrr*
jetzt hab ich nur noch ne abschließende Frage:
ich habe mehrere if-abfragen die jeweils mit schleifen bestückt sind. also werde ich bei jedem if in jede schleife ein refresh setzen, damit schön mitaktualisiert wird. allerdings dauern die einzelnen schleifen ja nicht gleich lang... habe ich dann einen unterschiedlich schnell wachsenden balken?
kann man das simpel umgehen, oder wirds dann noch komplizierter?
vielen Dank,
ingo
Anzeige
Re: ProgressBar
15.08.2002 17:36:52
mathias r.
Das der Blaken unterschiedlich schnell wächst ist ja okay (Kennt man ja... 99% ist nach 3 Sek, erreicht, der restliche 1% dauert 1Minute) ;-)
Interessant wird es, wenn aufgrund der IF-Bedingung eine Schleife gar nicht durchluafen wird.
Lösung:
Wenns geht, die maximalen Schritte jeder Schleife zusammenzählen.
Das ergibt dann die Schrittweite.
Nach jeder IF-Abfrage setzt du dann einfach den Balken auf den entsprechenden Wert, der erreicht werden würde wenn die Schleife durchlaufen wird.
Fazit: Entweder die Schleife selbst hat den PB auf die Balkenbreit gesetzt oder der Befehl nach der Schleife.
Wurde die Schleife durchlaufen, setzt der Befehl also nochmal den gleichen Wert, wenn nicht, "springt" die PB trotzdem weiter als wenn die Schleife durchlaufen wäre.
Alle Klarheiten beseitigt?
Anzeige
jetzt is schluß...
15.08.2002 17:55:40
Ingo
Super, danke,
es läuft wie ichs will und das mit den schleifen geht auch. habs grad nochma getestet, macht echt sinn. bin begeistert..
so jetzt mach ich feierabend...
gruß und danke,
Ingo

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige