【テクニカル・上級編】【中級】フィールドの「説明」プロパティをVBAで一括更新してドキュメント化を自動化する – Access VBA解析バイブル

スポンサーリンク

現場の遺産を「生きたドキュメント」へ:DAOを用いたフィールド説明プロパティの完全自動更新術

Access開発の現場で最も忌むべきは、「システムとドキュメントの乖離」だ。
設計書がExcelで管理され、実際のテーブル定義と同期していない――そんなレガシーな惨劇を、我々は幾度となく目撃してきた。

真のアーキテクトは、設計情報を外部ファイルに追いやることはしない。データベースそのものにメタデータを埋め込み、自己完結型のインフラを構築する。

今回は、DAO(Data Access Objects)を叩き、テーブル定義の「説明(Description)」プロパティを一括制御することで、システム自体をドキュメント化する極限の自動化手法を伝授する。

1. プロパティ・オブジェクトの闇:なぜ「設定」はエラーを吐くのか

DAOでフィールドの`Properties`コレクションにアクセスする際、多くのエンジニアが躓く。`Description`プロパティは、標準的なプロパティとは異なり、新規作成時にはコレクションに存在しないからだ。

これを安易に参照しようとすれば、即座に「3270: プロパティが見つかりません」という例外が発生する。

解決策はシンプルだが、プロセスの行儀(作法)が重要だ。
1. プロパティが存在するか確認する。
2. 存在しなければ、`CreateProperty`メソッドで生成し、`Append`する。
3. 存在すれば、値を更新する。

この一連のハンドリングを「例外として扱わず、動的生成のロジックとして組み込む」ことこそが、安定したツールを作るための鉄則である。

2. 実装:フィールド説明一括更新エンジン

以下のコードは、単なる更新スクリプトではない。メモリ管理、エラーハンドリング、そしてオブジェクトの明示的解放を徹底した、プロダクション品質のコードだ。

Option Compare Database
Option Explicit

‘ @brief 指定したテーブルの全フィールドに対して説明文を一括設定する
‘ @param TableName 対象テーブル名
‘ @param FieldName 対象フィールド名
‘ @param Description 設定する説明文
Public Sub SetFieldDescription(ByVal TableName As String, ByVal FieldName As String, ByVal Description As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim prp As DAO.Property

Set db = CurrentDb

‘ データベースの整合性を守るため、DAOオブジェクトは明示的に参照
On Error GoTo Err_Handler
Set tdf = db.TableDefs(TableName)
Set fld = tdf.Fields(FieldName)

‘ Descriptionプロパティの取得を試みる
On Error Resume Next
Set prp = fld.Properties(“Description”)

If Err.Number <> 0 Then
‘ プロパティが存在しない場合は新規作成
Err.Clear
Set prp = fld.CreateProperty(“Description”, dbText, Description)
fld.Properties.Append prp
Else
‘ 存在する場合は値を更新
prp.Value = Description
End If
On Error GoTo Err_Handler

‘ 変更を反映
fld.Properties.Refresh

Cleanup:
‘ オブジェクトの明示的解放
Set prp = Nothing
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Exit Sub

Err_Handler:
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
Resume Cleanup
End Sub

3. シニアエンジニアが意識すべき「メモリの行儀」

このコードのポイントは、`Set = Nothing`によるオブジェクトの解放だけではない。

  • DAOのキャッシュ戦略: `fld.Properties.Refresh`を呼ぶことで、Accessの内部キャッシュと物理メモリ上の定義を強制的に同期させている。これを怠ると、GUI上のテーブルデザイン画面で説明が表示されないという「幽霊現象」に遭遇することになる。
  • エラーのコントロール: `On Error Resume Next`は悪の根源のように語られがちだが、プロパティの「有無」を動的に判定する場面においては、例外発生をトリガーにするのが最もオーバーヘッドが少なく、かつ堅牢だ。

4. さらなる高みへ:システム連携と自動化

この手法を応用すれば、Excelで管理している「最新の定義書」を読み込み、VBAからこの関数をループさせるだけで、システム起動時に自動的にドキュメントを最新化する「自己修復型データベース」が構築できる。

さらに、Windows APIを用いてデータベースの最終更新日時を監視し、特定のフラグが立った際にこの更新処理をバックグラウンドで走らせれば、管理者が手動で設計書を更新するコストを限りなくゼロに近づけることが可能だ。

最後に

Access VBAは「古い技術」ではない。「極限まで無駄を削ぎ落とせば、最も高速にビジネス価値を実装できるフレームワーク」である。

プロパティの一つ一つ、オブジェクトのライフサイクルの一つ一つに神経を通わせることで、君たちの作るシステムは、ただの「動くもの」から「制御された芸術品」へと昇華する。

健闘を祈る。

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