Hallo zusammen,
ich habe mir ein kleines Excel-Makro (Excel XP, VBA6) erstellt, mit dem ich ein paar Daten in eine bestimmte Excel-Tabelle laden kann. Ich habe es so gemacht, dass dem Anwender ein Fenster angezeigt wird, in dem er sieht, dass er sich etwas gedulden muss.
Der Hauptquellcode ist also in dem Fenster unter „Private Sub UserForm_Activate()“ abgelegt. Es verläuft also so: User drückt einen Button --> Button startet das UserForm --> UserForm startet die Aufgabe.
Leider ist es in den meisten Fällen so, dass das UserForm während des Vorgangs nicht wie gewünscht anzeigt, dass der Nutzer einen Moment waren soll, sondern es bleibt einfach weiß.
http://mitglied.multimania.de/mrmic3000/nickles/Fenster_leer.JPG
Randbemerkung: Füge ich eine MsgBox(„Hallo“) ein, zeigt das UserForm das an, was es soll. Ich nehme an, dass das daran liegt, dass das Programm einen Moment pausiert.
Ich habe daraufhin folgende Idee aus dem Internet erfolglos ausprobiert:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub UserForm_Activate()
Sleep 100
[… meine Funktionen …]
End Sub
Hat jemand von euch eine Idee, wie man dieses Problem abstellen kann?
Vielen Dank im Voraus!
Grüße,
Mic2004.
Office - Word, Excel und Co. 9.753 Themen, 41.598 Beiträge
Randbemerkung: Füge ich eine MsgBox(„Hallo“) ein, zeigt das UserForm das an, was es soll. Ich nehme an, dass das daran liegt, dass das Programm einen Moment pausiert.
richtig.
Hat jemand von euch eine Idee, wie man dieses Problem abstellen kann?
yo: schmeiss das Sleep... raus und füge in sinnvollen Abständen ein
DoEvents
hinzu.
Das ermöglicht dem System, anstehende andere Aufgaben abzuarbeiten - eben auch, dein Textfeld o.ä. zu aktualisieren.
Wo du das jetzt einsetzt und wie oft, musst du ausprobieren.
Volker
richtig.
Hat jemand von euch eine Idee, wie man dieses Problem abstellen kann?
yo: schmeiss das Sleep... raus und füge in sinnvollen Abständen ein
DoEvents
hinzu.
Das ermöglicht dem System, anstehende andere Aufgaben abzuarbeiten - eben auch, dein Textfeld o.ä. zu aktualisieren.
Wo du das jetzt einsetzt und wie oft, musst du ausprobieren.
Volker
Hey,
danke für den Tipp. Das ist glaube ich die beste Lösung. Vorher hatte ich einen "Wait"-Befehl, der anders als die Sleep-Funktion den Sub nicht unterbricht sondern im Hintergrund weiter arbeiten lässt. Da musste ich aber mindestens eine Sekunde warten.
[...]
Wait 1
[...]
Welchen Einfluss hat DoEvents auf meine Sub? Erkaufe ich mir dadurch andere Probleme oder kann ich es theoretisch beliebig oft einbauen? Was genau passiert, wenn die Sub in den Befehl DoEvents hinein läuft?
Grüße und danke,
Mic2004.
Welchen Einfluss hat DoEvents auf meine Sub? Erkaufe ich mir dadurch andere Probleme oder kann ich es theoretisch beliebig oft einbauen? Was genau passiert, wenn die Sub in den Befehl DoEvents hinein läuft?
Den DoEvents kannst du theoretisch beliebig oft einfügen - ich habe, allerdings in einer Access-DB - eine Prozedur, in der er insgesamt 8 mal steht - und zwar immer jeweils nach einer länger dauernden Abfrage bzw. einem länger dauernden Export per DoCmd.Transferspreadsheet.
Sinn des ganznez: er soll ermöglichen, dass ein großes Textfeld, das mir als eine Art Logfenster dient, auch aktualisiert wird. Ohne die "DoEvents" dazwischen bliebe das Feld weiss und würde erst am Ende der Prozedur aktualisiert (getestet!')
Nachteil: du kannst eine etwas längere Laufzeit der Prozedur bekommen. Aber ich denke, das ist verschmerzbar.
Was macht "DoEvents"? Ganz einfach: im Prinzip sagt es dem Betriebssystem "du bist dran, aktualisiere mal deine anstehenden Aufgaben" - und dazu gehören halt auch so Dinge wie Aktualisierung der Bildschirmgrafik.
http://www.vbarchiv.net/commands/DoEvents.php
Volker
Den DoEvents kannst du theoretisch beliebig oft einfügen - ich habe, allerdings in einer Access-DB - eine Prozedur, in der er insgesamt 8 mal steht - und zwar immer jeweils nach einer länger dauernden Abfrage bzw. einem länger dauernden Export per DoCmd.Transferspreadsheet.
Sinn des ganznez: er soll ermöglichen, dass ein großes Textfeld, das mir als eine Art Logfenster dient, auch aktualisiert wird. Ohne die "DoEvents" dazwischen bliebe das Feld weiss und würde erst am Ende der Prozedur aktualisiert (getestet!')
Nachteil: du kannst eine etwas längere Laufzeit der Prozedur bekommen. Aber ich denke, das ist verschmerzbar.
Was macht "DoEvents"? Ganz einfach: im Prinzip sagt es dem Betriebssystem "du bist dran, aktualisiere mal deine anstehenden Aufgaben" - und dazu gehören halt auch so Dinge wie Aktualisierung der Bildschirmgrafik.
http://www.vbarchiv.net/commands/DoEvents.php
Volker