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

スポンサーリンク

Accessメタデータ抽出の真髄:TableDefを掌握し、システム構成を可視化する

システム開発の現場において、ドキュメントの欠落は「技術的負債」の代名詞だ。特に長年運用されたAccessシステムでは、テーブル定義書が最新の状態と乖離していることは珍しくない。

「現状、何があるのか?」を正確に把握する。これは保守運用の第一歩であり、伝説的なシステムアーキテクトが最も重きを置く儀式だ。今回は、DAO(Data Access Objects)を直接叩き、テーブル構造をExcelへ抽出するコードを、メモリ管理の観点から解説する。

なぜDAOなのか? ADOではダメなのか?

Accessのテーブル定義を制御する場合、ADO(ActiveX Data Objects)ではなく、DAOを使用するのが正解だ。

ADOは汎用的なデータアクセスには適しているが、Accessの内部定義(DAO.TableDef)へアクセスする際は、エンジンとの親和性が低くオーバーヘッドが大きい。DAOはAccessのデータベースエンジン(ACE/Jet)と直結しているため、構造情報へのアクセスが極めて高速であり、かつ詳細なメタデータを取得できる。

実装:データ辞書自動生成スクリプト

以下に、メモリリークを許さない堅牢なVBAコードを提示する。

Option Explicit

‘ ———————————————————
‘ Accessの全テーブル構造をExcelへ出力し、データ辞書を構築する
‘ 著者: 伝説のアーキテクト
‘ ———————————————————
Sub ExportTableStructureToExcel()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim xlApp As Object, xlWb As Object, xlWs As Object
Dim rowIdx As Long

‘ 1. インスタンス生成(Late Bindingによる環境依存の排除)
Set db = CurrentDb
Set xlApp = CreateObject(“Excel.Application”)
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)

‘ ヘッダーの設定
xlWs.Range(“A1:D1”).Value = Array(“テーブル名”, “フィールド名”, “データ型”, “サイズ”)
rowIdx = 2

‘ 2. メインループ:オブジェクトの入れ子構造を制御
‘ 隠しテーブル(MSys…)を除外するフィルタリング処理
For Each tdf In db.TableDefs
If Left(tdf.Name, 4) <> “MSys” Then
For Each fld In tdf.Fields
With xlWs
.Cells(rowIdx, 1).Value = tdf.Name
.Cells(rowIdx, 2).Value = fld.Name
.Cells(rowIdx, 3).Value = GetDataTypeName(fld.Type)
.Cells(rowIdx, 4).Value = fld.Size
End With
rowIdx = rowIdx + 1
Next fld
End If
Next tdf

xlApp.Visible = True

‘ 3. 究極のクリーンアップ:オブジェクトの明示的解放
‘ VBAのガベージコレクションを待つな。メモリは自ら管理せよ。
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub

‘ DAOの定数を読みやすい文字列に変換するヘルパー関数
Private Function GetDataTypeName(dataType As Integer) As String
Select Case dataType
Case dbLong: GetDataTypeName = “長整数型”
Case dbText: GetDataTypeName = “テキスト型”
Case dbDate: GetDataTypeName = “日付/時刻型”
Case dbBoolean: GetDataTypeName = “Yes/No型”
Case dbDouble: GetDataTypeName = “倍精度浮動小数点型”
Case Else: GetDataTypeName = “その他(” & dataType & “)”
End Select
End Function

アーキテクトの視点:コードを読み解く鍵

1. Late Binding(遅延バインディング)の採用

`CreateObject` を使用することで、参照設定のバージョン不一致による「コンパイルエラー」を回避している。配布先の環境が不定なシステム運用では、これが最も安全な戦略だ。

2. メモリの明示的解放

VBAのオブジェクト変数は、スコープを抜ければ自動解放されるが、大規模なループ処理やDB接続においては、明示的に `Nothing` を代入する習慣をつけろ。これはメモリリークを防ぐだけでなく、ロックファイルの残留リスクを最小化する。

3. 「MSys」テーブルの除外

Accessには内部管理用のテーブル(MSys~)が存在する。これらを取得対象に含めると、システム全体の構成把握を阻害するノイズとなる。システムエンジニアとして、データ辞書に「本当に必要なメタデータ」だけを抽出するフィルタリングは必須のスキルだ。

結びに代えて

システム管理とは、魔法のようにコードを動かすことではない。「何がどうなっているか」を冷徹に可視化し、管理下に置くことである。このスクリプトは、あなたの手元にある肥大化したAccessデータベースの闇を照らす灯火となるはずだ。

次は、これを基に「リレーションシップ図」を自動生成する手法、あるいは「変更履歴(監査ログ)」を追跡するためのシステムテーブル監視手法について語ろうか。準備ができたら、また来い。

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