【実務・中級編】CurrentDb.Propertiesでデータベースのプロパティを操作する – Access VBA解析バイブル

スポンサーリンク

Accessの「魂」を制御せよ:CurrentDb.Propertiesで実現する動的アプリケーション設計

Access開発において、多くのエンジニアが「フォームやテーブルの操作」には習熟している。しかし、真のアーキテクトは「データベースそのものの属性(Database Properties)」を掌握している。

アプリケーションのタイトルバー、起動時の設定、あるいは配布先で動的に挙動を変えるためのフラグ。これらはすべて`CurrentDb.Properties`という深淵に隠されている。今回は、このプロパティを安全かつ極限まで効率的に操作するための知見を共有する。

1. なぜ「設定値」をテーブルに持たせてはいけないのか?

初学者は、設定値を管理するために「T_設定」のようなテーブルを作成しがちだ。だが、考えてみてほしい。

  • 配布時の競合: フロントエンドを更新する際、テーブルのリンクやデータ整合性がネックになる。
  • メタデータの分離: データベースの構成情報(AppTitle等)は、データではなく「メタデータ」である。これらをテーブルに押し込むのは設計の敗北だ。

`CurrentDb.Properties`を使うべき理由は、「データベースのメタデータを、データベース本体のプロパティとして一元管理できる」からだ。これにより、配布用のフロントエンド(ACCDE)を差し替えるだけで、アプリケーションの挙動を即座に制御できる。

2. CurrentDb.Propertiesを操作する際の「鉄則」

Accessのプロパティ操作には、特有の落とし穴がある。「プロパティが存在しない場合にエラーが発生する」という点だ。これを回避する堅牢な関数こそが、現場で生き残るコードの第一歩である。

以下のコードは、プロパティの有無を気にせず、安全に値を読み書きするための「プロダクション・グレード」のユーティリティである。

Option Compare Database
Option Explicit

‘ —
‘ データベースプロパティを安全に取得・設定するクラスモジュール的アプローチ
‘ —

Public Function SetDbProperty(strName As String, varType As Integer, varValue As Variant) As Boolean
Dim db As DAO.Database
Dim prp As DAO.Property

Set db = CurrentDb

On Error Resume Next
‘ プロパティの存在確認とセット
db.Properties(strName) = varValue

‘ プロパティが未定義(エラー3270)の場合は新規作成する
If Err.Number = 3270 Then
Err.Clear
Set prp = db.CreateProperty(strName, varType, varValue)
db.Properties.Append prp
End If

‘ 予期せぬエラーの処理
If Err.Number <> 0 Then
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
SetDbProperty = False
Else
SetDbProperty = True
End If
On Error GoTo 0
End Function

Public Function GetDbProperty(strName As String, Optional varDefault As Variant) As Variant
Dim db As DAO.Database

Set db = CurrentDb
On Error Resume Next

‘ 存在すれば取得、存在しなければデフォルト値を返す
GetDbProperty = db.Properties(strName)

If Err.Number <> 0 Then
GetDbProperty = varDefault
End If
On Error GoTo 0
End Function

3. 実践:アプリケーションの「顔」を動的に変える

この関数を使えば、配布先ごとにタイトルバーを変えたり、特定のデバッグモードを切り替えたりすることが一瞬で完了する。

タイトルバーを環境に合わせて変更する例

Public Sub InitializeAppEnvironment()
‘ アプリケーションタイトルを動的に設定
‘ ※配布先ごとに名称を変えることで、誤操作を防ぐ(例:本番/開発環境)
Call SetDbProperty(“AppTitle”, dbText, “営業管理システム – 開発環境”)

‘ 起動時のフォームを設定
Call SetDbProperty(“StartupForm”, dbText, “frm_Dashboard”)

‘ 変更を反映させるためにRefreshTitleBarを呼び出す
Application.RefreshTitleBar
End Sub

4. アーキテクトからの忠告:パフォーマンスと保守性

この手法を採用する上で、最後に重要な知見を授ける。

1. 書き込み頻度を最小化する: `CurrentDb.Properties`への書き込みは、データベースのメタデータファイルを更新する行為である。ループ内で何度も実行してはならない。初期化処理など、特定のタイミングでのみ実行するように設計せよ。
2. 型定義を厳守する: `dbText`, `dbInteger`, `dbBoolean` などのDAO型定数は必ず明示すること。型を曖昧にすると、後続の環境で予期せぬ型変換エラーを引き起こす。
3. ACCDE化を見据える: ACCDE形式では、実行時にプロパティを新規追加することはできない。必要なプロパティは必ずACCDBの段階で一度作成しておくか、あるいは初回起動時の初期化ルーチンで網羅しておくこと。

結び

Accessは、正しく使えばこれほど強力で柔軟なツールはない。`CurrentDb.Properties`を掌握することは、Accessというアプリケーションの「OS」を直接操作するようなものだ。

小手先のテクニックではなく、このような基盤技術を積み重ねることで、あなたの作るツールは「単なる業務アプリ」から「堅牢なシステム」へと進化する。さあ、コードを書き換え、Accessの真の力を引き出してほしい。

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