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

スポンサーリンク

「神」は細部に宿る:Accessメタデータによる自動ドキュメンテーションの極意

Access開発の現場において、最も不毛で、かつ最も腐敗しやすいのが「仕様書」だ。開発のスピードにドキュメントの更新が追いつかないのは必然であり、数ヶ月後の我々が目にするのは、現物と乖離した「死んだ設計図」である。

真のシニアエンジニアは、ドキュメントを手で書かない。システム自身に自らの設計図を語らせるのだ。

今日は、DAO(Data Access Objects)を掌握し、Accessの内部構造から「真実のデータ辞書」を自動生成するアーキテクチャを伝授する。これは単なるスクリプトではない。レガシーシステムの墓場から仕様を救い出し、継続的な保守を可能にするための「生存戦略」だ。

1. DAOの深層:なぜCurrentDbを安易に使い回してはいけないのか

多くの初学者は`CurrentDb`を連発するが、これはメモリ管理の観点から見れば愚策だ。`CurrentDb`を呼び出すたびに新たなデータベースオブジェクトが生成され、内部的なオーバーヘッドを招く。

大規模な解析を行う際は、必ずオブジェクトを明示的に保持し、スコープを制御する。メモリリークを恐れず、しかし確実に解放する。これがプロの流儀だ。

2. 実装:メタデータ抽出エンジン

以下のコードは、テーブル定義を走査し、フィールドの型、サイズ、説明(Descriptionプロパティ)を抽出し、Excelへ書き出すためのコアロジックだ。

Option Compare Database
Option Explicit

‘ メモリ最適化のため、DAOオブジェクトは明示的に参照を保持する
Public Sub GenerateDataDictionary()
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

Set db = CurrentDb
Set xlApp = CreateObject(“Excel.Application”)
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)

‘ ヘッダーの設定
xlWs.Range(“A1:E1”).Value = Array(“テーブル名”, “論理名”, “物理名”, “型”, “桁数”)
rowIdx = 2

‘ テーブルのループ処理
For Each tdf In db.TableDefs
‘ システムテーブルを除外(頭文字がMSysのものをスキップ)
If Left(tdf.Name, 4) <> “MSys” Then
For Each fld In tdf.Fields
xlWs.Cells(rowIdx, 1).Value = tdf.Name
xlWs.Cells(rowIdx, 3).Value = fld.Name
xlWs.Cells(rowIdx, 4).Value = GetDataTypeName(fld.Type)
xlWs.Cells(rowIdx, 5).Value = fld.Size
rowIdx = rowIdx + 1
Next fld
End If
Next tdf

xlApp.Visible = True

‘ クリーンアップ:オブジェクトの参照解放を怠るな
Set fld = Nothing
Set tdf = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
db.Close
Set db = Nothing
End Sub

‘ DAOの型定数を文字列に変換するヘルパー
Private Function GetDataTypeName(fldType As Integer) As String
Select Case fldType
Case 1: GetDataTypeName = “Boolean”
Case 4: GetDataTypeName = “Long”
Case 10: GetDataTypeName = “Text”
‘ 必要に応じてケースを追加
Case Else: GetDataTypeName = “Unknown(” & fldType & “)”
End Select
End Function

3. 高度な保守:Propertiesコレクションのハック

Accessのフィールドには、画面上からは見えない「Property」が隠されている。特に重要なのが `Description` プロパティだ。これが空欄になっているテーブルは、数年後に「何のための列か」を誰も証明できなくなる。

以下のようにして、カスタムプロパティを安全に取得する手法を推奨する。

Private Function GetFieldDescription(fld As DAO.Field) As String
On Error Resume Next ‘ プロパティが存在しない場合のトラップ
GetFieldDescription = fld.Properties(“Description”).Value
If Err.Number <> 0 Then GetFieldDescription = “”
On Error GoTo 0
End Function

4. 伝説のアーキテクトからの提言

この自動生成ツールを、CI/CDのパイプラインに組み込むことを推奨する。
1. コミット時: VBAコードで仕様書(Excel)を生成。
2. 比較: 前回の仕様書と差分を検出し、変更点がないかチェック。
3. 同期: 仕様書が更新されていなければ、開発者にアラートを出す。

「仕様書を書く時間がない」という言い訳は、もはや通用しない。システムが自らの姿をドキュメントとして吐き出す仕組みこそが、レガシーを「保守可能な資産」へと昇華させる唯一の道だ。

Accessは古い技術ではない。それを扱う人間が、古い考えに固執しているだけだ。今すぐあなたのシステムに、自らを記述させるコードを注入せよ。それが、技術者として生き残るための最低条件である。

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