Formularanzeige (VBA)

Hallo allerseits,

während mein Makro abläuft, zeige ich über eine Form den momentanen Status des Ablaufs an. Da ein Makro ein anderes aufruft, verschwindet die Form beim Makrowechsel. Im neuen Makro kann ic die Form zwar wieder aufrufen, das führt aber dazu, dass der Bildschirm flimmert, weil die Form ein-und aus- und ein- und aus…geschaltet wird, was ein wenig unschön ist. Wie kann ich das denn ändern, so dass die Form permanent angezeigt wird (Excel 2007, VBA 6.5)?
Hier der Code (gekürzt):

sub1()
Application.ScreenUpdating = False

frmAppStatus.lblStat1.Caption = pubTxt27 & rr
frmAppStatus.lblStat2.Caption = pubTxt28
frmAppStatus.Show
DoEvents
(...)
Call 2()
End Sub
Sub2()
frmAppStatus.lblStat1.Caption = pubTxt27 & rr
frmAppStatus.lblStat2.Caption = pubTxt28
frmAppStatus.Show
DoEvents
(..)
Application.ScreenUpdating = True
End Sub

frmAppStatus ist der Name der Form, pubTxt27 und 28 Texte in der Form, rr die momentan aufgerufenen Zeilennummer.

Ralph

Hallo DataEditor,

während mein Makro abläuft, zeige ich über eine Form den
momentanen Status des Ablaufs an.

ich habe bei Excel immer gern die Statusleiste genommen um einen Status anzeigen zu lassen. Geht natürlich nicht bei übermäßig viel Daten, aber wenn man zb die fertigen % anzeigen lassen will oder so macht sich das prima.

LG Tobi@s

Hallo Tobi@s,

nette Idee, das geht nur leider nicht, weil ich während des Ablaufs nicht weiß, wieviel Prozent bereits abgearbeitet sind.

Ralph

Dann beschreib doch mal welche Menge (und was) an Informationen während des Ablaufs angezeigt werden sollen.

LG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

während mein Makro abläuft, zeige ich über eine Form den
momentanen Status des Ablaufs an. Da ein Makro ein anderes
aufruft, verschwindet die Form beim Makrowechsel. Im neuen
Makro kann ic die Form zwar wieder aufrufen, das führt aber
dazu, dass der Bildschirm flimmert, weil die Form ein-und aus-
und ein- und aus…geschaltet wird, was ein wenig unschön ist.
Wie kann ich das denn ändern, so dass die Form permanent
angezeigt wird (Excel 2007, VBA 6.5)?

Hallo Ralph,

Tipps:

für was das DoEvents? Lasse es weg.

Rufe die Form so auf:
frmAppStatus.Show 0

Application.ScreenUpdating True/False nur in der aufrufenden ersten Sub.

Gruß
Reinhard

Hallo Reinhard,

Einmal mehr ein sehr hilfreicher Tip von dir, danke. Dummerweise führt das zu einem neuen Problem, weil nämlich jetzt der Text in der Form (PubTxt27) nicht mehr angeziegt wird. PubTxt27 ist als globale Variable definiert.

für was das DoEvents? Lasse es weg.

Das DoEvents habe ich abgeschrieben. Was macht das eigentlich genau?

Ralph

Hallo Tobi@s,

ich lese nacheinander unterschiedlich große Datenblöcke ein. Dabei kann ein Block hundert oder auch hunderttausend Zeilen umfassen. Das rr bezeichnet die Zeile, in der ein neuer Block beginnt.

Ralph

Hallo Ralph,

Dummerweise führt das zu einem neuen Problem, weil nämlich
jetzt der Text in der Form (PubTxt27) nicht mehr angeziegt
wird. PubTxt27 ist als globale Variable definiert.

dann lasse erst mal alle Screenupdating weg.

Wenn es nicht daran liegt so lade mal eine möglichst kleine aber aussagekräftige Mappe hoch wo das auftritt.

für was das DoEvents? Lasse es weg.

Das DoEvents habe ich abgeschrieben. Was macht das eigentlich
genau?

Tja, da weiß ich nur was in der Hilfe steht.
Ich benutze es nur dann wenn der Code irgendwo „hängt“.
Genau erklären kann ich Doevents keinesfalls.

Rainer, Alex können das bestimmt erklären :smile:

Gruß
Reinhard

Hallo,

Das DoEvents habe ich abgeschrieben. Was macht das eigentlich
genau?

DoEvents hält Dein Programm an dieser Stelle an und verzweigt in den Eventhandler. Der ‚sieht nach‘, ob Ereignisse vorliegen, die verarbeitet werden sollen. Falls ja, werden die zuerst verarbeitet. Danach übergibt der Eventhandler wieder an Dein Programm und es kann fortgesetzt werden.

Beispiele:
Wenn Dein Programm in einer längeren Schleife hängt, kannst Du in das Klick-Ereignis eines Buttons ein ‚End‘ schreiben, in Deine lange Schleife ein DoEvents.
Beim Ausführen des DoEvents wird u.a. auch geprüft, ob das Klickereignis eingetreten ist, also ob Du geklickt hast. Falls ja, wird die Prozedur ausgeführt und das ‚End‘ beendet Dein Programm. Ohne DoEvents kommst Du aus der Schleife nicht raus.

Ein Anderes Beispiel ist das Aktualisieren des Bildschirms, der Effekt, den Du möchtest.

Das Aktualisieren des Bildschirms ist aber nur ein Ereignis, das geprüft und u.U. ausgeführt wird. Weil DoEvents noch viel mehr ermöglicht, ist das allein für diesen zweck zu viel aufwand und eventuell sogar schädlich. Es könnte eine Prozedur durch mehrfaches Klicken mehrfach gestartet werden. Dadurch werden dann Inhalte von Variablen verändert und es kann zu unkontrollierbaren unerwarteten Programmabläufen kommen.

Wenn es nur um die Aktualisierung eines Textfeldes/Labels geht, ist ein ‚TextBox1.Refresh‘ besser, vermeidet Probleme und verbraucht auch weniger Rechenzeit als ein ‚Doevents‘, das die Steuerung zwischenzeitlich komplett abgibt.

Gruß Rainer

Hallo Reinhard,

Rainer, Alex können das bestimmt erklären :smile:

aua! Wink doch mal mit etwas anderem als immer mit Zaunpfählen! :smile:

Gruß Rainer

Hallo Reinhard,
die Mischung machts!

dann lasse erst mal alle Screenupdating weg.

das bringt nichts

für was das DoEvents? Lasse es weg.

Ne, das ist wichtig! Mit:

frmAppStatus.Show 0
DoEvents

passiert genau das, was ich will: Die form wird mit Text ohne Flimmern gezeigt. Bestens.

Vielen Dank nochmal.

Ralph

Was macht eigentlich DoEvents ?
Hallo Rainer,

da hat sich doch mein Zaunpfahl sehr sehr gelohnt für mich *lächel*

Das DoEvents habe ich abgeschrieben. Was macht das eigentlich
genau?

DoEvents hält Dein Programm an dieser Stelle an und verzweigt
in den Eventhandler. Der ‚sieht nach‘, ob Ereignisse
vorliegen, die verarbeitet werden sollen. Falls ja, werden die
zuerst verarbeitet. Danach übergibt der Eventhandler wieder an
Dein Programm und es kann fortgesetzt werden.

ja, ohne nachgeschaut zu haben ist das so wie in F1. D.h. sagt mir nicht viel.

Wenn Dein Programm in einer längeren Schleife hängt, kannst Du
in das Klick-Ereignis eines Buttons ein ‚End‘ schreiben, in
Deine lange Schleife ein DoEvents.
Beim Ausführen des DoEvents wird u.a. auch geprüft, ob das
Klickereignis eingetreten ist, also ob Du geklickt hast. Falls
ja, wird die Prozedur ausgeführt und das ‚End‘ beendet Dein
Programm. Ohne DoEvents kommst Du aus der Schleife nicht raus.

Klasse, endlich mal ein sinnvoller Einsatz von DoEvents bzw. ein konkreter praktischer Nutzen für mich.
Ich liebe Beispiele die ich verstehe und nicht so blöde Allgemeinsätze wie manchmal in F1.

Ein Anderes Beispiel ist das Aktualisieren des Bildschirms,
der Effekt, den Du möchtest.

War mir nicht klar, dachte DoEvents macht was andres, was auch immer :smile:

Das Aktualisieren des Bildschirms ist aber nur ein Ereignis,
das geprüft und u.U. ausgeführt wird. Weil DoEvents noch viel
mehr ermöglicht, ist das allein für diesen zweck zu viel
aufwand und eventuell sogar schädlich. Es könnte eine Prozedur
durch mehrfaches Klicken mehrfach gestartet werden. Dadurch
werden dann Inhalte von Variablen verändert und es kann zu
unkontrollierbaren unerwarteten Programmabläufen kommen.

Gut zu wissen.

Danke dir
Gruß
Reinhard

Hallo Ralph,

die Mischung machts!

jepp *gg*

dann lasse erst mal alle Screenupdating weg.

das bringt nichts

Naja, probieren kann mans ja. Screenupdatings in aufgerufenen Prozeduren können auch „Flimmern“ erezeugen, in deinem Fall hatte das halt andere Ursachen.

für was das DoEvents? Lasse es weg.

Ne, das ist wichtig!

Aha. Na gut, war ja kein Tipp aus Wissen heraus sondern eher dem Unwissen was das DoEvents da soll.
Genaugenommen hätte ich schreiben sollen:

Braucht man das Dovents? Lasse es mal weg und schaue was passiert, nicht passiert.

Mit:
frmAppStatus.Show 0
DoEvents
passiert genau das, was ich will: Die form wird mit Text ohne
Flimmern gezeigt.

Wenn du nur
frmAppStatus.Show
machst, so entspricht das
frmAppStatus.Show 1
weil das die Voreinstellung ist.
Mich hat sowieso gewundert daß dein Code durchlaufen soll. Normalerweise, bei Aufruf mit
frmAppStatus.Show
bleibt der Code an dieser Stelle stehen bis die UF wieder geschlossen wird, also erst dann wird Call Makro2 ausgeführt.

So wie bei einer MsgBox.

Bestens.

Das ist die hauptsache, daß es funktioniert :smile:

Gruß
Reinhard