Excel VBA

Excel VBAの基本構文まとめ|初心者がまず覚える6つの基礎構文【サンプルコード付き】

VBAを学ぼうとすると、構文の多さに圧倒されて挫折しがちです。
ですが実務で日常的に使う構文は、実はそれほど多くありません。

この記事では、業務システム開発の現場でも頻度の高い構文だけに絞って、最短で「動くマクロが書ける」状態を目指して解説します。

VBAを書く前の準備

  1. 任意のExcelファイルを開く
  2. リボンに「開発」タブを表示する(ファイル→オプション→リボンのユーザー設定→「開発」にチェック)
  3. 「開発」タブ→「Visual Basic」でVBE(VBAの編集画面)を開く
  4. プロジェクトツリーで対象のブックを右クリック→「挿入」→「標準モジュール」を追加する

以降のコードは、この標準モジュールに貼り付けて実行します。

なお、ファイルを保存するときは注意が必要です。
通常の「.xlsx」形式で保存すると、書いたコードごと消えてしまいます。
「名前を付けて保存」でファイルの種類を「Excel マクロ有効ブック(.xlsm)」に変更してから保存してください。

最初に覚える6つのVBA基礎構文

1. 変数宣言(Dim)と型

変数とは、数値や文字列などの値を一時的に入れておく「箱」のようなものです。
Dimは「これからこの名前の箱を使います、中身の型はこれです」とVBAに宣言する命令です。

' 基本形:Dim 変数名 As 型
Dim customerName As String
Dim quantity As Long
Dim unitPrice As Double

customerName = "サンプル商事"
quantity = 10
unitPrice = 1500.5

実務ではこう使う:見積書の「数量」「単価」のように計算に使う値は型を明示して宣言すると、意図しない型の値を代入しようとした瞬間に型が一致しませんエラーが発生するため、どこで問題が起きたかがすぐにわかる。

2. セルの値取得・代入(Range / Cells)

VBAでExcelを操作する基本は「セルの値を読み書きすること」です。
RangeやCellsでセル番地を指定し、そこから値を取り出したり、逆に値を書き込んだりします。

' 基本形:セル番地を直接指定する書き方
Range("B1").Value = "サンプル商事"

' 基本形:行・列を変数で指定する書き方(ループ向き)
Cells(3, "A").Value = "商品A"

実務ではこう使う:固定位置(顧客名欄など)はRange、行数が変動する明細行はCellsを使うとループ処理と相性が良い。

3. 条件分岐(If〜Then〜Else)

条件分岐とは、「条件によって処理を変える」仕組みです。
指定した条件が成立するか(真か偽か)を判定し、結果に応じて異なる処理を実行します。

' 基本形:If 条件 Then → ElseIf 条件 Then → Else → End If
If quantity <= 0 Then
    MsgBox "数量は1以上を入力してください。", vbExclamation
ElseIf quantity > 1000 Then
    MsgBox "数量が大きすぎます。", vbExclamation
Else
    MsgBox "数量は正常です。", vbInformation
End If

実務ではこう使う:入力チェック(空欄でないか、数値として妥当かなど)のほとんどはこの形で書ける。

4. 繰り返し処理(For〜Next / Do While)

繰り返し処理とは、同じ処理を複数回実行する仕組みです。
決まった回数を繰り返すFor〜Nextと、条件を満たす間だけ繰り返すDo Whileがあり、状況によって使い分けます。

' 基本形:For 開始値 To 終了値 → Next(決まった回数を繰り返す)
Dim i As Long
For i = 1 To 5
    Cells(i, "A").Value = "行" & i
Next i

' 基本形:Do While 条件 → Loop(条件を満たす間、繰り返す)
Dim r As Long, total As Long
r = 1
total = 0
Do While Cells(r, "A").Value <> ""
    total = total + Cells(r, "B").Value
    r = r + 1
Loop

実務ではこう使う:明細行のように「何行あるか事前にわからない」データを1行ずつ処理する場面で多用する。
上の例ではA列にデータがある間、B列の値をtotalに加算し続けている。

5. 最終行・最終列の取得(End(xlUp)など)

実務で扱うExcel表は、日によってデータの行数が増えたり減ったりします。
そのため、コードの中で「今何行目までデータが入っているか」を自動的に調べる処理が必要になります。

' 基本形:Cells(Rows.Count, 列).End(xlUp).Row
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row

実務ではこう使う:Cells(Rows.Count, 列).End(xlUp).Rowは、シートの一番下のセルを起点に、Ctrl+↑キーを押したときと同じ動きで上方向に移動し、データが入っている表の一番下の行(=データの最後の行)を見つけて、その行番号を取得する。
たとえばA1〜A10までデータがあり、A11以降が空欄なら、lastRowには10が入る。
これをFor i = 3 To lastRowのようにループの終了値として使えば、データが何行あっても自動的に対応でき、行数を決め打ちしないための定番テクニックになる。

6. メッセージ表示・確認(MsgBox)

MsgBoxは、画面にメッセージを表示してユーザーに知らせたり、「はい/いいえ」で確認を求めたりするための命令です。

' 基本形:MsgBox(メッセージ, ボタン種類, タイトル)
Dim answer As VbMsgBoxResult
answer = MsgBox("この内容で登録しますか?", vbYesNo + vbQuestion, "確認")
If answer = vbYes Then
    MsgBox "登録しました。"
End If

実務ではこう使う:処理完了の通知に加え、「本当に実行してよいか」の確認ステップを入れると誤操作を防げる。

覚えた構文を組み合わせるとできること

上の6つを組み合わせると、たとえば次のような処理が書けます。

例:注文リスト(1行目は見出し、A列:商品名、B列:数量)から、数量が100個以上の大口注文の商品名だけをD列に抽出する

注文リストから数量100個以上の大口注文を抽出する処理の6構文フロー:最終行取得→繰り返し→条件分岐→セルへ代入→完了通知

実際に試す場合は、次の手順で進めてください。

  1. 下の表を、ワークシートのA1〜B5にそのまま入力する(A1・B1が見出し行)
  2. 「VBAを書く前の準備」で追加した標準モジュールに、下記のコードをそのまま貼り付ける
  3. コード内にカーソルを置き、F5キー(またはVBE上部の▶実行ボタン)を押してマクロを実行する(「マクロ」という選択ダイアログが表示された場合は、「ExtractLargeOrders」が選択された状態のまま「実行(R)」ボタンをクリックする)
  4. 「抽出が完了しました。」というメッセージが表示されたら「OK」をクリックする
  5. Excelの画面に戻り、D列に数量100以上の商品名(商品B・商品D)が書き出されているか確認する
商品名 数量
商品A 50
商品B 120
商品C 80
商品D 150
Sub ExtractLargeOrders()
    Dim i As Long, lastRow As Long, outputRow As Long

    ' 注文リストの最終行を取得(STEP1)
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    outputRow = 1

    ' 2行目(1行目は見出し)から最終行まで繰り返す(STEP2)
    For i = 2 To lastRow
        ' 数量(B列)が100個以上かを判定する(STEP3)
        If Cells(i, "B").Value >= 100 Then
            ' 該当する商品名(A列)をD列に書き出す(STEP4)
            Cells(outputRow, "D").Value = Cells(i, "A").Value
            outputRow = outputRow + 1
        End If
    Next i

    ' 完了を通知する(STEP5)
    MsgBox "抽出が完了しました。", vbInformation
End Sub

実際に手元のExcelでこのマクロを実行した結果です。
「抽出が完了しました。」のメッセージとともに、D列に数量100以上の商品B・商品Dの商品名が書き出されています。

ExtractLargeOrdersマクロを実行した結果。D列に商品B・商品Dが抽出され、「抽出が完了しました。」というメッセージが表示されている

慣れてきたら、表の数値や商品名を書き換えて、もう一度マクロを実行してみましょう。
条件(100以上かどうか)や抽出される商品がどう変わるかを確認すると、コードの動きがより実感できます。

この流れは、見積書・請求書の自動化をはじめ多くの帳票処理・データ抽出の土台になります。
実例は初回記事で解説しています。

つまずきやすいポイント

初心者が特につまずきやすいのが、Ifに対するEnd If、Forに対するNextの書き忘れです。
片方だけ書いてもう片方を忘れると、エラーになったり意図しない動きになったりします。
IfとEnd If、ForとNextは必ずセットで書くと覚えておき、VBEが自動で整えてくれるインデント(字下げ)のズレを目印にすると、書き忘れに気づきやすくなります。

次のステップ

基本構文を覚えたら、Excel VBAで見積書・請求書の作成を自動化する方法【サンプルコード付き】で実務での組み立て方を確認してみてください。

まとめ

構文を丸暗記する必要はありません。
わからなくなったら、その都度調べればよいからです。
ただし、調べるためには「こういう構文がある」ということ自体を知っておく必要があります。
今回の6つ(変数宣言・セル操作・条件分岐・繰り返し・最終行取得・メッセージ表示)も、まずは存在と大まかな使い道さえ知っておけば十分です。
あとは組み合わせ例のように実際に手を動かしてみることで、使い方の感覚がつかめてきます。
ぜひ手元のExcelで、数値やデータを変えながらいろいろ試してみてください。

覚えた構文を実務でどう組み合わせるかは、複数シートのデータを1つにまとめるVBAマクロの作り方で扱っています。構文を覚えなくてもChatGPTに書かせる方法はChatGPTにVBAコードを書かせて業務を自動化する方法で紹介しています。VBAとPython、どちらを学ぶべきか迷っている場合はVBAとPython、業務自動化にはどちらを学ぶべきか比較も参考にしてください。

-Excel VBA
-