【入門編】【初心者】VBAでテーブル内の全フィールド名をExcelに書き出し、データ辞書を簡易作成する – Access VBA解析バイブル

スポンサーリンク

Accessの「構造」を丸裸にする!VBAでデータ辞書を自動生成する方法

こんにちは。業務自動化の世界へようこそ。

Accessを使っていると、「このテーブル、どんなフィールドがあったっけ?」「データ型は何だっけ?」と確認するために、いちいちデザインビューを開くのが面倒になることはありませんか?

特に大規模なシステムになればなるほど、テーブル定義書(データ辞書)の更新は忘れられがちです。しかし、「Accessの構造は、Access自身が一番よく知っている」のです。

今回は、Accessの内部構造を司る『DAO(Data Access Objects)』を使って、テーブルの全フィールド情報をExcelに一瞬で書き出すスクリプトを伝授します。これさえ理解すれば、あなたはもう「マクロの記録」の枠を超えた、真の自動化エンジニアの入り口に立っていますよ。

—

1. そもそも「TableDef」とは何か?

Accessの裏側には、データベースの骨組みを管理する「DAO」という強力なエンジンが眠っています。その中でも特に重要なのが `TableDef`(テーブル定義) です。

  • Databaseオブジェクト: データベース全体。
  • TableDefsコレクション: データベース内の全テーブルの集合体。
  • TableDefオブジェクト: 個々のテーブルの設計図(フィールド、インデックス、リレーションの情報)。
  • Fieldsコレクション: そのテーブルに含まれる全フィールドの集合体。

この階層構造をプログラムで「巡回(ループ)」することで、どんなに巨大なテーブルでも、一瞬で情報を引き抜くことができるのです。

—

2. 実践:データ辞書生成スクリプト

それでは、実際にコードを書いてみましょう。このスクリプトは、指定したテーブルの情報をExcelシートに書き出します。

事前準備

1. AccessのVBAエディタ(Alt + F11)を開く。
2. メニューの「ツール」→「参照設定」で、「Microsoft Office 16.0 Object Library」(バージョンは適宜)にチェックを入れる。

VBAコード

Sub ExportTableSchemaToExcel()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim i As Long

Set db = CurrentDb
‘ 対象テーブル名(適宜変更してください)
Set tdf = db.TableDefs(“T_売上明細”)

‘ Excelを起動
Set xlApp = CreateObject(“Excel.Application”)
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)

‘ ヘッダーの作成
xlWs.Range(“A1:C1”).Value = Array(“テーブル名”, “フィールド名”, “データ型”)
i = 2

‘ フィールドの情報をループで取得
For Each fld In tdf.Fields
xlWs.Cells(i, 1).Value = tdf.Name
xlWs.Cells(i, 2).Value = fld.Name
xlWs.Cells(i, 3).Value = GetDataTypeName(fld.Type) ‘ 型を文字列に変換
i = i + 1
Next fld

xlApp.Visible = True
MsgBox “データ辞書の作成が完了しました!”, vbInformation
End Sub

‘ データ型の数値を分かりやすい文字列に変換する関数
Function GetDataTypeName(fldType As Integer) As String
Select Case fldType
Case 1: GetDataTypeName = “Yes/No”
Case 4: GetDataTypeName = “長整数型”
Case 10: GetDataTypeName = “テキスト型”
Case 8: GetDataTypeName = “日付/時刻型”
Case Else: GetDataTypeName = “その他(” & fldType & “)”
End Select
End Function

—

3. このコードの「賢いポイント」

① `For Each` 文の力

プログラミング初心者が陥りやすいのが、`For i = 1 To 10` のような添字を使ったループです。しかし、DAOには `For Each` が最適です。「中身がいくつあるか分からない」状況でも、コレクションの終わりまで自動的に処理してくれるため、エラーが起きにくく、コードも非常にスマートになります。

② `GetDataTypeName` 関数による変換

`fld.Type` をそのまま出力すると、「4」や「10」といった数字しか出てきません。これを「長整数型」「テキスト型」といった人間に分かりやすい言葉に変換する関数を切り出しているのがポイントです。「処理の責務を分ける」という、プロの設計思想を意識しています。

—

4. 初心者が陥りやすいエラーと対策

  • 「オブジェクトが必要です」エラー: `Set db = CurrentDb` を忘れていませんか? `db` を定義しただけで満足せず、`Set` を使って実体を代入(インスタンス化)することがVBAの鉄則です。
  • Excelが裏で開きっぱなしになる: もし途中でエラーが起きてプログラムが止まると、Excelのプロセスだけが残り続けます。実務では `On Error GoTo` を使ったエラーハンドリングを追加して、確実にExcelを終了させる「終了処理」を書くのが、プロのエンジニアの流儀です。

—

最後に:ここから先へ

このスクリプトは、全テーブルをループするように改造することも可能です。
`For Each tdf In db.TableDefs` と書くだけで、データベース全体をスキャンする最強のツールに進化します。

「面倒な作業は、すべてAccessに語らせる」。この視点を持てば、あなたの業務自動化ライフは劇的に変わります。まずはこのコードをコピーして、ご自身のデータベースで動かしてみてください。

「動いた!」という感動こそが、エンジニアへの第一歩です。また次のステップでお会いしましょう!

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