【入門編】【中級】テーブル定義から「データ辞書」を自動生成し、Excel仕様書と同期させるVBAスクリプト – Access VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ活躍するエンジニアの皆さん、そして日々のAccess運用に少し頭を悩ませている皆さん、お疲れ様です。

「システムの仕様書が、実際のデータベースの構造とズレていて使い物にならない……」
そんな絶望的な状況に直面したことはありませんか?

システム改修のたびにExcelの設計書を手動で修正するのは、ヒューマンエラーの温床であり、エンジニアにとって最も不毛な作業の一つです。ならば、「データベースの神様(TableDef)」から直接真実のデータを引き出し、Excelの仕様書を自動で錬成してしまえばいいのです。

今回は、Accessの内部構造を司る`TableDef`オブジェクトを完全に手なずけ、ワンクリックで最新の「データ辞書(テーブル定義書)」をExcelに出力・同期させる、実戦的で美しいVBAスクリプトを授けましょう。

ここをクリアすれば、あなたのAccess VBAスキルは単なる「マクロの延長」から、システムアーキテクトの領域へと確実にステップアップしますよ。

—

1. なぜ「TableDef」とExcelを同期させる必要があるのか?

Accessを使っていると、フォームやクエリを作ることに夢中になりがちですが、すべての基盤は「テーブル(Table)」にあります。

  • どのフィールドにどんなデータ型が設定されているか?
  • サイズはいくつで、必須入力(Required)になっているか?
  • 主キー(Primary Key)はどこか?

これらを人間が手作業でExcelに転記しているうちは、プロフェッショナルとは言えません。Accessのエンジン(DAO: Data Access Objects)の中には、テーブルの設計図である`TableDef`コレクションが常に正確な状態保持されています。

この設計図をVBAで読み取り、Excelのシートへ流し込む仕組みを作れば、「DBが変更された瞬間、仕様書も自動で最新になる」という理想的なドキュメント運用フローが完成します。

—

2. 全体像とアーキテクチャの理解

今回のスクリプトがやることの全体像はシンプルです。

1. CurrentDb(現在のデータベース)から、システム内部のテーブル(`_`から始まるシステムテーブルやリンクテーブルを除く)をすべてスキャンする。
2. 各テーブルの`TableDef`オブジェクトから、フィールド名、データ型、サイズ、属性を舐め取る。
3. Excelの新しいワークブックを立ち上げ、綺麗に整えられたフォーマットで「データ辞書」として出力する。

ここで重要になるのが、「DAOのデータ型(整数値)」を、人間が読める文字列(「数値(Long)」「文字列(TEXT)」など)に正しく翻訳する処理です。ここを丁寧に書くことが、知的なエンジニアのこだわりです。

—

3. 実装コード:データ辞書自動生成エンジン

それでは、実際のVBAコードを公開します。
Access側の標準モジュールにこのコードを貼り付け、実行するだけで、デスクトップにピカピカのExcel仕様書が生成されます。

Option Explicit

‘ ==============================================================================
‘ モジュール名: modTableDefinitionExporter
‘ 概要: 現在のAccessデータベースのTableDefから情報を抽出し、Excel仕様書を生成する
‘ ==============================================================================
Public Sub ExportTableDefinitionsToExcel()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim prp As DAO.Property

Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim rowNum As Long
Dim isPrimaryKey As Boolean

On Error GoTo ErrorHandler

‘ 1. 現在のデータベースを参照
Set db = CurrentDb

‘ 2. Excelアプリケーションを起動(レイトバインディングを使用し、参照設定の手間を省略)
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True ‘ 処理の様子が見えるようにする
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “データ辞書”

‘ 3. Excel側のヘッダー行を作成
Call SetupHeader(xlWs)
rowNum = 2 ‘ データの書き込み開始行

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

For Each fld In tdf.Fields

‘ 主キー判定(簡易判定)
isPrimaryKey = CheckIfPrimaryKey(tdf, fld.Name)

‘ Excelへの書き込み
xlWs.Cells(rowNum, 1.Value = tdf.Name ‘ テーブル名
xlWs.Cells(rowNum, 2.Value = GetTableDescription(tdf) ‘ テーブル説明(あれば)
xlWs.Cells(rowNum, 3.Value = fld.Name ‘ フィールド名
xlWs.Cells(rowNum, 4.Value = GetDataTypeName(fld.Type) ‘ データ型
xlWs.Cells(rowNum, 5.Value = fld.Size ‘ サイズ
xlWs.Cells(rowNum, 6.Value = IIf(isPrimaryKey, “○”, “”) ‘ 主キー
xlWs.Cells(rowNum, 7.Value = IIf(fld.Required, “○”, “”) ‘ 必須

‘ 備考欄(値まり対策やデフォルト値など)
On Error Resume Next
xlWs.Cells(rowNum, 8.Value = fld.DefaultValue ‘ 既定値
On Error GoTo ErrorHandler

rowNum = rowNum + 1
Next fld

End If
Next tdf

‘ 5. 見た目を整える
Call FormatWorksheet(xlWs, rowNum – 1)

MsgBox “データ辞書の生成が完了しました!”, vbInformation, “完了”

CleanUp:
‘ オブジェクトの解放(メモリリークを防ぐプロの作法)
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub

‘ — ヘッダー設定用サブルーチン —
Private Sub SetupHeader(ws As Object)
Dim headers As Variant
headers = Array(“テーブル名”, “テーブル説明”, “フィールド名”, “データ型”, “サイズ”, “PK”, “必須”, “既定値”)

Dim i As Long
For i = LBound(headers) To UBound(headers)
ws.Cells(1, i + 1).Value = headers(i)
Next i

‘ ヘッダーのスタイル装飾
With ws.Range(ws.Cells(1, 1), ws.Cells(1, UBound(headers) + 1))
.Interior.Color = RGB(41, 128, 185) ‘ プロっぽいブルー
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
.HorizontalAlignment = -4108 ‘ 中央揃え
End With
End Sub

‘ — DAOのデータ型を文字列に変換する関数 —
Private Function GetDataTypeName(dataType As Integer) As String
Select Case dataType
Case dbBoolean: GetDataTypeName = “Yes/No (Boolean)”
Case dbByte: GetDataTypeName = “バイト (Byte)”
Case dbInteger: GetDataTypeName = “整数 (Integer)”
Case dbLong: GetDataTypeName = “長整数 (Long)”
Case dbCurrency: GettDataTypeName = “通貨 (Currency)”
Case dbSingle: GetDataTypeName = “単精度実数 (Single)”
Case dbDouble: GetDataTypeName = “倍精度実数 (Double)”
Case dbDate: GetDataTypeName = “日付/時刻 (Date)”
Case dbText: GetDataTypeName = “短いテキスト (Text)”
Case dbLongBinary: GetDataTypeName = “OLE オブジェクト”
Case dbMemo: GetDataTypeName = “長いテキスト (Memo)”
Case dbGUID: GetDataTypeName = “GUID”
Case Else: GetDataTypeName = “その他 (” & dataType & “)”
End Select
End Function

‘ — 主キー判定を行うヘルパー関数 —
Private Function CheckIfPrimaryKey(tdf As DAO.TableDef, fieldName As String) As Boolean
Dim idx As DAO.Index
Dim fld As DAO.Field

CheckIfPrimaryKey = False
For Each idx In tdf.Indexes
If idx.Primary Then
For Each fld In idx.Fields
If fld.Name = fieldName Then
CheckIfPrimaryKey = True
Exit Function
End If
Next fld
End If
Next idx
End Function

‘ — テーブルの「説明」プロパティを取得する関数 —
Private Function GetTableDescription(tdf As DAO.TableDef) As String
On Error Resume Next
GetTableDescription = tdf.Properties(“Description”).Value
If Err.Number <> 0 Then GetTableDescription = “”
On Error GoTo 0
End Function

‘ — Excelの見た目を整える仕上げのサブルーチン —
Private Sub FormatWorksheet(ws As Object, maxRow As Long)
With ws
‘ 格子状の罫線を引く
With .Range(.Cells(1, 1), .Cells(maxRow, 8)).Borders
.LineStyle = 1 ‘ xlContinuous
.Color = RGB(200, 200, 200)
End With
‘ 列幅の自動調整
.Columns.AutoFit
End With
End Sub

—

4. 陥りやすい罠と、プロのエンジニアが仕込んだ工夫

このコードには、初学者がつまずきやすいポイントをクリアするための「プロの知見」が随所に盛り込まれています。

① レイトバインディング(CreateObject)の採用

コード内で `CreateObject(“Excel.Application”)` を使っています。これは「レイトバインディング」と呼ばれる手法です。
`Dim xl As New Excel.Application`(アーリーバインディング)にしてしまうと、Excelのバージョンの違い(Office 2016, 2019, 365など)によって参照設定が壊れ、動かなくなる事故が多発します。レイトバインディングにしておけば、環境を選ばず安定して動作します。

② メモリリーク(Objectの解放)の徹底

VBAでExcelを操作するとき、`Set xlApp = Nothing` や `Set db = Nothing` をサボると、見えないところでExcelのプロセス(EXCEL.EXE)がタスクマネージャーに残留し続け、PCのメモリを食いつぶします。
今回のコードでは、エラーが起きても必ず `CleanUp` ラベルにジャンプし、確実にメモリを掃除する設計(防御的プログラミング)にしています。

③ DAO型定数のトラップ

Accessのフィールド型(`fld.Type`)は、内部的には単なる「数値(Integer)」で返ってきます。これをそのままExcelに出力しても「3」や「4」と表示されるだけで、何のこっちゃ分かりません。
`GetDataTypeName` 関数で、人間が読める文字列にしっかり翻訳してあげることが、良い仕様書づくりの秘訣です。

—

5. まとめ:仕様書管理の「自動化」が開発を加速する

いかがでしたでしょうか?
今回は、`TableDef`から情報を抽出し、Excelの綺麗な仕様書として出力するスクリプトを解説しました。

このスクリプトをベースに、さらに以下のような応用へ進むことも可能です。

  • 既存のExcelファイル(会社の指定フォーマット)の特定の位置にデータを流し込む
  • 逆方向(Excelの定義書からテーブルを自動生成・修正するリバースエンジニアリング)への挑戦

「手作業でつじつまを合わせる」という泥臭いエンジニアリングから卒業し、「コードに語らせる・自動化する」というスマートなアプローチを手に入れたあなたなら、どんな巨大なAccessデータベースも怖くありません。

ぜひ現場でこのスクリプトを試し、周囲をあっと言わせる自動化ライフを満喫してください。ここをクリアしたあなたなら、もうAccess VBAの基礎はバッチリです!

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