【入門編】【初心者】VBAでテーブル内の全フィールドの「データ型」を判定し、特定の型のみを抽出する実務ツール – Access VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリとAccessやVBAを使っていると、ふとこんな壁にぶつかりませんか?

「他のシステムからCSVやExcelのデータをインポートしたはいいものの、なんだかフィールドのデータ型がバラバラでエラーが出る……」
「数え切れないほどのテーブルとフィールドがある中で、どのフィールドが『数値型』で、どれが『テキスト型』なのか、目視で確認していくなんて気が遠くなる……!」

分かります、その気持ち。何十個もあるテーブルの構造をポチポチ開きながら確認するのは、エンジニアにとって最も不毛な時間ですよね。

でも、安心してください。ここをクリアすれば、Access VBAの基本はバッチリですよ!
今回は、DAO(Data Access Objects)というAccessの心臓部を鮮やかに使いこなし、「指定したデータ型のフィールドだけを瞬時に見つけ出す実務ツール」を一緒に作っていきましょう。

マクロの記録から一歩抜け出し、本当の意味でAccessを「手足のように動かす」ための第一歩です。さあ、知的でスマートな自動化の世界へ飛び込みましょう!

—

1. そもそも「DAO」ってなに?(怖くない基本のキ)

VBAでテーブルの構造をいじったり調べたりするとき、私たちはDAO(Data Access Objects)という仕組みを使います。

なんだか難しそうな名前ですが、要するに「Accessのデータベースを裏側から操るための専用リモコン」だと思ってください。

このリモコンの構造は、綺麗なお人形「マトリョーシカ」のようになっています。

  • Database(データベース自体)
  • └ TableDef(テーブルの設計図)
  • └ Field(フィールド=列の定義)

今回はこのリモコンをVBAから操作して、「設計図(TableDef)」の中にある「列(Field)」を1つずつ覗き見し、「君のデータ型は何だい?」とチェックしていくプログラムを書きます。

—

2. フィールドの「データ型」を判定する仕組み

DAOの世界では、フィールドのデータ型は `Field.Type` というプロパティ(性質)に、「数字(整数)」として格納されています。

例えば、代表的なものはこんな感じです。

| データ型の名前(Access画面上) | DAOでの内部数値(常量) | VBAでの書き方 |
| :— | :— | :— |
| テキスト型 | 10 | `dbText` |
| 数値型(Longなど) | 4 | `dbLong` |
| 日付/時刻型 | 8 | `dbDate` |
| Yes/No型 | 1 | `dbBoolean` |

「えっ、数字で覚えないといけないの?」と思ったそこのあなた、ご安心を!
VBAにはあらかじめ親切な名前(定数:`dbText` や `dbLong` など)が用意されているので、私たちはその名前を使うだけでOKです。

—

3. 実践!データ型を抽出するプロフェッショナルなコード

お待たせしました。それでは実際のコードを見ていきましょう。
今回は、指定したテーブルの中にある全フィールドをチェックし、「テキスト型(dbText)」のフィールドだけをイミディエイト窓にリストアップするツールを作成します。

以下のコードを、VBAの標準モジュールにそのまま貼り付けてみてください。

Option Explicit

‘ =====================================================================
‘ プロシージャ名:CheckFieldTypes
‘ 概要:指定したテーブルのフィールドを走査し、特定のデータ型を抽出する
‘ =====================================================================
Public Sub CheckFieldTypes()
‘ 1. 変数の宣言(DAOの世界への扉を開く準備)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

‘ 調査したいテーブル名をここに指定します(実際のテーブル名に変更してください)
Const TARGET_TABLE As String = “T_顧客マスタ”

‘ 2. 現在のデータベースをオブジェクトにセット
Set db = CurrentDb

On Error GoTo ErrorHandler

‘ 3. 対象のテーブル設計図(TableDef)を取得
Set tdf = db.TableDefs(TARGET_TABLE)

‘ 4. ヘッダー情報をイミディエイトウィンドウに出力
Debug.Print “==========================================”
Debug.Print ” テーブル名: ” & tdf.Name & ” の型チェック結果”
Debug.Print “==========================================”

‘ 5. 【ここが核心】テーブル内の全フィールドを「For Each」で総なめする
For Each fld in tdf.Fields

‘ フィールドのデータ型が「テキスト型(dbText)」であるかを判定
If fld.Type = dbText Then
‘ 一致した場合のみ、フィールド名とサイズを表示
Debug.Print ” [発見!] フィールド名: ” & fld.Name & _
” (型: テキスト型 / サイズ: ” & fld.Size & “文字)”
End If

Next fld

Debug.Print “==========================================”
Debug.Print ” 処理が正常に完了しました。”

‘ 6. 後片付け(メモリの解放はエンジニアのたしなみです)
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Exit Sub

ErrorHandler:
‘ エラーハンドリング(テーブルが存在しない場合などの対策)
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”

‘ エラー時も確実にメモリを解放
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
End Sub

コードのここがポイント!

  • `For Each fld In tdf.Fields`

人間がやると面倒な「上から順に見ていく」という作業を、VBAが一瞬でこなしてくれます。

  • `If fld.Type = dbText Then`

ここで条件分岐をしています。ここを `dbLong` に変えれば「数値型」だけに、`dbDate` に変えれば「日付型」だけに絞り込むことができます。

  • メモリの解放 (`Set xxx = Nothing`)

プログラミングの基本中の基本。使ったリモコン(オブジェクト)は、使い終わったらきちんと元の位置(メモリから開放)に戻すのが、デキるエンジニアの流儀です。

—

4. 初学者がハマりやすい「3つの罠」と回避策

実際にこのコードや応用コードを書くとき、初心者がよく躓くポイントを先回りして解説しておきますね。ここを知っていればもう怖くありません。

① 「そんな名前のテーブル無いよ!」というエラー (実行時エラー ‘3265’)

  • 原因: `Const TARGET_TABLE` に指定したテーブル名が間違っている、または存在しない場合に発生します。
  • 対策: Accessの左側にあるナビゲーションウィンドウのテーブル名と、半角・全角も含めて一字一句合っているか確認してください。

② 見た目と中身のデータ型のギャップ

  • 原因: Accessの画面上で「ルックアップウィザード」を使っているフィールドや、「通貨型」などの特殊な型は、単純な `dbText` や `dbLong` と判定されないことがあります。
  • 対策: まずはプレーンな「短いテキスト」「数値(長整数)」といった基本の型から検証を始めるのが、挫折しないコツです。

③ イミディエイトウィンドウってどこに出るの?

  • 対策: VBAの画面(VBE)を開いた状態で、キーボードの `[Ctrl] + [G]` を押してみてください。画面の下側に白い枠が現れますよね?そこが結果が表示される「イミディエイトウィンドウ」です。

—

おわりに:ここをクリアすれば、もう初心者じゃない!

お疲れ様でした!今回はDAOを使ったテーブル定義の覗き見と、データ型の判定方法について解説しました。

「画面をポチポチ操作するしかなかった情報」を、自分の書いたコードが一瞬で暴いてくれる――この快感を覚えてしまったら、もう元の手作業には戻れなくなっているはずです。

この技術をベースに、「すべてのテーブルから特定型のフィールドを洗い出す」「データ移行前の型チェックツールを作る」といった実務ツールへ発展させてみてください。

あなたのAccessライフが、よりスマートで創造的なものになりますように。
それでは、次の現場でお会いしましょう!

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