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

スポンサーリンク

こんにちは。今日は、Access VBAの世界を一歩深く踏み込んでみようとしているあなたへ、非常に実用的で「プロの品格」が漂うテクニックを伝授します。

Accessを使っていて、こんな悩みはありませんか?
「テーブルのフィールド名(例:`chr_CustName`)が分かりにくいから、フォームのラベルを一つずつ『顧客名』に書き換えているけれど、項目が増えるたびに直すのが面倒だ……」

もしあなたが、テーブルのデザイン画面にある「説明」欄をしっかり書いているなら、その努力を無駄にしてはいけません。そこには、UI(ユーザーインターフェース)を自動生成するための「宝の地図」が眠っているのです。

今回は、テーブルのメタデータを読み解き、フォームのラベルを動的に書き換える「メタデータ駆動型UI開発」の入り口へとご案内します。

—

1. なぜ「説明」プロパティを使うのか?

通常、フォームのラベルには「氏名」や「電話番号」といった文字を直接打ち込みます。しかし、これでは仕様変更があったときに、テーブルとフォームの両方を修正しなければなりません。

プロのエンジニアは「情報は一箇所で管理する(DRY原則:Don’t Repeat Yourself)」を徹底します。

  • テーブルの「説明」欄: データの定義を書く
  • フォームのラベル: テーブルの「説明」を自動で表示する

こうすることで、テーブル側の設計書を更新するだけで、アプリ全体の表示が連動して切り替わる「メンテナンス性の高いシステム」が完成します。

—

2. 【重要】「説明」プロパティの特殊な正体

ここで一つ、初心者が必ずと言っていいほど躓くポイントを解説します。
実は、フィールドの「説明」プロパティ(`Description`)は、値が空の状態ではオブジェクトの中に存在すらしていません。

Accessの内部では、値が入力されて初めて「Description」というプロパティが生成される仕組みになっています。そのため、VBAで単純に参照しようとすると「プロパティが見つかりません」というエラー(エラー番号3270)が発生します。

これをスマートに回避するのが、プロのコードの書き方です。

—

3. 実践コード:ラベルを自動書き換えする魔法のルーチン

以下のコードを、フォームのモジュール、または標準モジュールに貼り付けてみてください。このコードは、フォーム上のコントロール名とテーブルのフィールド名を照合し、一致したもののラベルを「説明」欄の内容に書き換えます。

Option Compare Database
Option Explicit

‘—————————————————————————————
‘ 手順:フォームの「読み込み時(Load)」イベントなどでこの関数を呼び出します。
‘ 引数:targetForm – 対象となるフォーム自身 (Me)
‘ tableName – 元となるテーブルの名前
‘—————————————————————————————
Public Sub ApplyTableDescriptionToLabels(ByRef targetForm As Form, ByVal tableName As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim ctl As Control
Dim descValue As String

Set db = CurrentDb

‘ 1. テーブル定義(TableDef)を取得
On Error Resume Next
Set tdf = db.TableDefs(tableName)
If Err.Number <> 0 Then
MsgBox “テーブル ‘” & tableName & “‘ が見つかりません。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 2. テーブルの全フィールドをループで確認
For Each fld In tdf.Fields

‘ 3. フィールドの「説明」プロパティを取得(エラー回避関数を使用)
descValue = GetFieldDescription(fld)

‘ 説明が空でなければ、フォーム上の該当するラベルを探す
If descValue <> “” Then
For Each ctl In targetForm.Controls
‘ コントロールの種類がラベルであり、かつ名前が「lbl_フィールド名」という規則の場合
‘ もしくは、テキストボックスの「名前」がフィールド名と一致する場合
‘ ここでは「lbl_フィールド名」という名前のラベルを探すロジックにします
If ctl.Name = “lbl_” & fld.Name Then
ctl.Caption = descValue
End If
Next ctl
End If
Next fld

‘ オブジェクトの解放(メモリ管理の作法)
Set tdf = Nothing
Set db = Nothing
End Sub

‘—————————————————————————————
‘ 補助関数:エラーを回避しながら「説明」プロパティを取得する
‘—————————————————————————————
Private Function GetFieldDescription(ByRef fld As DAO.Field) As String
On Error Resume Next
‘ Descriptionプロパティにアクセスを試みる
GetFieldDescription = fld.Properties(“Description”).Value

‘ プロパティが存在しない(エラー3270)場合は空文字を返す
If Err.Number = 3270 Then
GetFieldDescription = “”
End If
On Error GoTo 0
End Function

使い方

フォームの「読み込み時」イベントに、次の一行を書き加えるだけです。

Private Sub Form_Load()
‘ このフォームのコントロールを「T_顧客マスタ」の説明に基づいて更新する
Call ApplyTableDescriptionToLabels(Me, “T_顧客マスタ”)
End Sub

※前提として、フォーム上のラベルの名前を `lbl_氏名` のように、`lbl_` + `フィールド名` というルールにしておいてください。

—

4. プロが教える「ここをクリアすれば完璧」なポイント

① オブジェクトのライフサイクルを意識する

コードの最後で `Set tdf = Nothing` としているのに気づきましたか?
Access VBA(DAO)において、データベースオブジェクトへの参照を明示的に解放することは、メモリリークを防ぎ、アプリケーションの動作を安定させるための「鉄則」です。

② エラーハンドリングの重要性

`GetFieldDescription` 関数の中で `On Error Resume Next` を使っています。これは「手抜き」ではなく、「プロパティが存在しない可能性がある」という仕様に対する正当な戦略です。これを「プロパティの存在チェック」と言い換えることもできます。

③ 命名規則の力

このコードが動くためには、ラベルの名前に一定のルール(`lbl_フィールド名`)が必要です。プログラムで何かを自動化しようとする時、最も大切なのはコードの巧妙さではなく、「名前の付け方のルール(命名規則)」を徹底することなのです。

—

5. まとめ:メタデータを制する者はAccessを制す

「テーブルを作って、フォームにペタペタとラベルを貼る」
そんな手作業から卒業する第一歩が、今回のメタデータ活用です。

テーブルの「説明」プロパティを単なるメモ書きではなく、「UIを制御するための設定値」として捉え直したとき、あなたのAccess開発の視座は一段高い場所へと引き上げられます。

もし、このコードが動いてラベルがパッと切り替わったなら、おめでとうございます!あなたはもう、単なる「Accessを使える人」ではなく、「Accessをプログラムで操るエンジニア」の仲間入りです。

この調子で、一歩ずつ進んでいきましょう。Access VBAの深淵は、知れば知るほど面白いものですよ!

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