「マクロで自動化したいが、分岐条件が複雑すぎてマクロデザイナーでは限界を感じる」「フォームのボタンを押したら確認ダイアログを出したい」——Accessマクロの次のステップがVBA(Visual Basic for Applications)です。
AccessのVBAはExcelと同じ言語を使い、VBE(Visual Basic Editor)でコードを記述します。DoCmd命令でフォームを開く・クエリを実行する・レポートを印刷するといった操作をコードで制御でき、MsgBoxで確認ダイアログを表示し、変数で動的な値を扱えます。視覚的なマクロデザイナーでは実現しにくい柔軟なロジックを、短いコードで実装できるのがVBAの強みです。
本記事では、マクロとVBAの違いから始まり、VBEの起動・モジュール作成・変数宣言・DoCmd・MsgBox・デバッグ手順まで体系的に解説します。MOS Access試験の出題範囲と頻出チェックリストも収録しています。

マクロとVBAの違いを理解する
Accessには「マクロ」と「VBA」の2種類の自動化手段があります。どちらも操作を自動実行しますが、用途と表現力が異なります。
| 比較項目 | マクロ(マクロデザイナー) | VBA(VBE) |
|---|---|---|
| 作成方法 | ビジュアルな操作選択 | コードを記述 |
| 学習コスト | 低い(選択肢を選ぶだけ) | やや高い(構文知識が必要) |
| 柔軟性 | 定型操作に最適 | 複雑な条件・ループ・エラー処理が可能 |
| デバッグ | 限定的 | ブレークポイント・ステップ実行が使える |
| 他オブジェクト操作 | Access操作に限定 | DAOでテーブルデータを直接操作できる |
| MOS試験での位置 | Expert範囲(マクロデザイナー) | 参考知識(VBAコード記述は試験範囲外) |
「マクロで動くならマクロで十分」という考え方も正解です。VBAを使うべき場面は、複数条件の分岐・エラーハンドリング・動的な変数処理・他のOfficeアプリとの連携など、マクロデザイナーでは実装しにくいロジックが必要なときです。
VBEの起動とモジュールの種類
AccessのVBAを記述する場所はVBE(Visual Basic Editor)です。起動方法は複数あります。
- リボン「データベースツール」タブ→「マクロ」グループ→「Visual Basic」ボタンをクリック
- フォームやレポートをデザインビューで開き、コントロールを右クリック→「イベントのビルド」→「コードビルダー」を選択
- キーボードショートカット Alt+F11(Accessウィンドウがアクティブな状態で)
VBEが起動するとプロジェクトエクスプローラー(左上)とコードウィンドウ(右側)が表示されます。モジュールには次の3種類があります。
| モジュール種類 | 場所 | 用途 |
|---|---|---|
| 標準モジュール | プロジェクトの「モジュール」フォルダ | データベース全体で使うユーティリティ関数・定数の置き場所 |
| フォームモジュール | 各フォームに内包 | フォームのイベントプロシージャ(ボタンクリック・テキスト変更など) |
| レポートモジュール | 各レポートに内包 | レポートのイベントプロシージャ(印刷時・ページ切替時など) |
実務でよく使うのはフォームモジュールです。「ボタンをクリックしたら次のフォームを開く」「テキストボックスの値が変わったらラベルの色を変える」といった処理は、フォームモジュール内のイベントプロシージャとして実装します。
標準モジュールを新規作成する手順
- VBEのメニューバー「挿入」→「標準モジュール」をクリック
- コードウィンドウに新しいモジュールが表示される
- プロジェクトエクスプローラーの「モジュール」フォルダ直下に「Module1」が追加される
- F4 キーでプロパティウィンドウを開き、「Name」プロパティでモジュール名を変更する(例: modUtility)

変数の宣言とデータ型
VBAで変数を使うには Dim キーワードで宣言します。Accessでは常にモジュールの先頭に Option Explicit を記述して、変数の宣言を強制することを推奨します。宣言なしの変数使用によるタイプミスをコンパイル段階で検出できます。
| データ型 | 宣言例 | 格納できる値 |
|---|---|---|
| String | Dim strName As String | 文字列(テキスト) |
| Long | Dim lngID As Long | 整数(約±21億)。Integer より大きい値を扱う場合に使う |
| Integer | Dim intCount As Integer | 小さな整数(-32768~32767) |
| Double | Dim dblPrice As Double | 小数点を含む数値 |
| Date | Dim dtStart As Date | 日付・時刻 |
| Boolean | Dim blnFlag As Boolean | True / False |
| Variant | Dim varValue As Variant | 任意の型(型未定のときのデフォルト) |
変数のスコープ(有効範囲)は宣言する場所によって異なります。
- プロシージャ内の Dim:そのプロシージャが終わると変数は消滅(ローカル変数)
- モジュール宣言セクションの Dim:そのモジュール内の全プロシージャから参照できる(モジュールレベル変数)
- モジュール宣言セクションの Public:データベース内のすべてのモジュールから参照できる(グローバル変数)
グローバル変数は便利ですが多用するとコードの見通しが悪くなります。基本はローカル変数で実装し、複数プロシージャ間で共有が必要な値だけモジュールレベル変数にするのがベストプラクティスです。

DoCmdオブジェクトで主要操作を自動化する
DoCmd はAccessの操作コマンドをVBAから実行するためのオブジェクトです。マクロデザイナーの「アクション」に相当する操作をコードで記述できます。
よく使うDoCmdのメソッド一覧
| メソッド | 用途 | 使用例 |
|---|---|---|
| OpenForm | フォームを開く | DoCmd.OpenForm “F_顧客詳細”, , , “顧客ID=” & Me.顧客ID |
| OpenReport | レポートを開く(印刷・プレビュー) | DoCmd.OpenReport “R_請求書”, acViewPreview |
| OpenQuery | クエリを実行する | DoCmd.OpenQuery “Q_月次集計” |
| Close | オブジェクトを閉じる | DoCmd.Close acForm, “F_メニュー” |
| GoToRecord | 特定レコードに移動する | DoCmd.GoToRecord , , acFirst |
| FindRecord | レコードを検索する | DoCmd.FindRecord “山田” |
| RunSQL | SQL文を実行する | DoCmd.RunSQL “UPDATE 商品 SET 在庫=0 WHERE 商品ID=5” |
| SetWarnings | 確認ダイアログの表示を切り替える | DoCmd.SetWarnings False |
| TransferSpreadsheet | Excelへのエクスポート | DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, “T_受注”, “C:\data.xlsx” |
| Quit | Accessを終了する | DoCmd.Quit acQuitSaveAll |
OpenFormの引数詳細
OpenForm は最も頻繁に使うメソッドのひとつです。引数を理解すると活用の幅が広がります。
| 引数 | 説明 | 省略 |
|---|---|---|
| FormName | 開くフォームの名前(必須) | 不可 |
| View | acNormal(標準)/ acDesign(デザイン)/ acPreview(印刷プレビュー) | 省略時はacNormal |
| FilterName | 事前定義のフィルター名(クエリ名) | 可 |
| WhereCondition | SQL WHERE句相当の文字列。開くフォームのレコードを絞り込む | 可 |
| DataMode | acFormAdd(追加のみ)/ acFormEdit(編集)/ acFormReadOnly(読取専用) | 省略時はacFormEdit |
| WindowMode | acWindowNormal / acDialog(モーダル)/ acHidden(非表示) | 省略時はacWindowNormal |
WhereConditionでレコードを絞り込む場合は、文字列の連結に注意が必要です。フィールドのデータ型に応じて引用符の形式が変わります。
| フィールド型 | コード例 |
|---|---|
| 数値型(Long等) | “顧客ID=” & Me.顧客ID |
| テキスト型 | “部署名='” & Me.部署名 & “‘” |
| 日付型 | “受注日=#” & Me.受注日 & “#” |

MsgBox・InputBoxでユーザーと対話する
VBAで最もシンプルなユーザー通知は MsgBox 関数です。削除確認・完了通知・警告表示などに使います。
MsgBoxの書式と主なボタン定数
| 定数 | 表示されるボタン | 戻り値(選択時) |
|---|---|---|
| vbOKOnly | OK | vbOK (1) |
| vbOKCancel | OK / キャンセル | vbOK (1) / vbCancel (2) |
| vbYesNo | はい / いいえ | vbYes (6) / vbNo (7) |
| vbYesNoCancel | はい / いいえ / キャンセル | vbYes / vbNo / vbCancel |
削除ボタンに確認ダイアログを付ける実務コード例は以下の通りです。
Private Sub btn削除_Click()
Dim intAnswer As Integer
intAnswer = MsgBox("このレコードを削除しますか?", vbYesNo + vbQuestion, "削除確認")
If intAnswer = vbYes Then
DoCmd.RunCommand acCmdDeleteRecord
MsgBox "削除しました。", vbOKOnly + vbInformation, "完了"
End If
End Sub
InputBoxでユーザーから値を受け取る
InputBox 関数はシンプルなテキスト入力ダイアログを表示し、ユーザーが入力した文字列を返します。キャンセルした場合は空文字列(””)が返ります。
Private Sub btn検索_Click()
Dim strKeyword As String
strKeyword = InputBox("検索キーワードを入力してください", "顧客検索")
If strKeyword = "" Then Exit Sub
DoCmd.FindRecord strKeyword, acAnywhere, False, acSearchAll, False
End Sub
InputBoxのキャンセルチェックは必須です。空文字列のまま処理を続けると意図しない結果になるため、If strKeyword = "" Then Exit Sub でプロシージャを抜けます。
フォームのボタンにVBAコードを割り当てる
実務では、コマンドボタンのクリックイベントにVBAを割り当てるパターンが最も多いです。設定手順は以下の通りです。
- フォームをデザインビューで開く
- コマンドボタンを選択し、プロパティシートの「イベント」タブを開く
- 「クリック時」プロパティの右端の「…」ボタンをクリックする
- 「ビルダーの選択」ダイアログで「コードビルダー」を選択してOK
- VBEが起動し、
Private Sub ボタン名_Click()とEnd Subが自動生成される - 2行の間にVBAコードを記述する
ボタン以外にも、テキストボックスの「変更後更新」・フォームの「現在のレコード移動時」・レポートの「印刷時」など多様なイベントにコードを割り当てることができます。
主要なフォームイベントと用途
| イベント名 | 発生タイミング | よく実装する処理 |
|---|---|---|
| Load | フォームを開いたとき | 初期値の設定・ラベル文字の動的変更 |
| Click(ボタン) | ボタンをクリックしたとき | 別フォームへの遷移・確認ダイアログ・検索実行 |
| AfterUpdate(テキストボックス) | 入力値が確定したとき | 入力値の検証・連動ドロップダウンの絞り込み |
| Current | レコードが移動したとき | ボタンの有効化・無効化・ラベルの更新 |
| BeforeDelete | 削除前 | 削除の確認ダイアログ・関連データのチェック |
| Close | フォームを閉じたとき | 親フォームの再読み込み・セッション変数のクリア |
よく使うVBAコードパターン集
Accessの実務でよく使うVBAパターンを整理します。
フォームの特定フィールド値を取得・設定する
' 現在のフォームのフィールド値を取得
Dim strName As String
strName = Me.txt顧客名.Value ' .Value は省略可
' フィールド値を変更する
Me.txt税込金額.Value = Me.txt金額.Value * 1.1
' フォームを閉じて親フォームを更新する
DoCmd.Close acForm, Me.Name
Forms("F_受注一覧").Refresh
If文で条件分岐する(必須入力チェック)
Private Sub btn保存_Click()
' 必須入力チェック
If IsNull(Me.txt顧客名) Or Me.txt顧客名 = "" Then
MsgBox "顧客名を入力してください。", vbOKOnly + vbExclamation, "入力エラー"
Me.txt顧客名.SetFocus
Exit Sub
End If
DoCmd.RunCommand acCmdSaveRecord
MsgBox "保存しました。", vbOKOnly + vbInformation, "完了"
End Sub
For…Nextでループ処理する
' 番号付きコントロールを一括で非表示にするループ
Dim i As Integer
For i = 1 To 5
Me.Controls("lbl項目" & i).Visible = False
Next i
エラーハンドリングの基本形
VBAでは On Error GoTo 文でエラーをキャッチします。これはマクロデザイナーでは実装できないVBAならではの強みです。
Private Sub btn実行_Click()
On Error GoTo ErrorHandler
DoCmd.SetWarnings False
DoCmd.OpenQuery "Q_月次集計更新"
DoCmd.SetWarnings True
MsgBox "集計更新が完了しました。", vbOKOnly + vbInformation, "完了"
Exit Sub
ErrorHandler:
DoCmd.SetWarnings True ' 必ずリセット
MsgBox "エラーが発生しました: " & Err.Description, vbOKOnly + vbCritical, "エラー"
End Sub
エラーハンドリングで重要なのは、DoCmd.SetWarnings False を使った場合は必ず True に戻すことです。エラーが発生しても ErrorHandler ブロック内でリセットすることで、警告が永続的に抑制される事故を防げます。
デバッグの基本手順
VBAのコードが思い通りに動かないときは、VBEのデバッグ機能を使います。
ブレークポイントの設定とステップ実行
- VBEのコードウィンドウで処理を止めたい行の左余白をクリック→赤丸が付きブレークポイントが設定される
- フォームに戻ってボタンを押すと、ブレークポイントの行で実行が一時停止する(黄色ハイライト表示)
- この状態で変数名にカーソルを合わせると現在の値がポップアップ表示される
- F8 キーで1行ずつステップ実行できる
- F5 キーで次のブレークポイントまで実行を再開する
- ブレークポイントは F9 キーのトグルで設定・解除できる
イミディエイトウィンドウの活用
VBEの「表示」→「イミディエイトウィンドウ」(Ctrl+G)を開くと、コード実行中に Debug.Print で出力した値を確認できます。
' コード内に以下を挿入してイミディエイトウィンドウに値を出力
Debug.Print "顧客ID: " & Me.顧客ID
Debug.Print "現在時刻: " & Now()
イミディエイトウィンドウでは、一時停止中に ?Me.顧客ID と入力してEnterを押すことで変数や式の値を即座に確認することもできます。MsgBoxでの確認よりも効率よくデバッグできます。
MOS Access試験とVBAの関係
MOS Access試験(GeneralおよびExpert)の出題範囲について、VBAのコード記述そのものはMOS試験の直接的な評価対象ではありません。ただし、VBAと密接に関係する以下の操作は試験問題として登場します。
| 試験頻出操作 | VBAとの関連 |
|---|---|
| マクロをVBAコードに変換する | デザインビューのマクロを「マクロをVisual Basicに変換」機能で変換できる |
| コマンドボタンへのイベント割り当て | コードビルダーでのフォームモジュール作成手順は試験で問われる |
| イベントプロパティに「[イベントプロシージャ]」を設定する | プロパティシートの「イベント」タブで「[イベントプロシージャ]」を選択する操作 |
MOS試験チェックリスト
- ☑ VBEを Alt+F11 で起動できる
- ☑ フォームのコマンドボタンにイベントプロシージャを割り当てられる
- ☑ プロパティシートの「イベント」タブで「[イベントプロシージャ]」を設定できる
- ☑ 既存のマクロを「マクロをVisual Basicに変換」機能でVBAコードに変換できる
- ☑ DoCmd.OpenForm の基本構文(フォーム名・ビュー・WhereCondition引数)を理解している
- ☑ MsgBoxで確認ダイアログを表示するコードを読み書きできる
- ☑ Option Explicit の意味と配置場所(モジュール先頭)を理解している
まとめ:VBAでAccessを業務アプリとして仕上げる
本記事のポイントをまとめます。
- マクロとVBAの役割分担:定型操作はマクロデザイナーで十分。条件分岐・ループ・エラーハンドリング・他アプリ連携が必要な場面でVBAに切り替える
- VBEの基本:Alt+F11で起動。標準モジュール・フォームモジュール・レポートモジュールの3種類を用途に応じて使い分ける
- 変数宣言:Option ExplicitとDim宣言で型安全なコードを書く。スコープはプロシージャ→モジュール→グローバルの順で広がる
- DoCmd:マクロの各アクションに対応するメソッドを持つオブジェクト。OpenForm・OpenReport・RunSQL・CloseなどAccessの主要操作をコードで実行できる
- MsgBox・InputBox:確認ダイアログと入力ダイアログ。戻り値(vbYes/vbNo等)で分岐処理を実装する
- エラーハンドリング:On Error GoToでエラーをキャッチし、SetWarningsなどの危険な状態をErrorHandlerブロック内でリセットする
- デバッグ:ブレークポイント・F8ステップ実行・Debug.Printとイミディエイトウィンドウでコードの動作を検証する
VBAの習得は「すべての構文を覚える」ことより「動くコードを読んで改造する」ことから始めると効率的です。本記事のコードサンプルをAccessの既存フォームに貼り付けて実行し、ブレークポイントで動作を確認しながら少しずつカスタマイズしていくことで、実務で使えるVBAスキルが身に付きます。
PR
改善Excel パフォーマンスを底上げする仕事改善・効率化テクニック
ExcelマクロとAccessVBAは同じVBA言語を使います。本書で「繰り返し作業を自動化する」という思考法とコード設計の考え方を身に付けると、AccessのDoCmdを使ったフォーム制御やクエリ実行の自動化にも直接応用できます。
PR
MOS試験の出題形式と操作確認の方法を把握できる定番対策書。ExcelとAccessはMOSの試験スタイルが共通しており、プロパティシート操作やイベント設定の「どこで何を設定するか」という感覚をExcelで養うことでAccess試験の学習効率も上がります。
