【入門編】【初心者】特定のデータ型(例:日付型)を持つフィールドを検索し、そのプロパティを一覧表示するツール – Access VBA解析バイブル

スポンサーリンク

Accessの「構造」を指先で操る――TableDefでデータベースの全貌を暴く方法

こんにちは。データという海を渡るための航海術を伝授する、アーキテクトの先輩です。

Accessを使っていると、「このテーブル、どのフィールドが日付型だったっけ?」「全部のテーブルの日付フィールドを洗い出したい」という場面に必ず遭遇します。マウスで一つずつプロパティを開いて確認するのは、エンジニアの仕事ではありません。それは「作業」であり、「開発」ではないからです。

今日は、Accessの内部構造を司る「DAO(Data Access Objects)」の力を借りて、データベース内の全テーブルから特定のデータ型を持つフィールドを瞬時に抽出するツールを一緒に作りましょう。

—

Access VBAにおける「DAO」とは何か?

Accessは、画面上のテーブルやクエリを「オブジェクト」として扱っています。このオブジェクトをプログラムから制御するための窓口がDAOです。

今回使うのは以下の3つの階層です。
1. Database: 今開いているデータベース全体。
2. TableDef: 個々のテーブルの定義情報(名前、フィールド、インデックスなど)。
3. Field: テーブルの中にある具体的な列(データ型、サイズなど)。

この親子関係を理解すれば、Accessの内部はすべてあなたの掌中に収まります。

—

【実践】日付型フィールドを全探索するVBAコード

以下のコードを、標準モジュールにコピー&ペーストしてください。このコードは、データベース内のすべてのテーブルを巡回し、データ型が「日付/時刻型(dbDate)」であるものを探し出して、その詳細をイミディエイトウィンドウに出力します。

Option Compare Database
Option Explicit

‘ データベース内の全テーブルから指定したデータ型のフィールドを検索するプロシージャ
Public Sub FindFieldsByType()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

‘ 現在のデータベースを取得
Set db = CurrentDb

‘ 全テーブルをループ処理
For Each tdf In db.TableDefs
‘ システムテーブル(MSysで始まるもの)は除外する
If Left(tdf.Name, 4) <> “MSys” Then

‘ 各テーブル内の全フィールドをループ処理
For Each fld In tdf.Fields
‘ ★ここで「日付型(dbDate)」を判定
‘ dbDateはAccess内部の定数で、日付型を指します
If fld.Type = dbDate Then

‘ 結果をイミディエイトウィンドウに表示
Debug.Print “テーブル名: ” & tdf.Name & _
” | フィールド名: ” & fld.Name & _
” | データ型ID: ” & fld.Type
End If
Next fld

End If
Next tdf

‘ 後片付け(メモリ解放)
Set db = Nothing

Debug.Print “— 検索完了 —”
End Sub

コードのポイント解説

  • `CurrentDb`: 今、自分が触っているデータベースの「司令塔」を呼び出す魔法の言葉です。
  • `For Each … In …`: コレクション(テーブルの集まりなど)を順番に取り出す、非常に効率的なループ構文です。
  • `If Left(tdf.Name, 4) <> “MSys”`: ここがプロのこだわりです。Accessには「MSys」で始まるシステム管理用のテーブルが存在します。これに触れるとエラーの原因になるので、最初から除外しておくのが安全な開発者の作法です。
  • `dbDate`: これはDAOで定義された定数です。数値型なら`dbDouble`、テキスト型なら`dbText`など、ここを変えるだけで他の型も簡単に検索可能です。

—

陥りやすい罠と解決策

初心者の頃、多くの人がここで躓きます。

1. 「型が一致しません」というエラー

  • 参照設定([ツール] -> [参照設定])で「Microsoft Office 16.0 Access database engine Object Library」にチェックが入っているか確認してください。これがないとDAOが動きません。

2. システムテーブルへのアクセス権

  • 先ほどの`If`文を忘れると、読み取り専用のシステムテーブルにアクセスしようとしてエラーになります。常に「触らぬ神(システム)に祟りなし」の精神で。

3. イミディエイトウィンドウが見当たらない!

  • VBAエディタで `Ctrl + G` を押してください。そこに結果が表示されます。ここがエンジニアにとっての「コンソール(作業場)」になります。

—

次のステップへ:ここをクリアすれば「脱・初心者」

このツールが動いたなら、あなたはもう「AccessのGUI」を介さずに、プログラムでデータベースを「再構築」できる能力の入り口に立っています。

次は、これを応用して「日付型フィールドの『入力規則』を一括で変更する」とか、「すべてのテーブルに『更新日時』というフィールドが存在するかチェックする」といった自動化に挑戦してみてください。

プログラミングは、こうやって「小さな自動化」を積み重ねることで、あなたの作業時間は劇的に減り、その分、よりクリエイティブな仕事に時間を割けるようになります。

今日はここまで。このコードをベースに、自分なりのカスタマイズを楽しんでくださいね。応援しています。

タイトルとURLをコピーしました