カレントデータベース内にあるすべてのフォームとその中のすべてのコントロール、さらには各コントロールのすべてのプロパティを探索し、そのプロパティの値に特定の文字列を含むコントロールの一覧を収集します。
- 「Database」オブジェクトや「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each~Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。
- 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。
- フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。
- そのフォーム内に配置されているすべてのコントロールのコレクションである「Controls」の中から、For Each~Nextステートメントでひとつずつコントロール情報を取り出し、「Control」オブジェクトの変数「ctl」にセットしていきます。
- 取り出されたひとつのコントロールについて、すべてのプロパティのコレクションである「Properties」の中から、For Each~Nextステートメントでひとつずつプロパティ情報を取り出し、「Property」オブジェクトの変数「prp」にセットしていきます。
- 取り出されたひとつのプロパティの設定値である「Value」プロパティの値を変数「varPrpVal」にセットします。
このとき、Valueプロパティのないプロパティからそれを参照しようとするとエラーとなります。エラーとなったときにプログラムが止まらないよう事前に「On Error Resume Next」を記述しておくとともに、参照した次の行でエラー番号「Err.Number」を取得し、それが「0」ならエラーなし、つまりValueプロパティを正しく取得できたとして、次の処理へ進みます。
- Valueプロパティの値の中に特定の文字列(ここでは”顧客”)が含まれているかどうかを検査します。
- 指定文字列を含んでいたら、そのフォーム名とコントロール名、およびその”プロパティ名”と”プロパティ値”をイミディエイトウィンドウに出力します。
- そのフォームを閉じます。
ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。
Sub Sample_4_15()
'いずれかのプロパティに特定の文字列を含むコントロールを収集する
Dim dbs As Database
Dim ctn As Container
Dim doc As Document
Dim ctl As Control
Dim prp As Property
Dim strFormName As String
Dim varPrpVal As Variant
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
For Each prp In .Properties
On Error Resume Next
varPrpVal = prp.Value
If Err.Number = 0 Then
If InStr(varPrpVal, strFind) > 0 Then
Debug.Print strFormName,
Debug.Print .Name,
Debug.Print prp.Name,
Debug.Print varPrpVal
End If
End If
On Error GoTo 0
Next prp
End With
Next ctl
DoCmd.Close acForm, strFormName, acSaveNo
Next doc
End Sub
実行例:
|