こんにちは!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開発ライフがよりスマートで快適なものになりますように!
