マクロ・VBA入門

Excel VBAの始め方と
よく使うコード一覧

VBAを書き始めるための準備と、よく使う基本のコードをまとめました。セル・範囲の指定、変数、条件分岐、繰り返し、関数の書き方まで、そのままコピーして試せる例で紹介します。

マクロやVBAが何かを知りたい方は、先にマクロ・VBA入門の記事をご覧ください。

開発環境の準備(Windows)

VBAを書くのに、別のソフトは要りません。Excelに入っているVBE(Visual Basic Editor)で書いて、そのまま実行します。最初に一度だけ、次の準備をします。

1. 開発タブを表示する

「ファイル」→「オプション」→「リボンのユーザー設定」を開き、右側の「メイン タブ」の一覧で「開発」にチェックを入れて「OK」を押します。リボンに「開発」タブが出ます。

2. VBEを開く

「開発」タブの「Visual Basic」を押します。Alt+F11でも開けます。もう一度押すとExcelの画面に戻ります。

3. 標準モジュールを追加する

VBEのメニューで「挿入」→「標準モジュール」を選びます。左のプロジェクトに「Module1」ができ、右側にコードを書けるようになります。ふだんのマクロは、この標準モジュールに書きます。

4. 「変数の宣言を強制する」をオンにする

VBEの「ツール」→「オプション」→「編集」タブで「変数の宣言を強制する」にチェックを入れます。新しく作るモジュールの先頭に次の1行が自動で入り、変数名の打ち間違いをエラーで教えてくれます。

モジュールの先頭
Option Explicit   ' モジュールの先頭。Dim していない変数があるとエラーで教えてくれる

5. 書いて、実行する

コードを書いたら、Sub 〜 End Sub の中をクリックしてから、ツールバーの「▶」(Sub/ユーザー フォームの実行)を押すか、F5を押します。Excelの画面からは「開発」タブの「マクロ」(Alt+F8)で、名前を選んで実行できます。

途中の値を確かめたいときは、VBEの「表示」→「イミディエイト ウィンドウ」(Ctrl+G)を開き、コードに「Debug.Print 変数名」と書くと、そこに値が出ます。

6. マクロ有効ブック(.xlsm)で保存する

VBAを書いたブックは、「名前を付けて保存」で「Excel マクロ有効ブック(*.xlsm)」を選びます。ふつうの .xlsx で保存すると、書いたコードが消えてしまいます。

開いたときに「セキュリティの警告 マクロが無効にされました」と出たら、自分で作った・信頼できるブックのときだけ「コンテンツの有効化」を押します。メールやインターネットから保存したファイルは、マクロがブロックされることがあります。その場合はファイルを右クリック→「プロパティ」で「許可する」にチェックを入れます。

マクロで変えた内容は、Ctrl+Zで元に戻せません。試すときは、ブックのコピーや練習用のデータを使いましょう。

Macの場合は、「Excel」メニュー→「環境設定」→「リボンとツールバー」で開発タブを表示し、開発タブの「Visual Basic」でVBEを開きます。

マクロウブラウザで操作の練習開発タブの表示からコードの実行まで練習する →

よく使うコードの早見表

まずはこれだけ読めれば、記録したマクロやAIが作ったコードの多くが読めるようになります。それぞれの詳しい書き方は、下の節で紹介します。

書き方意味
Sub 名前() 〜 End Subマクロ(プロシージャ)の始まりと終わり
' コメント' から行末までは実行されないメモ
Dim 変数 As Long変数を用意する(Long は整数)
Set 変数 = Worksheets("集計")シートやセルなどを変数に入れる
Range("A1")セルA1
Range("A1:C5")A1からC5までの範囲
Cells(行, 列)行・列の番号でセルを指定
Cells(Rows.Count, 1).End(xlUp).RowA列で最後にデータがある行
.Valueセルの値
If 条件 Then 〜 End If条件に合うときだけ実行
For i = 1 To 10 〜 Next i決まった回数くり返す
For Each 変数 In 範囲 〜 Next範囲のセルを1つずつ処理
Function 名前() 〜 End Function値を返す自作の関数
WorksheetFunction.Sum(範囲)ワークシート関数をVBAで使う
MsgBox "文字"メッセージを表示

マクロの基本形(Sub)とコメント

マクロは「Sub マクロ名()」で始まり、「End Sub」で終わります。この間に書いた命令が、上から順に実行されます。マクロ名には日本語も使えます。

マクロの基本形
Sub あいさつ()
    ' この行はコメント(実行されません)
    MsgBox "こんにちは"
End Sub

「'」(シングルクォーテーション)から行末まではコメントです。何をしている行かを書いておくと、あとで読み返すときや、ほかの人に渡すときに役立ちます。

ほかのマクロを呼び出すときは「Call」を使います。

マクロを呼び出す
Sub まとめて実行()
    Call 売上チェック     ' ほかのマクロを呼び出す
    Call あいさつ
End Sub

変数・定数の書き方

変数は、計算の途中の値や、何度も使う値を入れておく箱です。「Dim 変数名 As 型」で用意し、「=」で値を入れます。

変数を用意して使う
Sub 変数の例()
    Dim total As Long        ' 整数
    Dim customer As String   ' 文字列
    Dim price As Double      ' 小数を含む数
    Dim today As Date        ' 日付
    Dim finished As Boolean  ' True か False

    total = 12
    customer = "こもれび商店"
    price = 1200.5
    today = Date
    finished = False

    Range("A1").Value = customer & ":" & total & "件"
End Sub
型入れるもの
Long整数(行番号や件数など)
Double小数を含む数(金額・割合など)
String文字列
Date日付・時刻
BooleanTrue / False
Variant何でも入る(型を決めないとき)
Worksheet / Rangeシート・セル(Set で入れる)

シートやセルのような「もの」(オブジェクト)を変数に入れるときは、先頭に「Set」を付けます。付け忘れるとエラーになるので、よくつまずくところです。

シート・セルを変数に入れる
Dim ws As Worksheet
Set ws = Worksheets("集計")    ' シートやセルは Set で入れる
ws.Range("A1").Value = "売上合計"

Dim target As Range
Set target = ws.Range("A2:C10")
target.ClearContents

消費税率のように途中で変わらない値は、「Const」で定数にしておくと、変えるときに1か所直すだけで済みます。

定数
Const TAX_RATE As Double = 0.1   ' 途中で変わらない値

Range("C2").Value = Range("B2").Value * (1 + TAX_RATE)

セル・範囲の指定の仕方

VBAでいちばんよく書くのが、セルの指定です。「Range("A1")」はセル番地で、「Cells(行, 列)」は番号で指定します。繰り返しの中で行を1つずつずらすときは、番号で指定できる Cells が便利です。

セル・範囲の指定
Range("A1").Value = 100                     ' A1
Range("A1:C3").Value = 0                    ' A1〜C3 にまとめて
Range("A:A").Font.Bold = True               ' A列全体
Range("2:2").Font.Bold = True               ' 2行目全体
Cells(2, 3).Value = "C2"                     ' 2行目・3列目(C2)
Range(Cells(1, 1), Cells(5, 3)).Select      ' A1〜C5
Worksheets("集計").Range("A1").Value = "合計" ' シートを指定する

シート名を書かないと、そのとき開いているシート(アクティブシート)が対象になります。別のシートを操作するときは「Worksheets("シート名").」を前に付けます。

最後の行を求める

毎月行数が変わる表では、データがどこまであるかを調べてから処理します。A列の一番下のセルから上へ向かって、最初にデータがあるセルの行番号を求める書き方です。

最終行
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row   ' A列の一番下から上へ探す

Range("A2:A" & lastRow).Font.Bold = True     ' 見出しの下から最後の行まで

表全体・ずらす・広げる

CurrentRegion・Offset・Resize
Range("A1").CurrentRegion.Select       ' A1とつながった表全体
Range("A1").Offset(1, 0).Value = "下"    ' 1行下(A2)
Range("A1").Offset(0, 2).Value = "右"    ' 2列右(C1)
Range("A1").Resize(3, 2).Select         ' A1から3行×2列(A1:B3)

値・数式・書式の操作

セルの値は「.Value」で読み書きします。数式は「.Formula」に、Excelで入力するときと同じ文字列を入れます。

値・数式・書式
Range("D2").Formula = "=B2*C2"                  ' 数式を入れる
Range("A2:D10").ClearContents                   ' 値だけ消す(書式は残る)
Range("A1").Font.Bold = True                    ' 太字
Range("A1").Interior.Color = RGB(255, 242, 204) ' 塗りつぶしの色
Range("D2:D10").NumberFormat = "#,##0"          ' 3桁区切り
Range("A1:D10").Copy Destination:=Worksheets("控え").Range("A1")  ' コピーして貼り付け

条件分岐(If・Select Case)

条件によって処理を分けるときは「If 〜 Then」を使います。最後の「End If」を忘れないようにしましょう。条件をいくつも分けるときは「ElseIf」、どれにも当てはまらないときは「Else」です。

If 〜 ElseIf 〜 Else
If Range("B2").Value >= 80 Then
    Range("C2").Value = "合格"
ElseIf Range("B2").Value >= 60 Then
    Range("C2").Value = "再確認"
Else
    Range("C2").Value = "不合格"
End If
空欄の判定・複数の条件
If Range("A2").Value = "" Then
    MsgBox "A2が空欄です"
End If

' And(どちらも)・Or(どちらか)・<>(等しくない)
If Range("B2").Value >= 60 And Range("C2").Value <> "欠席" Then
    Range("D2").Value = "OK"
End If

1つの値で何通りにも分けるときは、「Select Case」の方が読みやすくなります。

Select Case
Select Case Range("B2").Value
    Case "東京", "横浜"
        Range("C2").Value = "関東"
    Case "大阪", "京都"
        Range("C2").Value = "関西"
    Case Else
        Range("C2").Value = "その他"
End Select

繰り返し(For・For Each・Do While)

行ごとに同じ処理をするのが、VBAがいちばん力を発揮するところです。「For 〜 Next」は、変数 i を1ずつ増やしながらくり返します。

For 〜 Next(2行目から10行目まで)
Dim i As Long
For i = 2 To 10
    Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value
Next i

範囲の中のセルや、ブックの中のシートを1つずつ処理するときは「For Each」です。

For Each
Dim cell As Range
For Each cell In Range("A2:A10")
    If cell.Value = "" Then
        cell.Interior.Color = RGB(255, 199, 206)   ' 空欄を赤く
    End If
Next cell

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets   ' すべてのシート
    ws.Range("A1").Font.Bold = True
Next ws

終わりの行が決まっていないときは、「Do While」で条件を満たすあいだくり返します。「r = r + 1」を忘れると止まらなくなります。止まらなくなったときは、EscかCtrl+Breakで中断できます。

Do While 〜 Loop
Dim r As Long
r = 2
Do While Cells(r, 1).Value <> ""   ' A列が空欄になるまで
    Cells(r, 5).Value = "確認済み"
    r = r + 1
Loop
途中で抜ける(Exit For)
For i = 2 To 100
    If Cells(i, 1).Value = "合計" Then Exit For   ' 途中で抜ける
Next i

関数の書き方と使い方

VBAで「関数」というと、次の3つがあります。

自分で関数を作る(Function)

「Function」で作ると、計算した値を返す関数になります。関数名に値を入れると、それが結果になります。標準モジュールに書いておけば、セルに「=税込金額(A2)」と入力して、ワークシート関数と同じように使うこともできます。

Function
Function 税込金額(price As Double) As Double
    税込金額 = price * 1.1     ' 関数名に入れた値が結果になる
End Function

Sub 関数を使う()
    Range("B2").Value = 税込金額(Range("A2").Value)
End Sub

ワークシート関数をVBAで使う

SUM や COUNTIF など、セルで使う関数は「WorksheetFunction.」を付けて呼び出せます。

WorksheetFunction
Range("C11").Value = WorksheetFunction.Sum(Range("C2:C10"))
Range("C12").Value = WorksheetFunction.Average(Range("C2:C10"))
Range("C13").Value = WorksheetFunction.CountIf(Range("B2:B10"), "東京")

VBAの関数

日付や文字列を扱う関数は、VBAにも用意されています。

Format・Len・Left・Replace など
Range("A1").Value = Format(Date, "yyyy年m月d日")   ' 今日の日付を文字に
Range("A2").Value = Now                           ' 今の日時
Range("A3").Value = Len("こもれび商店")             ' 文字数 → 6
Range("A4").Value = Left("2026-10-06", 4)         ' 左から4文字 → 2026
Range("A5").Value = Replace("東京支店", "支店", "") ' 置き換え → 東京
Range("A6").Value = Trim("  東京  ")               ' 前後の空白を消す

メッセージと入力(MsgBox・InputBox)

処理の終わりを知らせたり、実行前に確認したりするときに使います。「InputBox」を使うと、実行するたびに月や担当者などを入力してもらえます。

MsgBox・InputBox
MsgBox "終わりました"

If MsgBox("実行しますか?", vbYesNo) = vbNo Then Exit Sub

Dim answer As String
answer = InputBox("何月分ですか?")
Range("A1").Value = answer & "月分"

シート・ブックの操作

シート・ブック
Worksheets("売上").Activate                    ' シートを切り替える
Worksheets("売上").Copy After:=Worksheets(Worksheets.Count)  ' シートをコピー
ActiveSheet.Name = "10月"                        ' シート名を変える
Worksheets.Add After:=Worksheets(Worksheets.Count)          ' シートを追加

Dim book As Workbook
Set book = Workbooks.Open(ThisWorkbook.Path & "\東京_10月.xlsx")
book.Close SaveChanges:=False                    ' 保存せずに閉じる
ThisWorkbook.Save                                ' このブックを上書き保存

処理が多いときは画面の更新を止めると、速く終わります。エラーが出たときの処理は「On Error GoTo」で書けます。

画面の更新を止める
Sub 速く動かす()
    Application.ScreenUpdating = False   ' 画面の更新を止める
    ' …時間がかかる処理…
    Application.ScreenUpdating = True    ' 最後に戻す
End Sub
エラーに備える
Sub エラーに備える()
    On Error GoTo ErrHandler
    Worksheets("集計").Range("A1").Value = "OK"
    Exit Sub
ErrHandler:
    MsgBox "エラーが出ました:" & Err.Description
End Sub

組み合わせた例:売上表の計算と色付け

ここまでのコードを組み合わせると、こうなります。「売上」シートのA列に品名、B列に数量、C列に単価がある表で、D列に金額を計算し、10万円以上の行を緑にします。

売上チェック
Sub 売上チェック()
    Dim ws As Worksheet
    Dim lastRow As Long, i As Long
    Set ws = Worksheets("売上")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        ' 金額 = 数量 × 単価
        ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
        ' 10万円以上なら緑に
        If ws.Cells(i, 4).Value >= 100000 Then
            ws.Cells(i, 4).Interior.Color = RGB(198, 239, 206)
        Else
            ws.Cells(i, 4).Interior.ColorIndex = xlNone
        End If
    Next i

    MsgBox lastRow - 1 & "行を計算しました"
End Sub

変数(Dim)、シートの指定(Set)、最終行、繰り返し(For)、条件分岐(If)が入っています。1行ずつ「どのセルに、何をしているか」が読めれば、行数や条件を変えて自分の表に合わせられます。

AIにコードを作ってもらうときも、この形が読めると、どの列を計算しているか、条件が合っているかを自分で確かめられます。

もっと学ぶには

コード一覧で書き方を確かめながら、教材のファイルで実際に動かしてみるのがおすすめです。順番に学べる入門書なら、マクロの記録から変数・繰り返し・条件分岐までを、つながりのある例で練習できます。

PR・広告

エクセル兄さんの本で学ぶ

YouTuberのエクセル兄さん(たてばやし淳)が書いた『Excel VBA塾』。本と動画で学びたい方はチェックしてみてください。

一人だとつまずいたままになりそうな方や、自分の仕事のどこを自動化できるか相談したい方には、講師に教わる講座も選択肢です。

勉強方法の選び方は、マクロ・VBAの勉強方法でも紹介しています。