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」を介さずに、プログラムでデータベースを「再構築」できる能力の入り口に立っています。
次は、これを応用して「日付型フィールドの『入力規則』を一括で変更する」とか、「すべてのテーブルに『更新日時』というフィールドが存在するかチェックする」といった自動化に挑戦してみてください。
プログラミングは、こうやって「小さな自動化」を積み重ねることで、あなたの作業時間は劇的に減り、その分、よりクリエイティブな仕事に時間を割けるようになります。
今日はここまで。このコードをベースに、自分なりのカスタマイズを楽しんでくださいね。応援しています。
