カレントデータベース内にあるすべてのフォームとその中のサブフォームコントロールを探索し、ソースオブジェクトプロパティ(そのコントロール内に表示されるフォーム名)に特定の文字列を含むコントロールの一覧を収集します。
これを応用することで、あるフォームが他のフォームのサブフォームとして使われているかどうかなどを調べることができます。
- 「Database」オブジェクトや「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each~Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。
- 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。
- フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。
- そのフォーム内に配置されているすべてのコントロールのコレクションである「Controls」の中から、For Each~Nextステートメントでひとつずつコントロール情報を取り出し、「Control」オブジェクトの変数「ctl」にセットしていきます。
- 取り出されたひとつのコントロール情報のうち、そのコントロールの種類を表す「ControlType」プロパティの値を調べます。
- それが特定の値(ここでは「acSubform/サブフォーム」)であれば、そのソースオブジェクトである「SourceObject」プロパティの値に特定の文字列(ここでは”マスタ”)が含まれているかどうかを検査します。
- 指定文字列を含んでいたら、そのフォーム名とコントロール名、およびその「ソースオブジェクト」をイミディエイトウィンドウに出力します。
- そのフォームを閉じます。
ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。
Sub Sample_4_14()
'ソースオブジェクトに特定の文字列を含むサブフォームコントロールを収集する
Dim dbs As Database
Dim ctn As Container
Dim doc As Document
Dim ctl As Control
Dim strFormName As String
Dim strFind As String
strFind = "マスタ"
Set dbs = CurrentDb
Set ctn = dbs.Containers!Forms
For Each doc In ctn.Documents
strFormName = doc.Name
DoCmd.OpenForm strFormName, acDesign
For Each ctl In Forms(strFormName).Controls
With ctl
If .ControlType = acSubform Then
If InStr(.SourceObject, strFind) > 0 Then
Debug.Print strFormName,
Debug.Print .Name,
Debug.Print .SourceObject
End If
End If
End With
Next ctl
DoCmd.Close acForm, strFormName, acSaveNo
Next doc
End Sub
実行例:
|