【入門編】【中級】CurrentDb.Propertiesでデータベースのプロパティを操作し、起動時の設定を動的に変更する – Access VBA解析バイブル

スポンサーリンク

こんにちは!Access VBAの世界へようこそ。
これまでマクロのボタン配置や、決まりきったフォームの操作に少し物足りなさを感じていませんか?「環境によって起動する画面を自動で切り替えたい」「ユーザーごとにメニューバーの表示を変えたい」――そんな現場の要望に応えられるようになると、Access開発が一気にプロフェッショナルな領域へとシフトします。

今回は、Accessの心臓部である「データベースのプロパティ」をVBAから自在に操る極意を伝授します。ここをクリアすれば、Access VBAの基本はバッチリですよ!一緒にワンランク上のエンジニアを目指しましょう。

1. なぜ「起動時設定」をコードで制御する必要があるのか?

通常、Accessの起動時設定(「起動時のフォーム」や「リボンの表示」など)を変更するには、ファイルメニューの「オプション」からポチポチと設定を行いますよね。

しかし、次のような現場のシチュエーションを想像してみてください。

  • 開発環境では「ナビゲーションウィンドウを表示し、デザイン変更も自由にしたい」
  • 本番環境では「ナビゲーションウィンドウを隠し、専用のメインメニューだけを全画面で起動させたい」
  • 配布用のインストーラーとして、VBAから一発でセキュアな設定に自動化したい

これらを毎回手動で設定するのは、ミスのもとでありエンジニアの仕事ではありません。「VBAでデータベース自体のプロパティを書き換える」ことができれば、アプリケーションの挙動を完全にコードでコントロールできるようになるのです。

2. Accessオブジェクトモデルの核心:`CurrentDb` と `Properties`

Access VBAでデータベース自体の設定に触れるとき、必ず登場するのが `CurrentDb` というキーワードと、データベース固有の `Properties`(プロパティ)コレクションです。

`CurrentDb` と `Application.CurrentDb` の違い

まず知っておくべきは、`CurrentDb` は「現在開いているデータベースのインスタンスを新しくメモリ上に生成する」という挙動をする点です。
(※これに対し、`DBEngine.Workspaces(0).Databases(0)` や、フォームのモジュール内で使う `Me` とはスコープが異なります)

データベースのプロパティ(例えば「StartupForm」や「StartupShowDBWindow」など)は、実はAccessの標準フォームやクエリとは少し違い、デフォルトでは存在しないプロパティがたくさんあります
つまり、「設定したいプロパティがまだデータベースに登録されていない場合は、自分で新規作成してから値を代入する」というワンクッションが必要になる点が、初学者が最もハマりやすい罠なのです。

3. 実践!起動時設定を動的に書き換えるVBAコード

それでは、実際に動かせる実用コードを見ていきましょう。
以下のコードは、「起動時に表示するフォーム(StartupForm)」「ナビゲーションウィンドウの表示(StartupShowDBWindow)」をVBAから動的に変更するプロシージャです。

標準モジュールに貼り付けて、そのまま実行できるように設計しています。

Option Compare Database
Option Explicit

‘ =========================================================================
‘ 処理名 : SetDatabaseStartupProperties
‘ 概要 : Accessの起動時プロパティを動的に変更・設定する
‘ 備考 : プロパティが存在しない場合は自動的に新規作成します
‘ =========================================================================
Public Sub SetDatabaseStartupProperties()
On Error GoTo ErrorHandler

Dim db As DAO.Database
Set db = CurrentDb ‘ 現在のデータベースを参照

‘ 1. 起動時フォームの設定 (“Frm_Main” というフォームを開く例)
‘ 第2引数: dbText (文字列), 第3引数: 設定したい値
Call SetProperty(db, “StartupForm”, dbText, “Frm_Main”)

‘ 2. ナビゲーションウィンドウの表示設定 (False = 非表示にする)
‘ 第2引数: dbBoolean (真偽値), 第3引数: False
Call SetProperty(db, “StartupShowDBWindow”, dbBoolean, False)

‘ 3. Access特有の組み込みメニューバーの非表示設定
‘ 第2引数: dbBoolean (真偽値), 第3引数: False
Call SetProperty(db, “AllowFullMenus”, dbBoolean, False)

MsgBox “起動時プロパティの更新が完了しました!” & vbCrLf & _
“変更を反映させるには、データベースを再起動してください。”, vbInformation, “成功”

CleanExit:
Set db = Nothing
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
Resume CleanExit
End Sub

‘ =========================================================================
‘ 補助プロシージャ: プロパティの存在確認と安全な設定変更
‘ =========================================================================
Private Sub SetProperty(targetDb As DAO.Database, propName As String, propType As Integer, propValue As Variant)
Dim prp As DAO.Property
Dim isExist As Boolean

isExist = False

‘ プロパティが既に存在するか走査して確認
For Each prp In targetDb.Properties
If prp.Name = propName Then
isExist = True
Exit For
End If
Next prp

If isExist Then
‘ 存在する場合は値を上書き
targetDb.Properties(propName).Value = propValue
Else
‘ 存在しない場合は新規作成して追加
Set prp = targetDb.CreateProperty(propName, propType, propValue)
targetDb.Properties.Append prp
End If
End Sub

コードのポイント解説

1. なぜ専用の `SetProperty` サブルーチンを作ったのか?
Accessの `Properties` コレクションは、設定されていないプロパティ名に直接アクセスすると、容赦なく「実行時エラー ‘3270’: プロパティが見つかりません」を吐いて止まります。これを防ぐために、事前に存在チェックを行い、なければ `CreateProperty` と `Append` で新しく生み出すという安全な仕組み(イディオム)を挟んでいます。
2. データの型(`dbText`, `dbBoolean`)の指定
プロパティによって受け付けるデータ型が決まっています。文字なら `dbText`、ON/OFFのフラグなら `dbBoolean` を正確に指定することが、エラーを防ぐ極意です。

4. 現場でよくある「ハマりどころ」と対策

このコードや仕組みを実務に導入する際、多くの開発者が以下の壁にぶつかります。

  • 罠1:コードを実行したのに設定が反映されない?
  • 原因: Accessのプロパティキャッシュの問題です。コードで書き換えた後、即座に画面が変わるわけではありません。一度Accessを完全に終了し、再起動することで初めて新しい起動時設定が読み込まれます。
  • 罠2:配布先で「実行時エラー」が出る
  • 原因: 参照設定に「Microsoft DAO 3.x Object Library」が入っていない、あるいは古い場合があります。`CurrentDb` や `DAO.Database` を安全に扱うために、コード内では極力明示的な型宣言を行い、環境依存を減らす工夫をしましょう。

5. まとめ

今回は、`CurrentDb.Properties` を駆使してAccessの起動時設定を動的にコントロールする方法を解説しました。

  • 起動時のフォームや画面まわりの設定はVBAで自動化できる。
  • プロパティ操作の基本は「存在確認 ➔ あれば上書き、なければ `CreateProperty` で新規追加」のワンセット。
  • 変更を適用した後は、必ずAccessを再起動する。

このテクニックをマスターすれば、デプロイ(配布)ツールの自動化や、環境に応じた動的なアプリケーション構成の切り替えが自由自在になります。「マクロの記録」の枠を超えた、本当の意味でのAccess自動化エンジニアへの第一歩です。

ぜひご自身の開発環境で試してみてくださいね。あなたのAccess開発ライフがよりスマートで快適なものになりますように!

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