AccessのVBA入門|DoCmd・MsgBox・変数宣言でマクロより柔軟な業務自動化を実装する実践手順とMOS試験対策

「マクロで自動化したいが、分岐条件が複雑すぎてマクロデザイナーでは限界を感じる」「フォームのボタンを押したら確認ダイアログを出したい」——Accessマクロの次のステップがVBA(Visual Basic for Applications)です。

AccessのVBAはExcelと同じ言語を使い、VBE(Visual Basic Editor)でコードを記述します。DoCmd命令でフォームを開く・クエリを実行する・レポートを印刷するといった操作をコードで制御でき、MsgBoxで確認ダイアログを表示し、変数で動的な値を扱えます。視覚的なマクロデザイナーでは実現しにくい柔軟なロジックを、短いコードで実装できるのがVBAの強みです。

本記事では、マクロとVBAの違いから始まり、VBEの起動・モジュール作成・変数宣言・DoCmd・MsgBox・デバッグ手順まで体系的に解説します。MOS Access試験の出題範囲と頻出チェックリストも収録しています。

マクロとVBAの違いを比較した図解(作成方法・学習コスト・得意な処理・デバッグの使い分け)
目次

マクロと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変数のスコープを示す図解(ローカル・モジュールレベル・グローバルの入れ子構造と使い分け)

変数の宣言とデータ型

VBAで変数を使うには Dim キーワードで宣言します。Accessでは常にモジュールの先頭に Option Explicit を記述して、変数の宣言を強制することを推奨します。宣言なしの変数使用によるタイプミスをコンパイル段階で検出できます。

データ型宣言例格納できる値
StringDim strName As String文字列(テキスト)
LongDim lngID As Long整数(約±21億)。Integer より大きい値を扱う場合に使う
IntegerDim intCount As Integer小さな整数(-32768~32767)
DoubleDim dblPrice As Double小数点を含む数値
DateDim dtStart As Date日付・時刻
BooleanDim blnFlag As BooleanTrue / False
VariantDim varValue As Variant任意の型(型未定のときのデフォルト)

変数のスコープ(有効範囲)は宣言する場所によって異なります。

  • プロシージャ内の Dim:そのプロシージャが終わると変数は消滅(ローカル変数)
  • モジュール宣言セクションの Dim:そのモジュール内の全プロシージャから参照できる(モジュールレベル変数)
  • モジュール宣言セクションの Public:データベース内のすべてのモジュールから参照できる(グローバル変数)

グローバル変数は便利ですが多用するとコードの見通しが悪くなります。基本はローカル変数で実装し、複数プロシージャ間で共有が必要な値だけモジュールレベル変数にするのがベストプラクティスです。

DoCmd.OpenFormの引数を分解した図解(FormName・View・WhereConditionと引用符の型別ルール)

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 “山田”
RunSQLSQL文を実行するDoCmd.RunSQL “UPDATE 商品 SET 在庫=0 WHERE 商品ID=5”
SetWarnings確認ダイアログの表示を切り替えるDoCmd.SetWarnings False
TransferSpreadsheetExcelへのエクスポートDoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, “T_受注”, “C:\data.xlsx”
QuitAccessを終了するDoCmd.Quit acQuitSaveAll

OpenFormの引数詳細

OpenForm は最も頻繁に使うメソッドのひとつです。引数を理解すると活用の幅が広がります。

引数説明省略
FormName開くフォームの名前(必須)不可
ViewacNormal(標準)/ acDesign(デザイン)/ acPreview(印刷プレビュー)省略時はacNormal
FilterName事前定義のフィルター名(クエリ名)
WhereConditionSQL WHERE句相当の文字列。開くフォームのレコードを絞り込む
DataModeacFormAdd(追加のみ)/ acFormEdit(編集)/ acFormReadOnly(読取専用)省略時はacFormEdit
WindowModeacWindowNormal / acDialog(モーダル)/ acHidden(非表示)省略時はacWindowNormal

WhereConditionでレコードを絞り込む場合は、文字列の連結に注意が必要です。フィールドのデータ型に応じて引用符の形式が変わります。

フィールド型コード例
数値型(Long等)“顧客ID=” & Me.顧客ID
テキスト型“部署名='” & Me.部署名 & “‘”
日付型“受注日=#” & Me.受注日 & “#”
MsgBoxのvbYesNoで削除確認する処理フローの図解(はい・いいえの分岐と削除実行)

MsgBox・InputBoxでユーザーと対話する

VBAで最もシンプルなユーザー通知は MsgBox 関数です。削除確認・完了通知・警告表示などに使います。

MsgBoxの書式と主なボタン定数

定数表示されるボタン戻り値(選択時)
vbOKOnlyOKvbOK (1)
vbOKCancelOK / キャンセル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 365 対策テキスト&問題集

MOS試験の出題形式と操作確認の方法を把握できる定番対策書。ExcelとAccessはMOSの試験スタイルが共通しており、プロパティシート操作やイベント設定の「どこで何を設定するか」という感覚をExcelで養うことでAccess試験の学習効率も上がります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次