8 テーブル系 - あるフィールドが特定の値であるレコードを収集する(完全一致)

カレントデータベース内にあるすべてのテーブル・フィールドを探索し、そこに保存されているデータが特定の値と完全一致するレコードを収集します。
  1. まず「Database」オブジェクトの変数である「dbs」に”カレントデータベース”をセットします。

  2. そのデータベース内にあるすべてのテーブルのコレクションである「TableDefs」の中から、For Each〜Nextステートメントでひとつずつテーブル情報を取り出し、「TableDef」オブジェクトの変数「tdf」にセットしていきます。

  3. TableDefsコレクションにはシステムテーブルや隠しテーブルも含まれているので、「Attributes」プロパティの値からテーブル属性を判断し、If文でそれらを除外します。

  4. 「tdf」オブジェクト変数に取得したひとつのテーブルについて、そこに実際に保存されているレコード内容を見るため、まずレコードセットを開きます。

    ※ここでは後述の「AbsolutePosition」プロパティを利用してレコード番号を取得するようにしています。そのプロパティを参照するため、組み込み定数「dbOpenSnapshot」を指定して、スナップショットタイプのレコードセットを開いています。

  5. Do〜Loopステートメントによって、そのレコードセットからすべてのレコードをループで読み込みます。

    ※ループ内において「MoveNext」メソッドを実行することで、次のレコードに移動します。
    ※最後のレコードを越えると「EOF」プロパティがTrueに変わり、ループを抜けます。

  6. ひとつのレコードについて、さらにFor Each〜Nextステートメントで各フィールドを探索するループを構成します。

    テーブル内のフィールドのコレクションである「Fields」の中からひとつずつフィールド情報を取り出し、「Field」オブジェクトの変数「fld」にセットしていきます。

  7. 変数「fld」の値(fld.Valueプロパティの省略形)が特定の値(ここでは10)であるかを比較照合し、完全に一致したらそのテーブル名/レコード番号/フィールド名をイミディエイトウィンドウに出力します。

    その際、テーブル名とフィールド名についてはそれぞれのオブジェクトの「Name」プロパティの値を使っています。

    また、レコード番号については「Recordset」オブジェクト「AbsolutePosition」プロパティの値を使っています。このプロパティは先頭レコードを「0」と数えますので、出力する際に+1しています。

Sub Sample_1_08()
'あるフィールドが特定の値であるレコードを収集する(完全一致)

  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field
  Dim rst As Recordset
  Dim varFind As Variant

  varFind = 10

  Set dbs = CurrentDb
  For Each tdf In dbs.TableDefs
    With tdf
      If ((.Attributes And dbSystemObject) Or _
          (.Attributes And dbHiddenObject)) = 0 Then
        Set rst = dbs.OpenRecordset(.Name, dbOpenSnapshot)
        Do Until rst.EOF
          For Each fld In rst.Fields
            If fld = varFind Then
              Debug.Print .Name,
              Debug.Print rst.AbsolutePosition + 1 & "レコード目の" & fld.Name
            End If
          Next fld
          rst.MoveNext
        Loop
        rst.Close
      End If
    End With
  Next tdf

End Sub

実行例:


| Index | Prev | Next |



Copyright © T'sWare All rights reserved