window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-TCJTE9L38H');

Mehrere Instanzen eines Formulars

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.

Formular-Entwurf unseres Beispielformulars

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:

Erster Datensatz im Beispielformular

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:

Formularklasse per IntelliSense

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

Schreibe einen Kommentar