Unterformular-Steuerelement zu Unterformular ermitteln
Wichtig: Unterscheidung zwischen (Unter-)Formular und Unterformular-Steuerelement
Angenommen, Sie haben ein Unterformular sfrmSub auf einem Formular frmMain.
Man muss hier zwischen dem Unterformular-Steuerelement und dem Formular unterscheiden, auch wenn beide den gleichen Namen haben können.
Wenn Sie das Unterformular per Drag&Drop auf das Formular einfügen, dann nennt Access das Unterformular-Steuerelement genau so wie das Formular.
Im Normalfall gibt es kein Problem: wenn Sie auf den Knopf drücken, dann wissen Sie ja, wie das Unterformular-Steuerelement heißt, und Sie können in den Code schreiben:
MsgBox "sfrmSub"
Es gibt aber keine Methode oder Eigenschaft in Access, die Ihnen den Namen des Unterformular-Steuerelements dynamisch liefert!
'Es gibt kein MsgBox Me.SubformControl.Name
Und in der Regel brauchen Sie das ja nicht, weil Sie den Namen wissen und als String-Konstante verwenden können.
Unterformular mehrfach auf einem Formular verwenden
Jetzt wird es interessanter:
Das abgebildete Formular enthält dreimal das selbe Unterformular (z.B. können Sie 3 mal per Drag&Drop das Formular sfrmSub auf das Formular frmMain ziehen).
Die Namen der Unterformular-Steuerelemente seien sfrmSub1, sfrmSub2, sfrmSub3.
Hinter allen drei Buttons läuft der selbe Code ab, weil es das identische Formular-Modul ist, das es ja nur einmal gibt.
Sie haben jetzt keine direkte Möglichkeit, zu bestimmen, in welchem Unterformular der Button gedrückt wurde.
Die folgende Funktion liefert das Unterformular-Steuerelement zu einem Formular zurück:
Function ParentSubformControl(frmMe As Access.Form) As Access.SubForm ' Unterformular-Steuerelement zu Unterformular zurückgeben Dim frmParent As Access.Form Dim ctl As Control On Error Resume Next Set frmParent = frmMe.Parent If err.Number <> 0 Then ' This is not a subform. Set ParentSubformControl = Nothing Else For Each ctl In frmParent.Controls If ctl.ControlType = acSubform Then If ctl.Form Is frmMe Then Set ParentSubformControl = ctl Exit For End If End If Next ctl End If Set ctl = Nothing Set frmParent = Nothing End Function
Erläuterung:
Es werden alle Steuerelemente des Parents, also des Hauptformulars, durchlaufen, und wenn der Ausdruck ctl.Form Is frmMe True liefert, dann ist das gesuchte Steuerelement gefunden.
Hinter dem Button läuft also folgender Code ab:
Private Sub cmdButton_Click() MsgBox ParentSubformControl(Me).Name End Sub
Es gibt durchaus sinnvolle Anwendungen für den Einsatz identischer Unterformulare auf einem Formular.
Beispielsweise 12 Unterformulare für 12 Monate, in denen jeweils das selbe abläuft oder angezeigt wird, nur halt für die verschiedenen Monate.
In diesem Fall will man, etwa beim OnLoad des Unterformulars, das ja dann in jedem der Unterformulare abläuft, wissen, in welchem Monat man gerade ist.
Man kann hier z.B. einfach die Tag-Eigenschaft („Marke“ auf deutsch) des Unterformular-Steuerelements benutzen, das ist einfacher, als mit dem Namen zu arbeiten.
Die Marke-Eigenschaft wird also mit 1,2,3 … 12 gefüllt, und der code im OnLoad des Unterformulars sieht so aus:
Private Sub Form_Load() Select Case ParentSubformControl(Me).Tag Case 1 Debug.Print "Monat 1" Case 2 Debug.Print "Monat 2" Case 3 Debug.Print "Monat 3" ' ..... End Select End Sub
In obigem Screenshot hat zB. jedes Unterformular eine andere Hintergrundfarbe, obwohl es ja das identische Formular-Objekt ist.
Die Marke-Eigenschaft ist mit 1, 2 und 3 gefüllt, der Code im OnLoad() sieht dann so aus:
Private Sub Form_Load() Select Case ParentSubformControl(Me).Tag Case 1 Section(AcSection.acDetail).BackColor = RGB(200, 200, 200) Case 2 Section(AcSection.acDetail).BackColor = RGB(170, 170, 170) Case 3 Section(AcSection.acDetail).BackColor = RGB(140, 140, 140) End Select End Sub