40 コントロール系 - いずれかのプロパティに特定の文字列を含むコントロールを収集する

カレントデータベース内にあるすべてのフォームとその中のすべてのコントロール、さらには各コントロールのすべてのプロパティを探索し、そのプロパティの値に特定の文字列を含むコントロールの一覧を収集します。
  1. 「Database」オブジェクト「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each〜Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。

  2. 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。

  3. フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。

  4. そのフォーム内に配置されているすべてのコントロールのコレクションである「Controls」の中から、For Each〜Nextステートメントでひとつずつコントロール情報を取り出し、「Control」オブジェクトの変数「ctl」にセットしていきます。

  5. 取り出されたひとつのコントロールについて、すべてのプロパティのコレクションである「Properties」の中から、For Each〜Nextステートメントでひとつずつプロパティ情報を取り出し、「Property」オブジェクトの変数「prp」にセットしていきます。

  6. 取り出されたひとつのプロパティの設定値である「Value」プロパティの値を変数「varPrpVal」にセットします。

    このとき、Valueプロパティのないプロパティからそれを参照しようとするとエラーとなります。エラーとなったときにプログラムが止まらないよう事前に「On Error Resume Next」を記述しておくとともに、参照した次の行でエラー番号「Err.Number」を取得し、それが「0」ならエラーなし、つまりValueプロパティを正しく取得できたとして、次の処理へ進みます。

  7. Valueプロパティの値の中に特定の文字列(ここでは”顧客”)が含まれているかどうかを検査します。

    ※ここでは「InStr」関数を使っています。この関数は指定文字列が見つかった場合はその位置を返し、見つからなければ”0”を返しますので、”0より大きければその文字列が含まれている”と判定することができます。

  8. 指定文字列を含んでいたら、そのフォーム名とコントロール名、およびその”プロパティ名”と”プロパティ値”をイミディエイトウィンドウに出力します。

  9. そのフォームを閉じます。
    ここではデータ収集のみでデザイン変更はありませんので、引数に「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

実行例:
| Index | Prev | Next |



Copyright © T'sWare All rights reserved