Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Die meisten Anwendungen zeigen, wie Sie aus einer Liste von Datensätzen einen per Doppelklick öffnen und in einem Detailformular anzeigen. Nach dem Bearbeiten schließen Sie diesen und wenden sich dem nächsten Datensatz zu. Was aber, wenn Sie einmal mehrere Datensätze parallel anzeigen möchten, um diese beispielsweise zu vergleichen – oder weil Sie einfach den einen Datensatz später noch einmal weiterbearbeiten möchten. Dieser Artikel zeigt Ihnen, wie Sie dieses Verhalten mit Access-Formularen abbilden können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1611_Formularinstanzen.accdb.
Formulare öffnen auf herkömmliche Art
Wenn Sie auf die herkömmliche Art ein Formular öffnen möchten, verwenden Sie dazu beispielsweise den folgenden Befehl:
DoCmd.OpenForm "frmKunde"
Damit erhalten Sie dann eine Instanz des gewünschten Formulars. Mit weiteren Parametern können Sie etwa noch angeben, dass Sie gleich beim öffnen einen bestimmten Kunden anzeigen wollen:
DoCmd.OpenForm "frmKunde", WhereCondition:="KundeID = 1"
Wenn Sie die gleiche Anweisung jedoch noch ein weiteres Mal ausführen, um damit beispielsweise einen anderen Kunden im gleichen Formular anzuzeigen, gelingt dies nicht wie gewünscht.
Wir schauen uns dies am Beispiel des Formulars frmKunde an, dass im Entwurf wie in Bild 1 aussieht und die Tabelle tblKunden mit einigen Beispieldatensätzen als Datenherkunft verwendet.
Bild 1: Formular-Entwurf unseres Beispielformulars
öffnen wir das Formular mit der obigen DoCmd.OpenForm-Anweisung, die Sie der Einfachheit halber einfach im Direktbereich eingeben (zu öffnen mit Strg + G) und mit der Eingabetaste ausführen, erhalten wir das Formular aus Bild 2. Führen Sie diesen Befehl jedoch direkt danach erneut aus, wobei Sie lediglich den WhereCondition-Parameter wie folgt ändern, wird zwar der zweite Kunde im Formular angezeigt, der erste verschwindet allerdings:
Bild 2: Erster Datensatz im Beispielformular
DoCmd.OpenForm "frmKunde", WhereCondition:="KundeID = 2"
Das bedeutet, dass wir uns eine alternative Möglichkeit einfallen lassen müssen.
Formular-Instanz öffnen
Zum Glück gibt es noch eine zweite Methode, um ein Formular zu öffnen. Im Grunde ist DoCmd.OpenForm eine vereinfachte Variante, die Sie so etwa in anderen Sprachen wie Visual Basic oder C# nicht finden werden. Dort wird immer eine Objektvariable auf Basis der entsprechenden Klasse, hier eben das betroffene Formular, deklariert und dann initialisiert. Gegebenenfalls ist das initialisierte Objekt dann noch sichtbar zu machen, was bei Access-Formularen der Fall ist. Wie also sieht diese alternative Methode unter Access aus und können wir auch hier den gewünschten Datensatz an das Formular übermitteln
Dazu wollen wir uns erst einmal ein Standardmodul anlegen, in dem wir eine Prozedur erstellen, um das Verhalten nachzuprogrammieren.
Das Standardmodul heißt mdlFormularinstanzen und wird im Visual Basic Editor (zu öffnen mit Alt + F11) mit dem Menübefehl Einfügen|Modul eingefügt.
Keine Formularinstanz ohne Formularklasse
Ein Schritt ist noch nötig, bevor wir per VBA eine neue Instanz unseres Formulars frmKunde erstellen können. Genau genommen erstellen wir nämlich keine Instanz des Formulars, sondern der Code behind-Klasse, also des Klassenmoduls, dass beispielsweise dann angelegt wird, wenn Sie ein Ereignis des Formulars implementieren oder die Eigenschaft Enthält Modul des Formulars auf Ja einstellen.
Da das Formular eine Schaltfläche mit der Beschriftung OK enthält, welche das Formular nach erfolgter Bearbeitung oder Ansicht der Daten schließen soll, legen wir gleich den Wert [Ereignisprozedur] für die Ereigniseigenschaft Beim Klicken dieses Steuerelements an und klicken auf die Schaltfläche mit den drei Punkten, um die entsprechende Ereignisprozedur anzulegen – und somit auch das benötigte Klassenmodul:
Private Sub cmdOK_Click() DoCmd.Close acForm, Me.Name End Sub
Danach wechseln wir wieder zum Modul mdlFormularinstanzen, wo wir eine neue Prozedur namens Formularinstanz hinzufügen und für diese eine Variable namens frm deklarieren. Diese soll den Typ des Klassenmoduls des Formulars frmKunde erhalten, der dann auch prompt per IntelliSense angeboten wird (siehe Bild 3). Also führen wir nun die geplanten Schritte durch, die wie folgt aussehen – deklarieren, initialisieren und sichtbar machen:
Bild 3: Formularklasse per IntelliSense
Public Sub Formularinstanz() Dim frm As Form_frmKunde Set frm = New Form_frmKunde frm.Visible = True End Sub
Der Plan war nicht gut genug: Das Formular erscheint für Bruchteile einer Sekunde und verschwindet dann wieder. Der Grund ist eindeutig: Die Variable frm, mit der wir es referenzieren, ist innerhalb der Prozedur Formularinstanz deklariert.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo