カレントデータベース内にあるすべてのフォームとその中のすべてのコントロールを探索し、特定の種類のコントロールだけを収集します。
- 「Database」オブジェクトや「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each〜Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。
- 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。
- フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。
- まずフォーム名をイミディエイトウィンドウに出力します。
- そのフォーム内に配置されているすべてのコントロールのコレクションである「Controls」の中から、For Each〜Nextステートメントでひとつずつコントロール情報を取り出し、「Control」オブジェクトの変数「ctl」にセットしていきます。
- 取り出されたひとつのコントロール情報のうち、そのコントロールの種類を表す「ControlType」プロパティ(下表参照)の値を調べます。
- それが特定の値(ここでは「acTextBox/テキストボックス」または「acLabel/ラベル」)であれば、コントロール名(「Name」プロパティの値)とその種類をイミディエイトウィンドウに出力します。
- そのフォームを閉じます。
ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。
Sub Sample_4_06()
'特定の種類のコントロールだけを収集する
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
If .ControlType = acTextBox Then
Debug.Print .Name & "(テキストボックス)"
ElseIf .ControlType = acLabel Then
Debug.Print .Name & "(ラベル)"
End If
End With
Next ctl
Debug.Print "------------------"
DoCmd.Close acForm, strFormName, acSaveNo
Next doc
End Sub
■主なコントロールの種類とControlTypeの組み込み定数
| コントロールの種類 |
組み込み定数 |
| ラベル |
acLabel |
| テキストボックス |
acTextBox |
| コマンドボタン |
acCommandButton |
| コンボボックス |
acComboBox |
| リストボックス |
acListBox |
| チェックボックス |
acCheckBox |
| オプションボタン |
acOptionButton |
| トグルボタン |
acToggleButton |
| オプショングループ |
acOptionGroup |
| サブフォーム |
acSubform |
| タブ |
acTabCtl |
| ページ |
acPage |
| イメージ |
acImage |
| 直線 |
acLine |
| 四角形 |
acRectangle |
| 改ページ |
acPageBreak |
| 連結オブジェクトフレーム |
acBoundObjectFrame |
| 非連結オブジェクトフレーム |
acObjectFrame |
| ActiveXコントロール |
acCustomControl |
実行例:
|