初心者向け解説シリーズ

【初心者向け】VBA入門:簡単なコードサンプルと手順

nanikatoaccess

以下では、「初心者向け VBA入門:簡単なコードサンプルと手順」をテーマに、Microsoft AccessでVBA(Visual Basic for Applications)を初めて使う方向けに解説します。Accessではマクロ機能もありますが、VBAを身につけると外部ファイル操作や高レベルなエラー処理、他システムとの連携など、より高度な開発が可能になります。


1. なぜAccessでVBAを使うのか?

  • マクロだけでは不十分な場面がある: 複雑な条件分岐や外部システムとのやり取りなどは、マクロのGUI操作だけだと対応が難しい場合も。
  • 細やかな制御ができる: フォームの入力チェック、クエリの動的生成、印刷処理の自動化などが柔軟に実装できる。
  • Office製品との連携: ExcelやWord、OutlookなどをVBAを通じて操作することで、業務効率化が大きく進む。

メリット

  • 自由度が高い:プログラミング言語なので豊富な構文とロジックが組める
  • エラー処理ステップ実行など、デバッグ環境が整っている
  • Office他製品ファイル操作がしやすい

2. VBA開発の基本的な流れ

  1. VBAエディタ(開発環境)を開く
    • Access上で「Alt + F11」を押す、またはフォームのイベントプロパティでイベントプロシージャイベントプロシージャイベントプロシージャを選び、………ボタンを押すとVBAエディタが起動。
  2. 標準モジュール or クラスモジュールを作成
    • 標準モジュール: 全般的な関数やサブルーチンを記述。別のフォームやレポートからも呼び出し可能。
    • クラスモジュール(フォーム/レポートモジュール): フォームやレポート、コントロールのイベントごとにコードを書く。
  3. コードを書く
    • Sub … End Sub で手続き(サブルーチン)を定義。
    • 必要に応じてIf文やループ、変数宣言等を使用し、ロジックを記述。
  4. 保存・実行
    • フォームのボタンイベントにSubを紐付けたり、標準モジュールの処理をマクロで呼び出すなどして利用。

3. まずは「MsgBoxを表示する」コード例

VBAの最も簡単なコード例として、**メッセージボックス(MsgBox)**を出すだけのサブルーチンを紹介します。

Public Sub ShowHello()
MsgBox "こんにちは!VBAの世界へようこそ", vbInformation
End Sub
  1. 標準モジュールに上記コードを貼り付け、ShowHello というSubを定義。
  2. フォーム上にボタンを置き、クリックイベントに =ShowHello() を設定(または「イベントプロシージャ」でVBA内から呼ぶ)すると、ボタンを押したときに「こんにちは!」と表示されます。

ポイント

  • vbInformation はアイコンの種類(情報アイコン)を示す。
  • Public は他のフォームやモジュールからも呼べるようにする修飾子。

4. フォームのイベントで「入力チェック」してみる

ないものはない!お買い物なら楽天市場

4.1 サブ例:必須入力をVBAでチェック

Private Sub txt顧客名_BeforeUpdate(Cancel As Integer)
If IsNull(Me.txt顧客名) Or Me.txt顧客名 = "" Then
MsgBox "顧客名は必須入力です。", vbExclamation
Cancel = True ' 更新をキャンセル
End If
End Sub
  • フォームデザインビューで「txt顧客名」のプロパティを開き、「イベント」タブ →「Before Update」の欄にイベントプロシージャイベント プロシージャイベントプロシージャを選択し、………ボタンでVBAエディタを表示。
  • コードを貼り付けると、顧客名が空欄のまま入力を確定しようとするとエラー表示が出て、キャンセルされる。

解説

  • Cancel = True と書くとデータ更新自体が中断されるため、ユーザーはフォームを閉じたり他のレコードに移動できなくなる。
  • MsgBox "..." で警告メッセージを出し、vbExclamation アイコンを表示。

5. データベース操作(DAO/ADO)の基礎

VBAでは、DAO (Data Access Objects)ADO (ActiveX Data Objects) を使ってSQL文を発行したり、レコードセットを操作できます。クエリを自動生成したりレコードを追加/更新したい場合は覚えておくと便利です。

5.1 DAOでSQL実行

Public Sub UpdateRecordDAO()
Dim db As DAO.Database
Dim strSQL As String

Set db = CurrentDb

strSQL = "UPDATE tbl_顧客 SET 電話番号 = '000-1111-2222' WHERE 顧客ID = 1"
db.Execute strSQL, dbFailOnError

MsgBox "ID=1 の顧客電話番号を更新しました。"
End Sub
  • db.Execute strSQL でDML(INSERT/UPDATE/DELETE)クエリを実行。
  • dbFailOnError フラグによりエラーが起きると即座に実行が中断される。

5.2 ADOでレコードセットを取得

Public Sub FetchRecordADO()
Dim cn As Object
Dim rs As Object
Dim strSQL As String

Set cn = CreateObject("ADODB.Connection")
' (ここで cn.Open 接続文字列を設定する例など)
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database\Sample.accdb"

strSQL = "SELECT 顧客ID, 会社名 FROM tbl_顧客 WHERE 顧客ID < 5"
Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, cn, 1, 3 ' adOpenKeyset, adLockOptimistic

Do Until rs.EOF
Debug.Print "ID=" & rs("顧客ID"), "会社名=" & rs("会社名")
rs.MoveNext
Loop

rs.Close : Set rs = Nothing
cn.Close : Set cn = Nothing
End Sub
  • ADOはExcelや他DBとも共通的に使いやすい。
  • Debug.Print でイミディエイトウィンドウ(VBAエディタの[表示]→[イミディエイト])に値を出力して確認。

6. フォーム上のボタンクリックでVBAコードを呼ぶ手順

  1. フォームデザインでボタンを配置。
  2. プロパティシート →「イベント」タブ →「OnClick (クリック時)」を「イベントプロシージャイベント プロシージャイベントプロシージャ」に。
  3. ………ボタンを押すと自動的にVBAエディタでPrivate Sub ボタン名_Click() が作成される。
  4. その中に処理を書き足す例:
Private Sub btnUpdate_Click()
' 例: ID=1の顧客を更新
Dim strSQL As String
strSQL = "UPDATE tbl_顧客 SET 電話番号='000-9999-8888' WHERE 顧客ID=1"

CurrentDb.Execute strSQL
MsgBox "更新完了!", vbInformation
End Sub
  • ボタンを押すと、このコードが実行され、メッセージが表示されるという流れ。

7. エラー処理とデバッグの基礎

7.1 エラー処理(簡易版)

Public Sub SimpleErrorDemo()
On Error GoTo ErrHandler

' 本処理
Dim x As Integer
x = 10 / 0 ' 整数0除算エラー発生

MsgBox "OK!", vbInformation
Exit Sub

ErrHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbExclamation
End Sub
  • On Error GoTo ErrHandler でエラー時に飛び先を定義。
  • Err.DescriptionErr.Number でトラブル内容を取得可能。

7.2 デバッグ(ステップ実行)

  • VBAエディタでブレークポイントを設定(行番号左部をクリック)
  • 実行時に該当行で止めて、F8キーで一行ずつステップ実行
  • ローカルウィンドウイミディエイトウィンドウで変数の値を確認しながら原因を突き止める

8. コードを書く上での初心者向け注意点

  1. 変数宣言 (Option Explicit)
    • モジュール先頭に Option Explicit を入れると、変数が未宣言だとコンパイルエラーになり、スペルミスを防げる
    • Dim 変数名 As 型 をきちんと書く習慣を付ける
  2. 日本語のフィールド名・コントロール名
    • そのまま使うとSQLやVBAでエスケープが必要になりややこしい
    • なるべく英数名にするか、[ ]で囲むなどきちんと対処する
  3. 大量処理やループ
    • 処理が遅い場合、DAOレコードセット操作で直接テーブルにアクセスするほうが速いことも
    • フォームの再描画やオブジェクト操作を最適化する(DoCmd.Echo False で画面更新抑制など)
  4. コメントを書く
    • ' コメント文 を入れて、何のための処理なのかを残す。後々メンテナンスが楽になる

9. まとめ:VBAの第一歩は小さなコードから

  • MsgBox や簡単な入力チェックを通じて、「VBAを書く → イベントに紐づけ → 実行する」流れを体験する
  • DAO/ADO でSQLを発行すると、Access内のクエリ操作以上に柔軟なデータ操作や外部DB連携ができる
  • エラー処理(On Error)や**デバッグ手法(ステップ実行、ウォッチ式)**を覚えると、開発効率が格段にアップ
  • Option Explicit や英数名の利用、コメント挿入などコードを書く習慣を整えるのも重要

初心者の方は、マクロで組んでいた操作を少しずつVBAに置き換えてみたり、テキストボックスのBeforeUpdateイベントをVBAで制御してみるなど、手堅いところから始めるとよいでしょう。慣れてくれば、API連携やファイル操作などより高機能なアプリにもチャレンジできます。


関連記事

最初は難しく感じるかもしれませんが、小さなサブプロシージャからでも書き始めればだんだんVBAの仕組みが理解できるようになります。ぜひ日々の業務にVBAを役立て、Access開発の幅を大きく広げてみてください。

DMM
ABOUT ME
管理人
管理人
駆け出しブロガー
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。 ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。 元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。 みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。
googleアドセンス
記事URLをコピーしました