私の質問のタイトルが示すように、サブフォームを含むフォーム内のすべてのコントロールをループすることはどのように可能ですか。
たとえば、以下のサブルーチンを使用して、タグ*を使用してコントロールの背景色を設定します。
Public Sub colCtrlReq(frm As Form)
' Sets background color for required field -> Tag = *
Dim setColour As String
setColour = RGB(255, 244, 164)
Dim ctl As Control
For Each ctl In frm.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
If InStr(1, ctl.Tag, "*") <> 0 Then
ctl.BackColor = setColour
End If
End If
Next ctl
Set ctl = Nothing
End Sub
サブフォームのコントロールをキャッチするためにこれをどのように変更しますか?ヘルプやポインタを事前に感謝します。
乾杯ノエル
再帰を使用できます
Public Sub colCtrlReq(frm As Form)
'' Sets background color for required field -> Tag = *
Dim setColour As String
setColour = RGB(255, 244, 164)
Dim ctl As Control
For Each ctl In frm
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox _
Or ctl.ControlType = acListBox Then
If InStr(1, ctl.Tag, "*") <> 0 Then
ctl.BackColor = setColour
End If
ElseIf ctl.ControlType = acSubform Then
colCtrlReq frm(ctl.Name).Form
End If
Next ctl
Set ctl = Nothing
End Sub
サブフォームコントロールのFormプロパティのコントロールコレクションにアクセスします。
サブフォームコントロールの名前は、保存されたフォームオブジェクトの名前と同じでない場合があることに注意してください。
サブフォームcontrolの名前がSubformControlNameの場合、ここから開始します。
For Each ctl In frm!SubformControlName.Form.Controls
Debug.Print ctl.Name
Next
更新:あなたのコメントから、これがあなたが探していると思うものです。
サブフォームコントロールの名前が事前にわからない場合は、実行時にフォームのどのコントロールがサブフォームコントロールであるかを特定できます。
For Each ctl In frm.Controls
If TypeName(ctl) = "SubForm" Then
Debug.Print ctl.Name & " is a SubForm"
For Each ctlSub in ctl.Form.Controls
Debug.Print ctlSub.Name
Next
End If
Next