41 コントロール系 - 使用不可または編集ロックされたコントロールを収集する

カレントデータベース内にあるすべてのフォームとその中のすべてのコントロールを探索し、使用不可(使用可能=”いいえ”)または編集ロックされた(編集ロック=”はい”)コントロールの一覧を収集します。
  1. 「Database」オブジェクト「Container」オブジェクトを設定し、「Documents」コレクションの中から、For Each〜Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。

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

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

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

  5. 取り出されたひとつのコントロールについて、まず「使用可能」プロパティである「Enabled」の値を変数「blnEnabled」にセットします。

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

    ※エラーが発生していた場合には、そのプロパティ値のチェックをしないとともに、「Err.Clear」によってエラー状態をクリアします。

  6. ここでは「使用可能=”いいえ”」のコントロールだけ収集するので、変数blnEnabledがTrueでなければそのフォーム名とコントロール名をイミディエイトウィンドウに出力します。

  7. 次に、「編集ロック」プロパティである「Locked」について、上記と同じような処理で変数「blnLocked」にセットします。

  8. ここでは「編集ロック=”はい”」のコントロールだけ収集するので、変数blnLockedがTrueならそのフォーム名とコントロール名をイミディエイトウィンドウに出力します。

    ※2つのプロパティを連続して収集するのではなく、それぞれについてエラー処理を含めた構造にしているのは、両方のプロパティを持ったコントロール/いずれも持たないコントロールだけでなく、一方のみを持ったコントロールの種類もあるためです。2グループに分けて処理することでそれらの組み合わせに対応させています。
    ※最後に「On Error GoTo 0」を実行することでもエラー番号はクリアされています。

  9. そのフォームを閉じます。
    ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。

Sub Sample_4_16()
'使用不可または編集ロックされたコントロールを収集する

  Dim dbs As Database
  Dim ctn As Container
  Dim doc As Document
  Dim ctl As Control
  Dim strFormName As String
  Dim blnEnabled As Boolean
  Dim blnLocked As Boolean

  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
        On Error Resume Next
        blnEnabled = .Enabled
        If Err.Number = 0 Then
          If Not blnEnabled Then
            Debug.Print strFormName,
            Debug.Print .Name & " → 使用不可"
          End If
        Else
          Err.Clear
        End If
        blnLocked = .Locked
        If Err.Number = 0 Then
          If blnLocked Then
            Debug.Print strFormName,
            Debug.Print .Name & " → 編集ロック"
          End If
        End If
        On Error GoTo 0
      End With
    Next ctl
    DoCmd.Close acForm, strFormName, acSaveNo
  Next doc

End Sub

実行例:


| Index | Prev | Next |



Copyright © T'sWare All rights reserved