こんにちは!Access VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手でAccessの挙動を完全にコントロールしたい」と思っているあなたへ、今日はとてもエキサイティングな技術をお伝えします。
ここをクリアすれば、Access VBAの基本はもちろん、システムアーキテクトとしての「環境制御の視点」がグッと身につきますよ。ぜひ最後までついてきてくださいね。
—
1. なぜ「起動時のフォーム」を動的に切り替える必要があるのか?
皆さんは、Accessで作成したアプリケーションをユーザーに使わせている最中に、「緊急メンテナンスを行いたい」「バージョンアップの告知を挟みたい」と思ったことはありませんか?
通常、Accessの起動時にどのフォームを表示するかは、ファイルを開いたときの「オプション(カレントデータベースのプロパティ)」でガチガチに固定されています。
[ファイル] > [オプション] > [現在のデータベース] > [フォームの表示]
しかし、これでは「メンテナンス中だからメンテナンス用フォームで起動し、平時は通常メニューで起動する」という動的な切り替えを、あらかじめファイルごとに手動で設定し直さなければならず、運用管理の地獄を見る羽目になります。
これをVBAのコードから一瞬で書き換えられたらどうでしょう?
「あ、今週はメンテナンスモードに切り替えよう」と思ったら、フラグを1つ変えるだけで、次回の起動時から全ユーザーの画面を安全にコントロールできるようになります。今回は、その裏側の仕組みを解き明かしていきましょう。
—
2. 魔法の鍵:`CurrentDb.Properties` とは何か?
Access VBAには、データベース自体の設定(プロパティ)を読み書きするための強力なオブジェクトモデルが用意されています。それが `CurrentDb.Properties` です。
通常、Accessの画面上(GUI)で設定する項目は、裏側ではすべて「プロパティ」という名前の“設定値のペア”として保持されています。起動時に表示するフォームを指定するプロパティの名前は、ズバリ `StartupForm` と言います。
これをVBAから操作するイメージ図を見てみましょう。
[ Access データベース本体 (CurrentDb) ]
│
├─► Tables (テーブル群)
├─► Queries (クエリ群)
└─► Properties (データベースのプロパティ群)
│
└─► “StartupForm” ──► “frm_Main” (通常時)
──► “frm_Maintenance” (メンテナンス時)
「なんだ、じゃあその `StartupForm` の中身をVBAで書き換えればいいんだな?」と思ったそこのあなた。大正解です!
しかし、ここにはAccess VBA初学者が必ずハマる「最初の関所」があります。
—
3. 陥りやすい罠:プロパティは「最初から存在しない」ことがある!?
ここが今回の記事で一番お伝えしたい、プログラミングの核心です。
実は、Accessの新規データベースを作成した直後や、まだ一度もGUIで「起動時のフォーム」を設定していない状態では、`CurrentDb.Properties` の中に `StartupForm` という名前の箱(プロパティ)自体が存在しない ことがあります。
存在しない箱に対して「中身を書き換えろ!」と命令すると、VBAは盛大にエラー(実行時エラー 3270: プロパティが見つかりません)を吐いて止まってしまいます。
先輩エンジニアとして、このエラーを美しくいなす「安全なコード」の書き方を授けましょう。
—
4. 実装コード:動的切り替えプロシージャの全貌
それでは、メンテナンスモードの状態に応じて、起動時フォームを安全に書き換える実用的なプロシージャを公開します。
標準モジュールなどに以下のコードを貼り付けてみてください。
Option Compare Database
Option Explicit
‘ =========================================================================
‘ 目的: 起動時に表示するフォームを動的に切り替える
‘ 引数: isMaintenance – True: メンテナンスモード / False: 通常モード
‘ =========================================================================
Public Sub ChangeStartupForm(ByVal isMaintenance As Boolean)
Dim db As DAO.Database
Dim prpName As String
Dim targetForm As String
Dim propFound As Boolean
Dim prop As DAO.Property
‘ 対象とするプロパティ名と、切り替え先のフォーム名を設定
prpName = “StartupForm”
If isMaintenance Then
targetForm = “frm_Maintenance” ‘ メンテナンス用フォーム
Else
targetForm = “frm_Main” ‘ 通常のメインメニューフォーム
End If
Set db = CurrentDb
propFound = False
‘ 1. 既存のプロパティコレクションを走査し、目的のプロパティがあるか探す
For Each prop In db.Properties
If prop.Name = prpName Then
propFound = True
Exit For
End If
Next prop
‘ 2. プロパティが存在する場合は値を書き換える
If propFound Then
db.Properties(prpName).Value = targetForm
MsgBox “起動時フォームを「 ” & targetForm & ” 」に変更しました。”, vbInformation, “設定完了”
‘ 3. 存在しない場合は、新規にプロパティを作成して追加する(ここが重要!)
Else
On Error GoTo ErrorHandler
‘ 第1引数:名前, 第2引数:データ型(dbText=10), 第3引:値
Set prop = db.CreateProperty(prpName, dbText, targetForm)
db.Properties.Append prop
MsgBox “起動時フォームプロパティを新規作成し、「 ” & targetForm & ” 」に設定しました。”, vbInformation, “初期化完了”
End If
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードのポイント解説
1. `For Each prop In db.Properties` による存在確認
いきなりプロパティを書き換えるのではなく、「そもそもその設定が存在するか?」を優しく確認しにいく安全設計にしています。これがプロフェッショナルの作法です。
2. `db.CreateProperty` と `db.Properties.Append`
もし設定が一度もされていなくてプロパティが存在しない場合でも、エラーを出して終わるのではなく、その場で新しくプロパティを生み出して(Appendして)設定を書き込むというタフな実装にしています。
3. DAOの明示的な利用
裏側の設定をいじる際は、AccessのデータエンジンであるDAO(Data Access Objects)の作法に則ることで、動作が非常に安定します。
—
5. 実際の運用イメージと応用
このプロシージャを組み込んだら、例えば社内の管理用マスター画面などに「メンテナンスモード切り替えボタン」を配置し、次のように呼び出すことができます。
‘ メンテナンスモードをONにして起動フォームを切り替えるボタンのイベント
Private Sub cmdEnableMaintenance_Click()
Call ChangeStartupForm(True)
End Sub
‘ 通常モードに戻すボタンのイベント
Private Sub cmdDisableMaintenance_Click()
Call ChangeStartupForm(False)
End Sub
これだけで、開発者がわざわざAccessの重いオプション画面を開き直す必要はなくなります。バックエンドのフラグテーブルや外部INIファイル、さらには環境変数などと組み合わせれば、「特定の曜日や時間帯だけ自動でメンテナンスフォームで起動する」といった高度なエンタープライズ運用も夢ではありません。
—
まとめ:ここをクリアすれば、Access VBAはもっと楽しくなる!
今回は、`CurrentDb.Properties` を使った「起動時フォームの動的制御」という、少し踏み込んだテーマを解説しました。
- Accessの設定はVBAから自由にいじれること
- 存在しない設定(プロパティ)を扱うときは、有無のチェックや新規作成の処理(`CreateProperty`)が必要であること
この2点を理解できたあなたは、単なる「マクロの延長」から完全に脱却し、「Access環境を意のままに操るエンジニア」の階段を確実に登っています。
ぜひ自分の開発環境でも試して、このコードの気持ちよさを体感してみてくださいね。それでは、次回の技術解説もお楽しみに!
