こんにちは!データベース設計やVBAの自動化を進めていると、「このテーブル、いったい何のデータが入っているんだっけ?」「このフィールド、誰が何の目的で作ったんだっけ?」と迷子になること、ありませんか?
外部の設計書を探しに行くのもいいですが、データベースのファイル自体に「説明書」が埋め込まれていたら、これほど心強いことはありません。
今回は、Accessのテーブルやフィールドが持つ「説明」プロパティを、VBAを使って一瞬で書き込み・更新するテクニックを伝授します。ここをクリアすれば、Access VBAの基本操作だけでなく、DAO(Data Access Objects)というAccessの心臓部を操る感覚がグッと身につきますよ。さあ、一緒にスマートなデータベース・ドキュメント作りを始めましょう!
—
なぜ、VBAで「説明」プロパティを操作するのか?
Accessの画面(デザインビュー)を開けば、各テーブルやフィールドの下部に「説明」欄があるのはご存知ですよね。そこに手入力するのも悪くありません。
しかし、以下のようなシチュエーションでは、VBAによる自動化が圧倒的な威力を発揮します。
- テーブルやフィールドが数十個以上あり、手作業だと気が遠くなるとき
- 仕様変更に伴い、説明文を一括で最新化・同期させたいとき
- 「誰が触っても同じドキュメント環境」をプログラムで強制的に構築したいとき
Access VBAを使えば、コードを実行するだけで、一瞬にしてデータベース内に「生きた説明書」を構築できます。
—
押さえておきたい前提知識:DAOと「Properties」の仕組み
Access VBAでテーブル構造をいじる際、私たちはDAO(Data Access Objects)というデータベースエンジンを操作します。
ここで一つ、Access VBA初学者が必ずと言っていいほどハマる「罠」があります。
それは、「新規作成したばかりのプロパティは、最初から存在しないことがある」という点です。
例えば、「説明(Description)」というプロパティは、テーブルを作った段階では背後でまだ実体化していないことがあります。そのため、いきなり書き込もうとすると「そんなプロパティはありません」という有名な実行時エラー(エラー番号:3270)が発生します。
この壁をスマートに乗り越えるのが、プロフェッショナルなVBAコードの書き方です。
—
【実践】テーブルの「説明」をVBAで書き込むコード
それでは、実際に動かせる実用的なコードを見ていきましょう。
以下のコードは、指定したテーブルの「説明」プロパティを設定し、もしプロパティが存在しない場合は新しく作成してから書き込む、という安全設計(エラーハンドリング)を取り入れたものです。
Sub SetTableDescriptionSample()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim targetTableName As String
Dim descriptionText As String
‘ 対象のテーブル名と説明文を定義
targetTableName = “T_売上明細”
descriptionText = “【重要】毎日の売上トランザクションを保持するマスターテーブル。月次集計のソースとなります。”
‘ 現在のデータベース(Accessファイル)を参照
Set db = CurrentDb
On Error GoTo ErrorHandler
‘ TableDefsコレクションから対象のテーブルを取得
Set tdf = db.TableDefs(targetTableName)
‘ 「説明」プロパティを設定する(共通プロシージャを呼び出し)
Call SetPropertyString(tdf, “Description”, descriptionText)
MsgBox “テーブル「” & targetTableName & “」の説明を正常に更新しました!”, vbInformation, “完了”
Exit_Handler:
‘ オブジェクトの解放(メモリリークを防ぐプロの作法)
Set tdf = Nothing
Set db = Nothing
Exit Sub
ErrorHandler:
If Err.Number = 3265 Then
MsgBox “指定したテーブル「” & targetTableName & “」が見つかりません。”, vbCritical, “エラー”
Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
>End If
Resume Exit_Handler
End Sub
‘ ==========================================================
‘ 汎用プロパティ設定ヘルパー(プロパティが存在しない場合は自動作成)
‘ ==========================================================
Private Sub SetPropertyString(obj As Object, propName As String, propValue As String)
On Error GoTo CreateProp
‘ プロパティが既に存在する場合は値を代入
obj.Properties(propName) = propValue
Exit Sub
CreateProp:
‘ プロパティが存在しないエラー(3270)の場合のみ、新規作成して代入
If Err.Number = 3270 Then
Dim prp As DAO.Property
‘ dbText 型のプロパティを作成して追加
Set prp = obj.CreateProperty(propName, dbText, propValue)
obj.Properties.Append prp
Set prp = Nothing
Resume Next
Else
‘ その他の予期せぬエラーはそのままスロー
Err.Raise Err.Number, , Err.Description
End If
End Sub
コードのポイント解説
1. `CurrentDb` によるデータベースの取得
現在開いているAccessファイルをオブジェクトとして取得し、操作の起点とします。
2. `SetPropertyString` ヘルパー関数の存在
これが今回のキモです。前述した「プロパティが存在しないかもしれない」という問題を華麗にクリアするため、エラー番号 `3270` を検知した瞬間に `CreateProperty` でプロパティを生成して追加する仕組み(自己修復的なコード)にしています。
3. オブジェクトの解放(`Set tdf = Nothing`)
VBAでは、メモリを効率的に解放するために、参照したDAOオブジェクトは処理の最後に必ず `Nothing` を代入してクリアするのが美しいコードの鉄則です。
—
応用:フィールド(列)の「説明」も書き換えてみよう
テーブル全体だけでなく、各フィールド(列)に対しても全く同じ要領で説明を書き込むことができます。
Sub SetFieldDescriptionSample()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Set db = CurrentDb
Set tdf = db.TableDefs(“T_売上明細”)
‘ 「商品コード」フィールドに説明を設定
Set fld = tdf.Fields(“商品コード”)
Call SetPropertyString(fld, “Description”, “商品マスター(T_商品)への外部キー。半角8桁。”)
MsgBox “フィールドの説明を更新しました!”, vbInformation
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
End Sub
※先ほど作成した `SetPropertyString` ヘルパー関数は、`TableDef` だけでなく `Field` オブジェクト(`obj As Object` としているため)にもそのまま流用可能です!
—
まとめ:データベースに「意思」を宿そう
今回は、VBAを使ってテーブルやフィールドの「説明」プロパティをプログラムから制御する方法を解説しました。
- プロパティがない場合は `CreateProperty` で動的に生み出す
- DAOオブジェクトは使い終わったらしっかりと解放する
この2つを押さえておけば、Accessの構造定義に関する自動化の引き出しが一気に広がります。
外部のExcel設計書は、システム改修のたびに更新が忘れられがちになり、やがて「時代遅れのゴミ」になってしまいます。しかし、データベースの内部(メタデータ)に直接ドキュメントを埋め込むこの手法なら、システムとドキュメントが乖離するリスクをゼロにできます。
ぜひ、あなたの開発現場のメンテナンス効率化に役立ててください。「ここをクリアすれば、Access VBAの基本はバッチリですよ!」、自信を持って次のステップへ進みましょう。
