Bei der Entwicklung Ihrer Access-Lösungen stehen Sie immer wieder vor dem Problem, dass eine VBA-Routine genau so lange unterbrochen werden muss, bis ein zuvor geöffnetes Formular oder ein in der Seitenansicht angezeigter Bericht wieder geschlossen ist.
Mit der Anweisung
DoCmd.OpenForm „Neuer Datensatz“, , , , ,acDialog
lässt sich hier nur bedingt arbeiten, da sie
1. nicht mit Berichten angewendet werden kann (denn hier gibt es keinen „acDialog“-Modus) und
2. nicht immer alle Formulare als Dialoge angezeigt werden können, weil beispielsweise auch der Einsatz von Formularen denkbar ist, die nebeneinander angezeigt werden.
Sie können aber zur Lösung des Problems auf ein wenig beachtetes Feature der „Sys- Cmd()“-Funktion zurückgreifen: Über die Sub-Funktion „GetObjectState()“ von SysCmd() lässt sich recht einfach feststellen, ob ein Formular oder ein Bericht geöffnet ist. Solange das der Fall ist, können Sie in einer entsprechenden Schleife warten.
In der Beispieldatenbank VBA_WARTEN. MDB finden Sie ein Modul „basWaitObjects“, das wir für Sie vorbereitet haben und das Sie direkt in eigene Projekte übernehmen können. In diesem Modul sind die beiden Prozeduren „WaitForm“ und „WaitReport“ abgelegt:
Sub WaitForm(strForm As String)
While SysCmd(acSysCmdGetObjectState, acForm, strForm)
DoEvents
Wend
End Sub
Sub WaitReport(strReport As String)
While SysCmd(acSysCmdGetObjectState, acReport, strReport)
DoEvents
Wend
End Sub
Die Funktion SysCmd() prüft hier jeweils über die Sub-Funktion „acSysCmdGet- ObjectState“, ob das Objekt, dessen Name als Parameter übergeben wurde, geladen ist. Sollte das der Fall sein, ist das Funktionsergebnis „True“ und die Schleife wird weiter ausgeführt. Andernfalls ist das Objekt geschlossen worden und die Schleife ist beendet.
Es geht dann in der VBA-Routine weiter, von der aus Sie die Prozedur aufgerufen haben. Die Anweisung „DoEvents“ sorgt jeweils dafür, dass Access innerhalb der Schleife Prozessorzeit an das System zurückgibt und so die Performance nicht bremst.
Diese beiden Prozeduren können Sie in Zukunft in VBA-Routinen einsetzen, um mit der Ausführung zu warten, bis ein Formular oder Bericht wieder geschlossen ist. In der Beispielsdatenbank finden Sie das Formular „Test für WaitForm/Wait- Report“, in dem die Prozeduren über zwei Schaltflächen getestet werden können:
Private Sub btnTestForm_Click()
DoCmd.OpenForm „Test-Formular“
WaitForm „Test-Formular“
MsgBox „Formular wurde geschlossen!“
End Sub
Hier wird zunächst ein Formular geöffnet und anschließend die Prozedur „WaitForm“ mit dem Namen des betreffenden Formulars als Parameter aufgerufen. „WaitForm“ wartet nun so lange, bis das Formular geschlossen ist, anschließend geht es in der VBA-Routine weiter. Sie zeigt hier zu Testzwecken eine kleine Meldung an. Genauso einfach warten Sie auch darauf, dass ein Bericht wieder geschlossen wird:
Private Sub btnTestReport_Click()
DoCmd.OpenReport „Test-Bericht“, acViewPreview
WaitReport „Test-Bericht“
MsgBox „Bericht wurde geschlossen!“
End Sub
Modul: basWaitObjects