Herbers Excel-Forum - das Archiv

Ladebalken beim Ausführern längeren VBA-Schritten

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Frame TextBox UserForm
Bild

Betrifft: Ladebalken beim Ausführern längeren VBA-Schritten
von: Ronny

Geschrieben am: 04.01.2007 16:47:58
Hallo Excel-Experten,
ich würde gern einen Ladebalken mir bei einen längeren Prozessschritt der über einen Button gestartet wird anzeigen lassen, der genau wie der Installationsfortschrittsbalken funktioniert, d.h. dass er prozentual und grafisch anzeigt wie lange lange es noch dauert bis der VBA-Schritt kompeltt durchgeführt wurde. Zusätzlich wäre eine Zeiteinschätzung als Angabe ebenfalls günstig (auch bei Installationen oft zu sehen). Ich weis, dass unten links in Excel ein Balken läuft der den Fortschritt anzeigt aber ich möchte gern einen großen wie bei Installationen oft zu sehen in der mitte des Bildschirms sehen. Mein längster VBA-Prozessschritt dauert etwa 1,5 Minuten.
Hat jemand eine Idee wie ich dies einbauen könnte in meinen VBA Code? Bin für jede Hilfe dankbar ^^
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schritten
von: Horst
Geschrieben am: 04.01.2007 16:57:13
Hi,
dazu müsste man den Code kennen.
mfg Horst
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 17:02:56
Hallo Horst,
ist es so kompliziert?
Dieser Code stellt etwa 7 Pivotberichte um auf ein gewünschtes Datum, was vorher ausgewählt wird und dauert beim ausführen bei mir ca. 1,5 Minuten:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
If Not (Target.Address = "$K$3") Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
If Left(ws.Name, 3) = "Tmw" Then
If IsDate(Target.Value) Then
ws.Range("C378").Value = Left(Target.Value, Len(Target.Value) - 3) & ""
Else
ws.Range("C378").Value = Target.Value
End If
End If
Next
ActiveSheet.PivotTables("REA Messwerte").RefreshTable
End Sub

Hilft das weiter?
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Horst
Geschrieben am: 04.01.2007 17:06:47
Hi,
ja, ist etwas kompliziert und auch nicht ganz genau. Am besten, du lädst mal
ein Beispiel hoch, ich versuche dann mal, das zu integrieren.
mfg Horst
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 17:11:29
Hallo Horst,
hier das Bsp.: https://www.herber.de/bbs/user/39038.xls
Dauert natürlich im Bsp. nicht so lange, da einfach die vielen Daten fehlen usw. aber soll ja auch nur ein Bsp sein.
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Horst

Geschrieben am: 04.01.2007 17:20:26
Hi,
den Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
If Not (Target.Address = "$K$3") Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
If Left(ws.Name, 3) = "Tmw" Then
If IsDate(Target.Value) Then
ws.Range("C378").Value = Left(Target.Value, Len(Target.Value) - 3) & ""
Else
ws.Range("C378").Value = Target.Value
End If
End If
Next
ActiveSheet.PivotTables("REA Messwerte").RefreshTable
End Sub

kann ich in der Beispielmappe nicht finden.
mfg Horst
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 18:22:58
Hi Horst,
entschuldige war zwar ein richtiges Bsp aber keins mit Pivottabellen, habe es hier erweitert: https://www.herber.de/bbs/user/39383.xls
Geht wie gesagt rasch in dieser Datei da kaum Daten da sind, aber bei mir dauert dass pro Pivotbericht etwa 13Sekunden (7 Pivotberichte + REA Messwerte Pivotbericht) beim einstellen und aktuallisieren und beim letzten Pivotbericht dann, also die "REA Messwerte" wird dann nur noch aktuallisiert, aber schau doch selbst ^^
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Oberschlumpf

Geschrieben am: 04.01.2007 17:13:21
Hi Ronny
Ist es so kompliziert?
Für dich ist es MIT Code sooo kompliziert, dass du es nicht alleine schaffst.
Wie kannst du dann eine solche Frage stellen - zumal nicht mal Code vorhanden war, an dem ein möglicher Antworter sehen kann, wo er ansetzen könnte????
Außerdem solltest du dir deine Formulierungen VOR dem Abschicken noch mal durchlesen.
Denn zumindest in deiner Anfangsfrage lassen Grammatik und Ausdruck zu wünschen übrig. Von häufigen Tippfehlern ganz zu schweigen.
Denn besonders in einem Forum gilt:
Eine qualifizierte Antwort erwartet eine qualifizierte Frage!
Und die Qualität einer Frage sinkt nun mal durch Grammatik-, Ausdruck-, Tipp-, und allen weiteren möglichen Schreibfehlern ungemein.
Ciao
Thorsten
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 17:25:55
Hallo Thorsten,
hast ja recht, aber hatte leider zu früh auf abschicken geklickt da meine Freundin hier gerade rumsaust und mich immer ablenkt ^^ Gebe mir in Zukunft mehr Mühe ^^
Dass "so kompliziert" meinte ich nicht negativ sondern eher im Sinne von Standardlösung, d.h. ich dachte es gibt da eine Standardprozedur, welche man nur integrieren muss. Doch es scheint komplizierter zu sein ^^ Meine VBA-Kenntnisse sind leider mangelnder Natur und so ziemlich am Anfang ^^
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schritten
von: daniel Eisert

Geschrieben am: 04.01.2007 17:23:31
Hallo
das kommt jetzt darauf an, wie die länge deiner Prozessschritte bestimmt sind,
wenns eine bestimmte Anzahl von Schleifendruchläufen sind, dann kannst du ja ein Rechteck einzeigen, daß bei jedem Schleifendurchlauf anwächst.
vielleicht hilft dir ja das Beispiel weiter.
https://www.herber.de/bbs/user/39382.xls
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 17:36:42
Hi Daniel,
der Balken sieht schonmal gut aus aber % Wert und Zeit fehlen noch. Da der Code letztlich jeweils eine Pivottabelle nach der anderen auf ein Datum einstellt und diese dann aktuallisiert, sind es bei 8 Pivottabellen ca. 13 Sekunden pro Pivottabelle die benötigt werden. Vielleicht kann man ja daraus etwas aufbauen? Die Zeit ist vor allem auch Rechnerabhängig, denn bei nen schwachen Rechner dauert es wesentlich länger bis die Schritte ausgeführt sind. Kann man denn irgendwie eine Zeit schätzen lassen wie dies bei Installation oft gemacht wird?
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eiset

Geschrieben am: 04.01.2007 18:07:36
Hallo
bei 8 Pivot-Tabellen erhöht sich der %-Wert pro Pivot-Tabelle um 12,5%.
Das kannste ja noch irgendwo in ne Textbox oder so reinschreiben (da hilft dir dann aber auch der Makrorekorder weiter)
bei absoluten Zeiten wirds natürlich schwierig, da müsstest du ja noch nen kleinen Benchmark vorschalten, um die Geschwindigkeit des Rechners zu ermitteln, aus der du dann die gesamtlaufzeit schätzen kannst.
Allerdings stellt sich die Frage, wo der Mehrwert für den Nutzer ist, wenn er die Zeit genau weiß. Ein Fortschrittsbalken ist ganz hilfreich, damit man weiß, daß der Rechner nicht abgestürtzt ist, und man in etwa abschätzen kann, wie lange es noch dauert, aber mehr halte ich für überflüssig.
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 18:26:01
Hallo Daniel,
ja der Benchmark würde den aufwand sprengen den das ganze machen soll, eine reine % Angabe wieviel schon erledigt ist von 100% würde reichen. Jedoch muss man dass erstmal auf mein Bsp übertragen ^^ https://www.herber.de/bbs/user/39383.xls Und dass bei meinen sperrlichen VBA-Kenntnissen ist garnicht so einfach ^^
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eisert

Geschrieben am: 04.01.2007 18:39:57
Hallo
1. Frage wo werden den 8 Pivot-Tables refresht, ich seh nur eine und zwar dann, wenn im Sheet REA Messwerte das Datum geändert wird.
2. Frage
ist der rest des Codes von dir? wenn ja, dann darfst du deine VBA-Kenntnisse ruhig etwas höher einstufen.
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 04.01.2007 19:00:18
Hi Daniel,
zu 1.: Richtig es wird nur die letzte aktuallisiert, da die andern beim starten der Datei bereits auf aktuellen Stand gebracht werden. Allerdings hängt da noch viel mehr dran, da jeder Messwert von einem Server abgerufen wird der dies in verschiedenen Archiven abspeichert und für mich selber nur das TageswertArchiv interessant ist. Jedenfalls muss nur die letzte Pivottabelle immer aktuallisiert werden.
zu 2.: Das sind ja mehrere Codes und bei weiten nicht alle in der Bsp.-Datei! Hatte hier bei einigen heiklen Punkten große Hilfe durchs Forum erhalten, so dass ich dabei immer was gelernt habe, aber mir selber nicht alles herleiten bzw. erstellen konnte. Besonders Franz hat sich mit mir viel Mühe gegeben, danke nochmal an dieser Stelle an Franz!
Es sind 800 Messungen bei 365 Tagen mit jeweils einen Korrekturwert verteilt auf die vielen Pivotberichte wegen Spaltenmangel in Excel und somit 584000 Messwerte! Glaub mir dass dauert ^^ Wollte ja ursprünglich mal eine SQL Datenbank dafür aufbauen aber Excel viel mir leichter und ist im Betrieb allen vertrauter, daher hab ich Excel genommen. Die Excel-Datei ist rund 40 MB groß!
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eisert

Geschrieben am: 04.01.2007 19:26:40
Hallo
wenn du einen Balken habenwillst, der sich ändert, während EIN VBA-Befehl abgearbeitet wird (so z.B. REFRESH), dann hast du keine Chance da was zu machen, da müsstest du ja in die interne Programmierung von Excel eingreifen.
Also ich würde einfach nur einen Hinweis einblenden, daß jetzt die Aktualisierung läuft und das es einige Minuten dauern kann (die grobe Zeit kannst du ja abschätzen) und damit hat sichs
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eisert

Geschrieben am: 04.01.2007 19:17:15
Hallo
also ich hab mal versucht, die Balkenanzeige zu integrieren, der Code sieht dann so aus:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
If Not (Target.Address = "$K$4") Then Exit Sub
'    Dim Länge As Single
'    Dim i As Long
'    Dim Anz As Long
'    Dim zeit As Date
'    With ActiveSheet
'        .Shapes("Hülle").Visible = True
'        .Shapes("Überschrift").Visible = True
'        .Shapes("Balken").Visible = True
'        .Shapes("Hintergrund").Visible = True
'    End With
'    Länge = ActiveSheet.Shapes("Hülle").Width
'    Anz = 7
'    ActiveSheet.Shapes("Balken").Width = 0
'   i = 0
For Each ws In ThisWorkbook.Worksheets
If Left(ws.Name, 3) = "Tmw" Then
'           i = i + 1
'           ActiveSheet.Shapes("Balken").Width = Länge * i / Anz
If IsDate(Target.Value) Then
ws.Range("C372").Value = Left(Target.Value, Len(Target.Value) - 3) & ""
Else
ws.Range("C372").Value = Target.Value
End If
End If
Next
'   i = i + 1
'   ActiveSheet.Shapes("Balken").Width = Länge * i / Anz
ActiveSheet.PivotTables("REA Messwerte").RefreshTable
'With ActiveSheet
'    .Shapes("Hülle").Visible = False
'    .Shapes("Überschrift").Visible = False
'    .Shapes("Balken").Visible = False
'    .Shapes("Hintergrund").Visible = False
'End With
End Sub

die von mir eingefügten Bestandteile habe ich zu kennzeichnung auskommentiert, dh. wenn du damit arbeiten willst, mußt du die Hochkommas entfernen.
desweiteren musst du die Grafikelemente noch von Hand in deine Datei einfügen und ihnen die gleichen Namen geben, wie sie auch im Code verwendet werden.
Am einfachsten kopierst du sie aus meiner Beispieldatei raus. dazu im Code den letzten Withblock löschen (da wo visible = false gestetzt wird) und den code einmal laufen lassen. dann kannst du die Elemente in deine Datei kopieren
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny
Geschrieben am: 04.01.2007 19:21:03
Hallo Daniel,
ich werde das morgen auf Arbeit an meiner großen Datei testen, sieht vielversprechend aus ^^
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 05.01.2007 09:35:38
Hallo Daniel,
also die Lösung funktioniert gut, aber ein Prozentwert möchte ich gern noch anzeigen lassen. Am besten jeden Schritt mit 12,5% bewerten und dies bis 100% steigern. Benötige ich dafür eine extra Box? und wie muss ich dass in den Code noch einbinden? Meine Versuche sind leider noch fruchtlos in dieser Richtung.
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eisert

Geschrieben am: 05.01.2007 12:37:11
Hallo
dann füge mal diese Codezeile ein, und zwar jedesmal direkt nachdem die Balkenlänge verändert wird:
ActiveSheet.Shapes("Balken").TextFrame.Characters.Text = Format(i / Anz, "0%")
Die formatierung (Farbe, Ausrichtung) musst du wieder von Hand direkt am Objekt machen.
Wichtig ist, daß die Variable ANZ die richtige Anzahl enthält.
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 07.01.2007 15:59:14
Hallo Daniel,
tja erst schien es zu gehen ohne Prozentanzeige, doch nun ohne dass ich eine Veränderung am Code vorgenommen habe wird mir der Balken und die andern Shapes erst angezeigt nachdem alle Pivotberichte auf das Datum eingestellt wurden und lädt dann sichtbar nur den letzten Balken noch voll wenn die REA Messwerte Pivottabelle aktualisiert wird. Wo liegt der Fehler`?
Ich betone, die Prozentanzeige habe ich noch nicht integriert weil ich meinte, dass dieses Problem erstmal behoben werden muss.
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: daniel eisert

Geschrieben am: 07.01.2007 17:06:40
hallo
hab leider auch keine Ahnung, woran das liegen könnte.
Bau mal zum Testen nach jeder Balkenverßerung eine MSGBOX ein, dann hält das Makro an und du siehts, ob er auch tatsächlich was macht.
vielleicht hilft auch nach jedem Ändern ein Application.Screenupdating = true oder was ähnliche, was den Bildschirm neu aufbaut.
aber wie gesgt, das sind nur vermutungen von mir.
Gruß, Daniel
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Ronny

Geschrieben am: 08.01.2007 00:45:59
Hallo Daniel,
also das Application.Screenupdating = true funktioniert und löst schonmal das Probelm mit der Anzeige der Balkenveränderung. Danke für den guten Tip!
Habe dann deine Prozentzeile eingefügt wie du angegeben hattest und das ganze durchlaufen lassen. Nun wird der Prozentwert richtig gezählt und angezeigt, daher auch hier danke für deine gute Idee ^^
Optische Verschönerung:
Ich würde mir nur noch eine optische Verschönerung wünschen. Zur Zeit ist der Prozentfortschritt so definiert, dass dieser immer Stück für Stück mitrückt bis zur Mitte (zentriert eingestellt) und dann dort stehen bleibt wenn der Balken voll ist bei 100%. Nun habe ich noch das Wort "abgeschlossen" hinter dem %-Zeichen eingefügt und am Anfang wird ein Teil dieses Wortes wie beim Zeilenumbruch einfach nach unten geworfen, da der Balken ja noch wächst bevor es in der selben Zeile komplett dargestellt werden kann. Daher würde ich es begrüßen, wenn der %-Wert + "% abgeschlossen" immer vertikal und horizontal zentriert im Hintergrund stehen, ohne sich mitzubewegen wenn der Balken läuft. Natürlich soll der %-Wert aber weiter ansteigen!
Hast hier nochmal einen heißen Tip für mich bitte?
Gruß,
Ronny
Bild

Betrifft: AW: Ladebalken beim Ausführern längeren VBA-Schrit
von: Daniel Eisert

Geschrieben am: 08.01.2007 13:28:47
Hallo
dazu müsstest du eine zusätzliche Textbox erstellen ohne Hintergrundfarbe und die im Vordergrund liegt.
in diese schreibst du dann deinen Text rein
ggf solltest du dann für den Balken ein hellers Blau wählen.
das Makro muß dann an der Stelle wo die Felder ein- und ausgeblendet werden entsprechend erweitert werden.
Gruß, Daniel
ps. der einfachst Weg, einem Shape einen Namen zu vergeben ist, diesen anzuklicken und dann den Namen in das kleine Eingabefeld oben links reinzuschreiben wo sonst die Adresse der aktiven Zelle drinsteht.
Gruß, Daniel
Bild

Betrifft: Warum denn so kompliziert ...
von: Ramses

Geschrieben am: 04.01.2007 19:02:32
Hallo
Wenn es nur um eine Nutzerinformation geht, dann sollte die Ausgabe in der Statuszeile doch reichen
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim prozWert as Double
prozWert = 12.5
If Not (Target.Address = "$K$3") Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
Application.Statusbar = "Total erledigte Tabellen: " &  prozWert & "%
prozWert = prozWert + 12.5
If Left(ws.Name, 3) = "Tmw" Then
If IsDate(Target.Value) Then
ws.Range("C378").Value = Left(Target.Value, Len(Target.Value) - 3) & ""
Else
ws.Range("C378").Value = Target.Value
End If
End If
Next
ActiveSheet.PivotTables("REA Messwerte").RefreshTable
Application.Statusbar = False
End Sub

Gruss Rainer
Bild

Betrifft: AW: Warum denn so kompliziert ...
von: Ronny

Geschrieben am: 04.01.2007 19:12:02
Hi Rainer,
am Ende sollen Mitarbeiter das ganze bedienen, die Excel nicht aus den FF kennen und übersichtlich sehen wie lange dieser Vorgang noch Zeit in Anspruch nimmt. Für mich selber reicht die Statusleiste vollkommen aus, aber für den Endbenutzer ist sie nicht optimal wie ich festgestellt habe. Musste die Leute immer darauf hinweisen so lange zu warten bis der Vorgang abgeschlossen ist und in diese Leiste zu schauen. Ein großer Fortschrittsbalken in der Mitte mit %-Angabe wäre also optimaler!
Gruß,
Ronny
Bild

Betrifft: AW: Warum denn so kompliziert ...
von: Ramses

Geschrieben am: 04.01.2007 21:11:41
Hallo
dann erstell dir eine Userform mit einer Progressbar.
Die Progressbar kannst du dann mit den WErten füllen.
Wenn keine Progressbar, dann eine Userform mit 8 disableden blauen Textboxen.
Alle auf "Nicht sichtbar" setzen und dann in jeder Schleife eine Textbox sichtbar machen.
Zum Schluss die UF schliessen.
Fertig
Gruss Rainer
 Bild