【入門編】【実務】テーブル定義の「説明」プロパティを読み込み、フォームのラベルに自動反映させる – Access VBA解析バイブル

スポンサーリンク

Accessの「説明」を資産に変える。DAOでテーブル定義をハックしてフォームを自動化する極意

こんにちは。現場で泥臭い自動化と格闘し続けるエンジニアの皆さん。

Accessで開発をしていると、テーブルの「説明」プロパティを一生懸命書いているのに、フォームを作るたびにまた同じ説明をラベルにコピペして……という徒労感に襲われたことはありませんか?

「テーブル定義に書いた『真実』を、フォームに自動で反映させる」

これこそが、メンテナンス性の高いシステムを作る第一歩です。今回は、DAO(Data Access Objects)というAccessの心臓部に触れ、テーブル定義をVBAで自在に操る極意を伝授します。

—

なぜ「DAO」を使うのか?

Accessには「ADO」と「DAO」という2つの主要なライブラリがありますが、テーブル定義(メタデータ)を触るなら迷わずDAOです。

DAOはAccessのデータベースエンジン(ACE)と直結しており、テーブルの構造、フィールドの型、そして今回扱う「説明(Description)」プロパティに直接アクセスできる唯一の手段だからです。

—

核心コード:テーブル定義から「説明」を抽出する

まずは、指定したテーブルのフィールド名と、その「説明」プロパティを取得する関数を作ります。

‘ 必要なライブラリ: Microsoft Office 16.0 Access database engine Object Library
Public Sub GetFieldDescriptions(tableName 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
Set tdf = db.TableDefs(tableName)

‘ 各フィールドをループ
For Each fld In tdf.Fields
‘ 「説明」プロパティを取得
On Error Resume Next ‘ プロパティがない場合にエラー回避
Set prp = fld.Properties(“Description”)

If Err.Number = 0 Then
Debug.Print “フィールド名: ” & fld.Name & ” / 説明: ” & prp.Value
Else
Debug.Print “フィールド名: ” & fld.Name & ” / 説明: (設定なし)”
End If
On Error GoTo 0
Next fld
End Sub

このコードの「設計思想」

1. `DAO.Property`の罠: Accessのプロパティは「ユーザーが設定した時初めて生成される」という特性があります。そのため、`fld.Properties(“Description”)`にアクセスすると、設定がない場合に容赦なく実行時エラーを吐きます。`On Error Resume Next`で軽くいなすのが、現場で生き残るエンジニアの作法です。
2. 型を意識する: `CurrentDb`はDAOのデータベースオブジェクトを返します。これを使えば、クエリもテーブルもすべて手中に収められます。

—

実践編:フォームのラベルに自動反映させる

次は応用です。フォーム上のラベルの名前を「lbl_フィールド名」とルール化しておけば、フォームを開く際に自動的に説明文を代入できます。

Public Sub ApplyDescriptionsToForm(frm As Form, tableName As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim ctl As Control
Dim fldName As String

Set db = CurrentDb
Set tdf = db.TableDefs(tableName)

‘ フォーム上の全コントロールを走査
For Each ctl In frm.Controls
‘ ラベルかつ、名前が “lbl_” で始まるものだけ対象
If ctl.ControlType = acLabel And Left(ctl.Name, 4) = “lbl_” Then
fldName = Mid(ctl.Name, 5) ‘ 接頭辞を除いたフィールド名を取得

‘ テーブル定義から説明を検索
On Error Resume Next
ctl.Caption = tdf.Fields(fldName).Properties(“Description”).Value
On Error GoTo 0
End If
Next ctl
End Sub

—

開発現場で陥りやすい「3つの落とし穴」

この技術を導入する際、以下のポイントだけは忘れないでください。

1. プロパティの即時反映:
テーブルの「説明」を書き換えた直後、VBAで取得しようとしてもキャッシュのせいで古い値が取れることがあります。確実を期すなら、一度`RefreshDatabaseWindow`を呼ぶか、一度閉じて読み直す工夫が必要です。
2. 日本語名のフィールド名:
フィールド名にスペースや日本語が含まれる場合、`tdf.Fields(“顧客 名”)`のように正しく指定できているか注意が必要です。なるべくフィールド名は英数字に統一するのが、長年システムを運用するコツです。
3. 命名規則の徹底:
「フォームのラベル名」と「テーブルのフィールド名」が一致していないと、自動化は動きません。開発チーム内で「ラベル名は必ず `lbl_フィールド名` とする」という規約をドキュメント化しておきましょう。

—

最後に:自動化は「資産」を作るためにある

今回紹介した手法は、単なるコードの短縮ではありません。「データベースの定義情報こそが、システムの仕様書である」という考え方をコードに落とし込む作業です。

コードをコピペして動かすだけでなく、「なぜこのプロパティにアクセスするのか」「なぜエラー処理が必要なのか」という背景を理解すれば、あなたはもう初学者ではありません。

Access VBAは、知れば知るほど強力な相棒になります。ぜひ、あなたの現場の「面倒な手作業」を、この技術で一掃してください。応援していますよ。

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