Discussion:
Formularansicht während Abarbeitung von VBA Code aktualisieren
(zu alt für eine Antwort)
Björn Benatzky
2007-11-27 09:39:00 UTC
Permalink
Hey,

ich habe folgende Problem unter A03:
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?

Gruß
Björn
Peter Doering
2007-11-27 10:10:49 UTC
Permalink
Hallo,
Post by Björn Benatzky
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?
<F1>DoEvents

Gruss - Peter
--
Ich beantworte keine Fragen per Email.
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
Björn Benatzky
2007-11-27 11:18:00 UTC
Permalink
Hallo Peter,
Post by Peter Doering
Hallo,
Post by Björn Benatzky
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?
<F1>DoEvents
Gruss - Peter
Das habe ich auch bereits implementiert. Dennoch bleibt das Formular während
der Bearbeitung weiß.

Gruß
Björn
Sascha Trowitzsch
2007-11-27 12:00:30 UTC
Permalink
Hi,
Post by Björn Benatzky
Hallo Peter,
Post by Peter Doering
Hallo,
Post by Björn Benatzky
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?
<F1>DoEvents
Gruss - Peter
Das habe ich auch bereits implementiert. Dennoch bleibt das Formular während
der Bearbeitung weiß.
Das kann dann eigentlich nur bedeuteten, dass eine Abfrage in dem Code so lange
dauert. Ich habe noch nicht erlebt, dass ein DoEvents nicht den beabsichtigten
Effekt hatte, wenn VBA-Code ablief. Während der Ausführung einer Abfrage ist das
aber was anderes. Sollte sich aber lösen lassen, indem das Doevents unmittelbar
*vor* den Aufruf einer Abfrage platziert wird.

Ciao, Sascha
Björn Benatzky
2007-11-27 12:28:16 UTC
Permalink
Hallo Sascha,
Post by Sascha Trowitzsch
Das kann dann eigentlich nur bedeuteten, dass eine Abfrage in dem Code so lange
dauert. Ich habe noch nicht erlebt, dass ein DoEvents nicht den beabsichtigten
Effekt hatte, wenn VBA-Code ablief. Während der Ausführung einer Abfrage ist das
aber was anderes. Sollte sich aber lösen lassen, indem das Doevents unmittelbar
*vor* den Aufruf einer Abfrage platziert wird.
Ciao, Sascha
Die einzelnen Befehle des VBA Codes dauern an sich nicht lange bei der
Ausführung. Nur da der Code in einer Schleife läuft, die sehr häufig
wiederholt wird, dauert die Abarbeitung des Codes insgesamt sehr lange.
Vielleicht sollte ich noch hinzufügen, daß die Funktion, deren VBA Code
abgearbeitet wird, von einer SQL-Abfrage mittels Docmd.RunSQL aufgerufen
wird. Vor welcher 'Abfrage' soll ich nun den Befehl DoEvents setzen?

Gruß
Björn
Sascha Trowitzsch
2007-11-27 12:42:38 UTC
Permalink
Hi Björn,
Post by Björn Benatzky
Hallo Sascha,
Post by Sascha Trowitzsch
Das kann dann eigentlich nur bedeuteten, dass eine Abfrage in dem Code so lange
dauert. Ich habe noch nicht erlebt, dass ein DoEvents nicht den beabsichtigten
Effekt hatte, wenn VBA-Code ablief. Während der Ausführung einer Abfrage ist das
aber was anderes. Sollte sich aber lösen lassen, indem das Doevents unmittelbar
*vor* den Aufruf einer Abfrage platziert wird.
Ciao, Sascha
Die einzelnen Befehle des VBA Codes dauern an sich nicht lange bei der
Ausführung. Nur da der Code in einer Schleife läuft, die sehr häufig
wiederholt wird, dauert die Abarbeitung des Codes insgesamt sehr lange.
Vielleicht sollte ich noch hinzufügen, daß die Funktion, deren VBA Code
abgearbeitet wird, von einer SQL-Abfrage mittels Docmd.RunSQL aufgerufen
wird. Vor welcher 'Abfrage' soll ich nun den Befehl DoEvents setzen?
Na eben vor das RunSQL, das du aber übrigens besser durch Currentdb.Execute
ersetzen solltest.

Ciao, Sascha
Björn Benatzky
2007-11-27 12:56:02 UTC
Permalink
Hallo Sascha,
Post by Sascha Trowitzsch
Hi Björn,
Post by Björn Benatzky
abgearbeitet wird, von einer SQL-Abfrage mittels Docmd.RunSQL aufgerufen
wird. Vor welcher 'Abfrage' soll ich nun den Befehl DoEvents setzen?
Na eben vor das RunSQL, das du aber übrigens besser durch Currentdb.Execute
ersetzen solltest.
Ciao, Sascha
Jawohl, jetzt funktioniert es. Das Formular wird regelmäßig aktualisiert.
Danke!

Ist der Befehl Currentdb.Execute besser als RunSQL? Welche Vorteile gibt es?

Gruß
Björn
Sascha Trowitzsch
2007-11-27 14:15:42 UTC
Permalink
Hi Björn,
Post by Björn Benatzky
Hallo Sascha,
Post by Sascha Trowitzsch
Hi Björn,
Vielleicht sollte ich noch hinzufügen, daß die Funktion, deren VBA Code
Post by Björn Benatzky
abgearbeitet wird, von einer SQL-Abfrage mittels Docmd.RunSQL aufgerufen
wird. Vor welcher 'Abfrage' soll ich nun den Befehl DoEvents setzen?
Na eben vor das RunSQL, das du aber übrigens besser durch Currentdb.Execute
ersetzen solltest.
Ciao, Sascha
Jawohl, jetzt funktioniert es. Das Formular wird regelmäßig aktualisiert.
Danke!
Ist der Befehl Currentdb.Execute besser als RunSQL? Welche Vorteile gibt es?
Siehe http://www.dbwiki.de/wiki.php?title=Access_Design:RunSQL_oder_Execute

Ciao, Sascha
Jörg Ackermann
2007-11-27 12:21:47 UTC
Permalink
Hallo,
Post by Björn Benatzky
Das habe ich auch bereits implementiert. Dennoch bleibt das Formular
während der Bearbeitung weiß.
Tja, dann bleibt wohl nur warten, wenn das
Betriebssystem nicht mal genug Rechenzeit bekommt,
das Fenster neu zu zeichnen.

Gruß
Björn Benatzky
2007-11-27 12:44:00 UTC
Permalink
Post by Jörg Ackermann
Tja, dann bleibt wohl nur warten, wenn das
Betriebssystem nicht mal genug Rechenzeit bekommt,
das Fenster neu zu zeichnen.
Und was kann ich noch tun? Ich habe jetzt schon ein Sleep eingebaut und
setze ihn probeweise immer höher, um festzustellen, wieviel Zeit das
Betriebssystem benötigt...

Gruß
Björn
Jörg Ackermann
2007-11-27 12:51:22 UTC
Permalink
Hallo,
Post by Björn Benatzky
Und was kann ich noch tun?
IMHO gar nichts.

Gruß
Thomas Möller
2007-11-27 10:11:39 UTC
Permalink
Hallo Björn,
Post by Björn Benatzky
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?
verwende DOEVENTS statt Repaint.

HTH
--
Thomas

Homepage: www.Team-Moeller.de
Jürgen Volke
2007-11-27 13:04:24 UTC
Permalink
Hallo Björn
Post by Björn Benatzky
Ich starte über eine Schaltfläche auf einem Formular die Ausführung eines
längeren VBA Codes. Wenn ich während dieser Abfrage das Access Hauptfenster
in den Hintergrund verschiebe und wieder in den Vordergrund hole, sehe ich
nur die Umrandung des aktuellen Formulars, aber keine Elemente auf dem
Formular.
Ich habe schon mit Repaint versucht, regelmäßig die Ansicht des Formulars zu
aktualiseren, es hilft aber nicht. Was kann ich tun?
zum einen solltest du überprügfen, ob du die Schleife nicht durch einen
einzigen
SQL-Ausdruck ersetzen kannst, was die Laufzeit drastisch reduzieren könnte.
zum anderen könntest du das Formular mit dem Paramater acDialpog öffnen,
dann sollte es gar nicht möglich sein, das Formular zu verlassen.

HTH Jürgen
Björn Benatzky
2007-11-27 14:03:01 UTC
Permalink
Hallo Jürgen,
Post by Jürgen Volke
zum einen solltest du überprügfen, ob du die Schleife nicht durch einen
einzigen
SQL-Ausdruck ersetzen kannst, was die Laufzeit drastisch reduzieren könnte.
zum anderen könntest du das Formular mit dem Paramater acDialpog öffnen,
dann sollte es gar nicht möglich sein, das Formular zu verlassen.
HTH Jürgen
Inzwischen funktioniert es, Sascha konnte mir helfen.

Aber zum einen kann ich Deinen ersten Tipp mit einem klaren Nein
beantworten, es ist nicht möglich
und zum anderen geht es nicht darum, das Formular zu verlassen, sondern das
ganze Access Fenster.

Trotzdem danke für Deinen Beitrag.

Gruß
Björn
Oliver Straub
2007-11-27 17:35:46 UTC
Permalink
Hallo Björn,

ggf. solltest Du beachten, dass Du durch ein DoEvents dem User die
Möglichkeit eröffnest, (z.B.) im Formular vorhandene Button zu betätigen.

Durch das DoEvents wird Access angewiesen, auftretende Ereignisse bzw. die
zugehörigen Ereignisprozeduren auszuführen. Dies kann zu unerwünschten
Komplikationen führen. (z.B. Dem User dauert der Vorgang zu lange und er ist
sich nicht sicher ob's überhaupt läuft, drum klickt er nochmal auf den
Button, mit dem er die gerade laufende Prozedur gestartet hat. Resultat:
Diese Funktion wird doppelt ausgeführt.)

Wenn man es genau machen will, muss eine Steuervariable eingeführt werden,
die vor dem Ausführen einer Prozedur (die ein DoEvents enthält) auf einen
Wert gesetzt wird, der dann eine Ausführung anderer Ereignisprozeduren (die
nicht "parallel laufen dürfen) verhindert.

Private bBusy as boolean

Private Sub Ereignis()
if bBusy then
exit sub
else
bBusy=true
endif

..Code..

bBusy=false

end sub


Gruss
Oliver
Sascha Trowitzsch
2007-11-27 17:50:53 UTC
Permalink
Guter Einwurf!

Ciao, Sascha
Post by Thomas Möller
Hallo Björn,
ggf. solltest Du beachten, dass Du durch ein DoEvents dem User die Möglichkeit
eröffnest, (z.B.) im Formular vorhandene Button zu betätigen.
Durch das DoEvents wird Access angewiesen, auftretende Ereignisse bzw. die
zugehörigen Ereignisprozeduren auszuführen. Dies kann zu unerwünschten
Komplikationen führen. (z.B. Dem User dauert der Vorgang zu lange und er ist
sich nicht sicher ob's überhaupt läuft, drum klickt er nochmal auf den Button,
mit dem er die gerade laufende Prozedur gestartet hat. Resultat: Diese
Funktion wird doppelt ausgeführt.)
Wenn man es genau machen will, muss eine Steuervariable eingeführt werden, die
vor dem Ausführen einer Prozedur (die ein DoEvents enthält) auf einen Wert
gesetzt wird, der dann eine Ausführung anderer Ereignisprozeduren (die nicht
"parallel laufen dürfen) verhindert.
Private bBusy as boolean
Private Sub Ereignis()
if bBusy then
exit sub
else
bBusy=true
endif
..Code..
bBusy=false
end sub
Gruss
Oliver
Loading...