カレントデータベース内のそれぞれのフォーム内に配置されているすべてのコントロールについて、そのコントロールがどのセクションに配置されているかを収集します。
- 「Database」オブジェクトや「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each〜Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。
- 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。
- フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。
- まずフォーム名をイミディエイトウィンドウに出力します。
- そのフォーム内に配置されているすべてのコントロールのコレクションである「Controls」の中から、For Each〜Nextステートメントでひとつずつコントロール情報を取り出し、「Control」オブジェクトの変数「ctl」にセットしていきます。
- 取り出されたひとつのコントロール情報のうち、コントロール名である「Name」プロパティの値をイミディエイトウィンドウに出力します。
- さらに、そのコントロールが配置されているセクションを表す「Section」プロパティの値を取得し、「Choose」関数によってそれぞれを分かりやすい文字表記にしたうえでイミディエイトウィンドウに出力します。
Sectionプロパティが返すセクション番号は下記のようになっています。
- 詳細 → 0(acDetail)
- フォームヘッダー → 1(acHeader)
- フォームフッター → 2(acFooter)
- ページヘッダー → 3(acPageHeader)
- ページフッター → 4(acPageFooter)
上記のようにその番号は「0」から始まる連番となっています。Choose関数では第1引数の「1」から始まる連番に応じて第2引数以降のいずれかの値が返されるので、ここではSectionプロパティ値に+1しています。
また、上記のカッコ内の値はそれぞれの組み込み定数で、数値ではなくこちらの定数を使って処理することもできます。たとえば、「If .Section
= acDetail Then」といった構文で、詳細セクションのコントロールだけに対して何らかの処理をするといったことができます。
- そのフォームを閉じます。
ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。
Sub Sample_4_03()
'各フォームのコントロールの配置セクションを収集する
Dim dbs As Database
Dim ctn As Container
Dim doc As Document
Dim ctl As Control
Dim strFormName As String
Set dbs = CurrentDb
Set ctn = dbs.Containers!Forms
For Each doc In ctn.Documents
strFormName = doc.Name
DoCmd.OpenForm strFormName, acDesign
Debug.Print "■" & strFormName
For Each ctl In Forms(strFormName).Controls
With ctl
Debug.Print .Name,
Debug.Print Choose(.Section + 1, "詳細", _
"フォームヘッダー", "フォームフッター", _
"ページヘッダー", "ページフッター")
End With
Next ctl
Debug.Print "------------------"
DoCmd.Close acForm, strFormName, acSaveNo
Next doc
End Sub
実行例:
|