マクロ・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).Row | A列で最後にデータがある行 |
| .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 | 日付・時刻 |
| Boolean | True / 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 ' 見出しの下から最後の行まで表全体・ずらす・広げる
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 Range("B2").Value >= 80 Then
Range("C2").Value = "合格"
ElseIf Range("B2").Value >= 60 Then
Range("C2").Value = "再確認"
Else
Range("C2").Value = "不合格"
End IfIf 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 If1つの値で何通りにも分けるときは、「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ずつ増やしながらくり返します。
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」です。
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で中断できます。
Dim r As Long
r = 2
Do While Cells(r, 1).Value <> "" ' A列が空欄になるまで
Cells(r, 5).Value = "確認済み"
r = r + 1
LoopFor i = 2 To 100
If Cells(i, 1).Value = "合計" Then Exit For ' 途中で抜ける
Next i関数の書き方と使い方
VBAで「関数」というと、次の3つがあります。
自分で関数を作る(Function)
「Function」で作ると、計算した値を返す関数になります。関数名に値を入れると、それが結果になります。標準モジュールに書いておけば、セルに「=税込金額(A2)」と入力して、ワークシート関数と同じように使うこともできます。
Function 税込金額(price As Double) As Double
税込金額 = price * 1.1 ' 関数名に入れた値が結果になる
End Function
Sub 関数を使う()
Range("B2").Value = 税込金額(Range("A2").Value)
End Subワークシート関数をVBAで使う
SUM や COUNTIF など、セルで使う関数は「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にも用意されています。
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 "終わりました"
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 SubSub エラーに備える()
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の勉強方法でも紹介しています。
