こんにちは! Access VBAの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でAccessの心臓部をコントロールしたいと思っているあなたへ。
今回は、現場でめちゃくちゃ役立つ「特定のデータ型を持つフィールドだけを抽出してリスト化するツール」の作り方を解説します。
「あのシステムにある日付型のフィールド、一体どのテーブルのどこに入ってるんだっけ……?」
そんな絶望的な状況に出会ったことはありませんか? 巨大なデータベースになればなるほど、構造の把握は困難になります。それを一瞬で自動化し、Excelのリストのように可視化してしまうのが今回のツールです。
ここをクリアすれば、Access VBAの「テーブル構造の裏側を覗く技術」の基本はバッチリですよ。優しく、そして本質的なところまでしっかりガイドしていきますね!
—
1. なぜ「テーブルの裏側(TableDef)」を知る必要があるのか?
普段、私たちはAccessの画面(デザインビュー)でテーブルを作ったり、フィールドを追加したりしていますよね。でも、VBAの世界では、画面を見なくてもデータベースの設計図(メタデータ)を直接操作・参照することができます。
これを司るのが、DAO(Data Access Objects)という仕組みです。
その中核にあるのが、以下の3つの階層構造です。
- Databaseオブジェクト:今開いているAccessファイルそのもの
- TableDefオブジェクト:各テーブルの設計図
- Fieldオブジェクト:テーブルの中にある個別の項目(フィールド)
「どのテーブルに、どんなデータ型のフィールドがあるか」を探す旅に出るには、この階層をVBAのループ(For文)でぐるぐると巡回(走査)してあげる必要があります。
—
2. 実装:一瞬で全テーブルから特定型を炙り出すスクリプト
それでは早速、開発の現場でそのままコピペして使える実用コードを公開します。
今回は例として、「日付/時刻型(Date型)」のフィールドをすべて探し出し、イミディエイトウィンドウに一覧表示するツールを作ってみましょう。
🛠️ 準備:VBAエディタの開き方
1. Accessを開き、キーボードの `[Alt] + [F11]` を押してVBAエディタを開きます。
2. メニューの「挿入」>「標準モジュール」をクリックします。
3. 開いた真っ白な画面に、以下のコードをそのまま貼り付けます。
📝 抽出ツールのVBAコード
Option Explicit
‘ =====================================================================
‘ 手順名:指定したデータ型のフィールドを全テーブルから検索してリスト化
‘ 解説者:あなたの専属チーフアーキテクト
‘ =====================================================================
Public Sub SearchFieldsByType()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
‘ 検索したいデータ型を定数で定義(今回は日付/時刻型:dbDate)
‘ ※数値型なら dbLong、テキスト型なら dbText などに変更可能
Const TARGET_TYPE As Integer = dbDate
Dim matchCount As Long
matchCount = 0
‘ 現在接続しているデータベースを取得
Set db = CurrentDb
Debug.Print “=== 【検索開始】データ型ID: ” & TARGET_TYPE & ” のフィールド一覧 ===”
‘ 1. すべてのテーブル設計図(TableDefs)を上から順に見ていく
For Each tdf In db.TableDefs
‘ 【重要】システムが自動作成したテーブル(頭に “MSys” や “~” がつくもの)は除外する
‘ これをサボるとシステムエラーや無駄な処理で痛い目をみます!
If Left(tdf.Name, 4) <> “MSys” And Left(tdf.Name, 1) <> “~” Then
‘ 2. そのテーブルの中にあるすべてのフィールド(Fields)を見ていく
For Each fld In tdf.Fields
‘ 3. 目的のデータ型と一致するか判定
If fld.Type = TARGET_TYPE Then
‘ 一致したら、テーブル名とフィールド名をセットで出力
Debug.Print “テーブル名: ” & tdf.Name & ” > フィールド名: ” & fld.Name
matchCount = matchCount + 1
End If
Next fld
End If
Next tdf
Debug.Print “=== 【検索終了】 合計 ” & matchCount & ” 件のフィールドが見つかりました ===”
‘ メモリの解放(プログラミングの美しい作法)
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
MsgBox “検索が完了しました!イミディエイトウィンドウを確認してください。”, vbInformation, “完了”
End Sub
—
3. コードのキモを優しく解説!初心者が見落としがちなポイント
このコードには、実務で絶対に知っておくべきプログラミングの知見が詰まっています。いくつか重要なポイントをピックアップしますね。
① システムテーブルの除外(罠への対策)
コード内の `If Left(tdf.Name, 4) <> “MSys” …` という部分。
Accessの裏側には、ユーザーが見えないところで動作するための「システムテーブル」がたくさん隠されています。これらをうっかり触ろうとすると、「権限がありません」といったエラーでVBAが強制終了してしまいます。
「ユーザーが作った普通のテーブルだけを相手にする」というフィルターをかけるのが、プロのエンジニアの第一歩です。
② `fld.Type` の正体とデータ型の見分け方
フィールドのデータ型を判定している `fld.Type` ですが、中身は数値(定数)で管理されています。
今回は `dbDate`(日付/時刻型)を指定しましたが、必要に応じてここを書き換えることで、あらゆる型に対応できます。
- `dbText` :短いテキスト型
- `dbMemo` :長いテキスト型(メモ型)
- `dbLong` :長整数型(数値)
- `dbBoolean`:Yes/No型
※より高度なデータ型(通貨型やバイト型など)を扱いたい場合は、DAOの定数リファレンスを調べてみてください。
③ メモリの掃除(`Set ○○ = Nothing`)
処理の最後に、使ったオブジェクトを `Nothing` でクリアしています。
「動くからいいや」とこれをサボる初心者が多いのですが、Access VBAではオブジェクト変数にメモリが居座り続ける現象(メモリリーク)が起きてファイルが重くなる原因になります。
「借りたものは返す、使い終わったら空にする」。この綺麗好きなコーディング習慣が、あなたを一段上のエンジニアへと引き上げます。
—
4. 実行してみよう!
1. コードを書いた状態で、キーボードの `[F5]` キーを押すか、上部の再生ボタン▶を押して実行します。
2. 処理が一瞬で終わると、メッセージボックスが表示されます。
3. キーボードの `[Ctrl] + [G]` を押して「イミディエイトウィンドウ」を開いてみてください。
ズラリと、どのテーブルのどのフィールドが日付型なのかがリスト化されているはずです!
—
おわりに
お疲れ様でした!
今回は「特定のデータ型を持つフィールドを抽出するツール」を通じて、DAOを用いたテーブル構造の走査方法を学びました。
このベースのコードが書ければ、次は「見つかったフィールドのプロパティを書き換える」「別のテーブルにログとして保存する」「Excelファイルに出力する」といった、さらなる自動化の海原へ漕ぎ出すことができます。
Access VBAの奥深さと自由度を感じてもらえたら嬉しいです。
あなたの開発ライフが、もっと快適でエキサイティングなものになりますように。チーフアーキテクトより、愛を込めて。
