Access VBAの「防御的プログラミング」入門:フォーム存在チェックでエラーを華麗に回避する
こんにちは。Access開発の世界へようこそ。
Access VBAでアプリケーションを作っていると、必ずぶつかる壁があります。それは「存在しないものを開こうとして、プログラムがクラッシュする」という事態です。
例えば、ユーザーがボタンを押したとき、裏側で`DoCmd.OpenForm “存在しないフォーム名”`が走ってしまったらどうなるか? 画面には「実行時エラー ‘2102’:指定したフォーム ‘…’ は存在しません」という、ユーザーを不安にさせる無機質なダイアログが表示されます。
これを防ぐのが、プロのエンジニアが現場で必ず行う「防御的プログラミング」です。今日は、`Application.CurrentProject.AllForms`を使いこなし、堅牢なAccessシステムを作るための極意を伝授します。
—
なぜ「エラー」を未然に防ぐ必要があるのか?
初心者のうちは「エラーが出たらその時に対処すればいい」と思いがちですが、現場のシステムではそれでは遅すぎます。
- ユーザー体験(UX)の悪化: エラーメッセージは、ユーザーにとって「このシステムは壊れている」というサインです。
- 保守コストの増大: エラーが起きた場所を特定し、修正して配布し直すのは手間がかかります。
「開く前に、そこに存在するかを確認する」。この一手間を加えるだけで、あなたのコードは格段に信頼性を増すのです。
—
魔法の道具:AllFormsコレクション
Accessには、現在プロジェクト内に存在するすべてのオブジェクトを管理するリストのようなものがあります。それが `AllForms` です。
`Application.CurrentProject.AllForms` は、Access内にある全フォームの「名簿」のようなものだと考えてください。この名簿の中に、目的のフォーム名があるかどうかを照らし合わせるのが、最もスマートな解決策です。
実践コード:存在チェックを行う関数
まずは、以下のコードを標準モジュールにコピペしてみてください。この関数を一つ持っておくだけで、開発が劇的に楽になります。
‘ フォームが存在するかを確認する汎用関数
Public Function IsFormExists(ByVal formName As String) As Boolean
Dim obj As AccessObject
‘ CurrentProject.AllFormsコレクションをループして探索
For Each obj In Application.CurrentProject.AllForms
If obj.Name = formName Then
IsFormExists = True
Exit Function ‘ 見つかったら即座に終了
End If
Next obj
‘ ループを抜けてもなければ存在しない
IsFormExists = False
End Function
—
このコードの「本質」を理解する
このコードのどこが優れているのか、エンジニアの視点で解説します。
1. For Each 文の活用:
すべてのフォームを順番にチェックする「For Each」構文は、Accessオブジェクトモデルを扱う際の基本にして最強のイテレーターです。
2. 早期リターン(Exit Function):
目的のフォームが見つかった瞬間に処理を打ち切ることで、無駄なループを回しません。これは大規模なシステムになるほどパフォーマンスに直結します。
3. 汎用性:
この関数は「あるかないか」をTrue/Falseで返すだけなので、どんな場所からでも呼び出せます。
実際に使ってみる(呼び出し側のコード)
Sub OpenMyForm(targetForm As String)
‘ 存在チェックを実行してから開く
If IsFormExists(targetForm) Then
DoCmd.OpenForm targetForm
Else
‘ エラーを出す代わりに、優しく警告を出す
MsgBox “指定されたフォーム [” & targetForm & “] は見つかりませんでした。” & vbCrLf & _
“管理者に連絡してください。”, vbExclamation, “システムエラー”
End If
End Sub
—
さらに上のステージへ:ここをクリアすれば「脱・初心者」
今回学んだのは「AllForms」を使った存在確認ですが、エンジニアとしてもう一歩踏み込むなら、以下の考え方を頭の片隅に置いておいてください。
- ハードコーディングを避ける: 関数化することで、フォーム名が変わった時もコードを修正する必要がなくなります。
- 状態管理の重要性: 今回は「存在確認」でしたが、次は「開いているかどうか(IsLoaded)」をチェックする手法を学ぶと、さらにシステムが洗練されます。
最後に
Access VBAは、あなたのアイデアをすぐに形にできる素晴らしいツールです。しかし、その自由度の高さゆえに、ちょっとした油断がエラーを招きます。
「開こうとする前に、確認する」。この慎重さこそが、「動くコード」から「信頼されるシステム」を生み出すエンジニアへの第一歩です。
今日学んだこのパターン、ぜひあなたのプロジェクトに組み込んでみてください。これだけで、あなたの書くコードの品質は一段階、確実にレベルアップしますよ。応援しています!
