Fortschrittsanzeige

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm Label MessageBox MsgBox
Bild

Betrifft: Fortschrittsanzeige
von: Russi
Geschrieben am: 13.11.2003 14:56:06

Hallo Leute!

Ich füge per VBA hunterte von Formeln in ein Tabellenblatt ein mit dem Erfolg, dass Excel nach beendetem Makro erstmal ca. 80 Sek. im Hintergrund mit Rechnen beschäftigt ist.

Da ich die Datei selbst erstellt habe weiß ich natürlich, was Excel da tut. Aber andere Anwender werden sicherlich etwas irritiert sein, wenn Excel sich so lange "tot stellt".

Gibt es eine Möglichkeit, während der Neuberechnung der Tabellenblätter eine Msgbox oder sogar eine Fortschrittsanzeige anzeigen zu lassen?!?

Russi

Bild


Betrifft: AW: Fortschrittsanzeige
von: Martin
Geschrieben am: 13.11.2003 15:39:35

Hallo Russi,

eine Fortschrittsanzeige ist komplex. Ausserdem hat sie den Nachteil, dass du vorher wissen musst, wie lange der Prozess dauert, da du sie anpassen musst. Eine Alternative wäre eine Userform. Am besten ein Label, das vor dem Berechnen geladen und am Ende wieder geschlossen wird. Der Vorteil von Userformen ist, dass Prozesse im Hintergrund weiterlaufen im Gegensatz zu Messageboxen.

Gruss,
Martin


Bild


Betrifft: AW: Fortschrittsanzeige
von: Russi
Geschrieben am: 13.11.2003 15:43:33

Hallo Martin!

Danke für den Tip! Ich will nicht unverschämt sein, aber könntest Du mir kurz skizzieren, wie ich so ein Label einbinde? Ich habe sowas noch nie gemacht...

Gibt es sowas wie ein "WhileCalculating"-Ereignis, das ich abfragen kann?

Russi


Bild


Betrifft: AW: Fortschrittsanzeige
von: Carsten
Geschrieben am: 14.11.2003 08:04:35

Hallo Martin,

schau aml auf die Seite von John Walkenbach. Da ist ein gutes Beispiel!

http://www.j-walk.com/

Gruß,

Carsten


Bild


Betrifft: AW: Fortschrittsanzeige
von: Russi
Geschrieben am: 14.11.2003 08:46:20

Werde ich tun! Vielen Dank für den Tip!

Russi


Bild


Betrifft: AW: Fortschrittsanzeige
von: Carsten
Geschrieben am: 14.11.2003 11:36:42

Hier findest Du das Beispiel,
(hatte vorhin nur die allgemeine Adresse angegeben.)

http://j-walk.com/ss/excel/tips/tip34.htm


Bild


Betrifft: AW: Fortschrittsanzeige
von: Russi
Geschrieben am: 14.11.2003 11:39:53

Hallo Carsten!

So hatte ich Gelegenheit, mir die ganze Seiten einmal anzugucken. Kannte ich noch nicht, die Adresse. Sind ja interessante Dinge dabei!

Russi


Bild


Betrifft: Frage nochmal...
von: Russi
Geschrieben am: 14.11.2003 15:29:20

Hallo Carsten!

Ich habe das Beispiel einmal nachvollzogen, funktioniert alles erstklassig.

In meinem Projekt hätte ich aber gerne eine Fortschrittsanzeige (oder zumindest eine Meldung "Berechnung läuft" oder sowas) für ein Makro, welches aus nur ein paar Zeilen OHNE Schleife besteht.

Die erste Zeile des Tabellenblattes wird mit Formeln gefüllt und dann wird die Seite per Selection.Filldown nach unten ausgefüllt.

Die anschließende Berechnung der Zellen dauert ewig. Deshalb sollte hier eine Meldung angezeigt werden.

Hast Du dazu vielleicht noch eine Idee?!?

Russi


Bild


Betrifft: AW: Frage nochmal...
von: Carsten
Geschrieben am: 14.11.2003 20:12:33

Hallo Russi,

wär das nichts für die Statusbar. Dort könnte man so einen Hinweis gut unterbringen.

Schau mal in der Recherche und Excel-FAQ. Wenn Du nicht wieterkommst, stell mal eine Beispielmappe online. Es wird sich schon was finden!

Gruß,

Carsten


Bild


Betrifft: AW: Frage nochmal...
von: Russi
Geschrieben am: 17.11.2003 07:55:58

Moin Carsten!

Hab mal recherchiert. Aber alle Lösungen zielen darauf ab, während eines MAKROLAUFES einen Hinweis anzuzeigen. Mein Hinweis soll vor oder nach Makrostart erfolgen (soweit selbstverständlich kein Problem) und andauern, bis Excel alle Berechnungen abgeschlossen hat (das Makro wird schon lange vorher beendet).

Mein Code sieht so aus:

With Tabelle1 ' Erste Zeile mit Formeln füllen
.Activate
.Range("N2").Formula = "=R2+V2"
.Range("O2").Formula = "=S2+W2"
.Range("P2").Formula = "=IF(RC[-1]>0,RC[-1]/RC[-2],""0%"")"
.Range("Q2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""KV""))"
.Range("R2").Formula = "=SUMPRODUCT((Tbelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""KV"")*(Tabelle2!R2C17:R2000C17>0))"
.Range("S2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C19:R2000C19)"
.Range("T2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C18:R2000C18)"
.Range("U2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""LV""))"
.Range("V2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""LV"")*(Tabelle2!R2C17:R2000C17>0))"
.Range("W2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C21:R2000C21)"
.Range("X2").Formula = "=SUMIF(Verteilung!R2C3:R2000C3,RC4,Tabelle2!R2C20:R2000C20)"
End With

Tabelle1.Range("N2:X2000").Select
Selection.FillDown

Nach dem letzten Befehl ist Excel natürlich erstmal beschäftigt.

Und damit ein DAU (bekannt, oder? "Dümmster Anzunehmender User") nicht wild auf Escape rumhackt, weil er denkt, da passiert eh nix mehr, möchte ich während der Zeit der Berechnung eine Meldung ausgeben. Das Makro selbst ist ja zu diesem Zeitpunkt schon lange beendet.

Außerdem ist es wichtig, dass der Anwender während der Berechnung nicht weiterarbeiten kann, da alle weiteren Makros auf die Ergebnisse der o.a. Formeln angewiesen sind.

Aber dafür habe ich noch keine Lösung gefunden. Früher gab es meiner Meinung nach mal eine Option "Berechnen im Hintergrund", die man deaktivieren konnte. Sowas würde mir ja schon helfen...

Russi


Bild


Betrifft: AW: Frage nochmal...
von: Carsten
Geschrieben am: 17.11.2003 14:24:06

Hallo Russi,

sorry das ich mich erst jetzt melde!

Probier doch mal bitte folgenden Code (habe ihn nicht getestet), vielleicht lüft das Makro dann schneller. Berechnung und Bildschirmaktualisierung werden ausgeschaltet.

Dim Berechnung
Berechnung = Application.Calculation
Application.Calculation = xlManual
Application.ScreenUpdating = False

With Tabelle1 ' Erste Zeile mit Formeln füllen

.Activate
.Range("N2").Formula = "=R2+V2"
.Range("O2").Formula = "=S2+W2"
.Range("P2").Formula = "=IF(RC[-1]>0,RC[-1]/RC[-2],""0%"")"
.Range("Q2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""KV""))"
.Range("R2").Formula = "=SUMPRODUCT((Tbelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""KV"")*(Tabelle2!R2C17:R2000C17>0))"
.Range("S2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C19:R2000C19)"
.Range("T2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C18:R2000C18)"
.Range("U2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""LV""))"
.Range("V2").Formula = "=SUMPRODUCT((Tabelle2!R2C3:R2000C3=RC4)*(LEFT(Tabelle2!R2C9:R2000C9,2)=""LV"")*(Tabelle2!R2C17:R2000C17>0))"
.Range("W2").Formula = "=SUMIF(Tabelle2!R2C3:R2000C3,RC4,Tabelle2!R2C21:R2000C21)"
.Range("X2").Formula = "=SUMIF(Verteilung!R2C3:R2000C3,RC4,Tabelle2!R2C20:R2000C20)"
End With

Tabelle1.Range("N2:X2000").FillDown

Application.Calculation = Berechnung
Application.ScreenUpdating = True

Gruß,

Carsten


Bild


Betrifft: Frage erledigt...
von: Russi
Geschrieben am: 17.11.2003 14:31:40

Hallo Carsten!

Sorry, aber das isses auch nicht. Die Excel-Berechnung auf manuell zu stellen bringt mir nichts, da ich mit der Ergebnissen der Berechnungen arbeiten muss.

Reinhard hatte eine Idee mit einer Schleife statt einfachem Filldown. Da bastel ich zur Zeit an einer ProgressBar rum (und mache sogar mal wieder Fortschritte! ;-) )

Danke für Deine Mühe!!!

Russi


Bild


Betrifft: AW: Frage nochmal...
von: Reinhard
Geschrieben am: 17.11.2003 09:58:17

Hi Russi,
ich hatte mir das Beispiel nicht angesehen, aber nehme an, es wertet die Anzahl von Schleifendurchgängen aus um daraus eine Fortschrittsanzeige zu erstellen.
Bei deinem Makro dauern ja scheinbar nur die Zeilen
Tabelle1.Range("N2:X2000").Select
Selection.filldown
lange. Bau das doch zu ner Schleife um.

For x= 78 to 87 '78=N,87=W
   Tabelle1.Range(chr(x) & "2:" & chr(x+1) & "2000").Select
   Selection.filldown
next x


Gruß
Reinhard
ps:ungetestet da kaum zeit heute morgen, deshalb teste mal ob
Tabelle1.Range(chr(x) & "2:" & chr(x+1) & "2000").filldown
auch funktioniert.


Bild


Betrifft: AW: Frage nochmal...
von: Russi
Geschrieben am: 17.11.2003 10:03:44

Hallo Reinhard!

Eigentlich wollte ich eine Schleife vermeiden, da Schleifen dieser Größenordnung das Makro insgesamt erheblich ausbremsen. Aber es scheint die einzige Lösung zu sein...

Vielen Dank für den Tip!!! Ich werds wohl so machen.

Viele Grüße

Russi


Bild


Betrifft: AW: Frage nochmal...
von: Russi
Geschrieben am: 17.11.2003 10:04:21

Hallo Reinhard!

Eigentlich wollte ich eine Schleife vermeiden, da Schleifen dieser Größenordnung das Makro insgesamt erheblich ausbremsen. Aber es scheint die einzige Lösung zu sein...

Vielen Dank für den Tip!!! Ich werds wohl so machen.

Viele Grüße

Russi


Bild

Beiträge aus den Excel-Beispielen zum Thema " Fortschrittsanzeige"