web-dev-qa-db-ja.com

サブフォームのコントロールを含む、フォームのすべてのコントロールをループする方法-Access 2007

私の質問のタイトルが示すように、サブフォームを含むフォーム内のすべてのコントロールをループすることはどのように可能ですか。

たとえば、以下のサブルーチンを使用して、タグ*を使用してコントロールの背景色を設定します。

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

サブフォームのコントロールをキャッチするためにこれをどのように変更しますか?ヘルプやポインタを事前に感謝します。

乾杯ノエル

9
noelmcg

再帰を使用できます

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
14
Fionnuala

サブフォームコントロールの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
2
HansUp