Unterformular-Steuerelement zu Unterformular

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
Unterformular-Steuerelement zu Unterformular
Markiert in:        

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.