【極限のVBA】Accessの「説明」プロパティを完全掌握せよ:ドキュメント化の自動化という聖域へ
現場のエンジニア諸君。君たちはまだ、Excelで「テーブル定義書」なるものをせっせと手動で更新しているのか?
Accessにおける「説明(Description)」プロパティは、単なるメモではない。それは、データベースのメタデータとしてデータベースエンジン内に刻まれる「生きた設計図」だ。これを活用せず、外部ファイルと二重管理を行うなど、保守性の観点から言えば背信行為に等しい。
今回は、Accessの`TableDef`および`Field`オブジェクトを操作し、フィールド説明を一括更新して「ドキュメント化の自動化」を果たすための、実戦的なアーキテクチャを伝授する。
—
なぜ「手動更新」がプロジェクトを殺すのか
フィールド名や型を変更した際、Excelの定義書を直し忘れることは誰にでもある。だが、Accessのプロパティと定義書に乖離が生まれた瞬間、そのシステムは負債へと変貌する。
今回のアプローチは「正解(ソースオブトゥルース)をデータベース内に置く」ことだ。VBAを用いて、外部設定ファイル(またはCSV)から定義を読み込み、フィールドのプロパティを強制的に書き換える。これさえ実装すれば、定義書の更新は「ボタン一つ」で完結する。
—
堅牢な実装のためのアーキテクチャ
単に「代入するだけ」のコードを書くのは素人だ。`Property`オブジェクトは、存在しない場合にアクセスすると容赦なくエラーを吐く。
1. プロパティの存在確認: `Field.Properties`に該当プロパティが存在しない場合は、`CreateProperty`で生成してから付与する。
2. エラーハンドリング: 予期せぬロックや権限不足に対し、トランザクションや適切なエラー終了処理を組み込む。
3. 疎結合設計: 設定データとロジックを分離する(今回は概念実証のためCSV読み込みを想定した構成にする)。
—
プロダクションコード:`UpdateFieldDescriptions`
このコードは、あらかじめ用意した定義CSV(`テーブル名,フィールド名,説明文`)を読み込み、対象テーブルのプロパティを一括更新するものだ。
‘ 参照設定: Microsoft DAO 3.6 Object Library (またはそれ以降)
Public Sub UpdateFieldDescriptions(ByVal strCsvPath As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim fileNum As Integer
Dim lineData As String
Dim items() As String
Set db = CurrentDb
fileNum = FreeFile
‘ CSVの読み込み(実務ではADODB.Stream等で文字コード対策を推奨)
Open strCsvPath For Input As #fileNum
On Error GoTo ErrHandler
Do While Not EOF(fileNum)
Line Input #fileNum, lineData
items = Split(lineData, “,”)
‘ items(0)=テーブル名, items(1)=フィールド名, items(2)=説明文
Set tdf = db.TableDefs(items(0))
Set fld = tdf.Fields(items(1))
‘ プロパティ更新の核:存在チェックと生成
SetProperty fld, “Description”, dbText, items(2)
Debug.Print “更新完了: ” & items(0) & “.” & items(1)
Loop
Close #fileNum
MsgBox “ドキュメント化の自動化が完了しました。”, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Close #fileNum
End Sub
‘ プロパティ設定の共通関数(ここが匠の技)
Private Sub SetProperty(obj As Object, propName As String, propType As Integer, propValue As Variant)
On Error Resume Next
obj.Properties(propName) = propValue
‘ プロパティが存在しない場合は新規作成
If Err.Number = 3270 Then
obj.Properties.Append obj.CreateProperty(propName, propType, propValue)
End If
On Error GoTo 0
End Sub
—
運用上の極意と注意点
- データ型の厳格化: 上記コードの `dbText` は説明文用だ。もし数値型のプロパティを操作する場合はここを `dbLong` 等に変更する必要がある。型を合わせないと `CreateProperty` で実行時エラーが発生する。
- バックエンドの分離: 本番環境(バックエンド)のテーブルを直接更新する場合、排他制御に注意が必要だ。開発環境で定義を更新し、それをデプロイするフローを推奨する。
- システムテーブルの除外: `MSys` で始まるテーブルをループで回さないよう、必ず `(tdf.Attributes And dbSystemObject) = 0` の条件を入れること。うっかりシステムテーブルを壊すと、Accessの挙動が致命的に破損する。
結論
エンジニアの仕事は「作業」をすることではなく、作業を「仕組み化」することだ。今回紹介したプロパティ制御をマスターすれば、君はもうドキュメント作成の残業から解放される。
次にやるべきは、このコードを「Excel上の定義リスト」と連携させ、ボタン一つで同期するUIを構築することだ。君たちの手で、現場の退屈なルーチンを一つずつ駆逐していってほしい。
健闘を祈る。
