この記事のポイント
- VBAでよく使うコード(セル操作・条件分岐・ループ・シート操作)を実例付きで解説します
- MsgBoxやInputBoxなどユーザーとやり取りするコードの書き方も網羅しています
- コードが動かないときのデバッグ手順と、よくあるエラーの原因もまとめました
VBAを書き始めたばかりのころ、「セルに値を入れるコードはどう書くんだっけ?」「ループはForとDoのどちらを使えばいい?」と迷う場面は多いものです。調べるたびに別のページを開き、結局どのコードが正しいのかわからなくなる——そんな経験をお持ちの方も少なくないでしょう。
この記事では、MicrosoftのExcel VBA公式リファレンスと実務向けコード解説サイトを参考にしながら、VBAでよく使うコードを用途別に整理しました。コード例は、標準モジュールに貼り付けて試せる形で載せています。Sub 〜 End Sub の行が無い短い例は、Sub 〜 End Sub の間に貼ってから、手元のExcelで動かしてみてください。
VBAとマクロとは何か?まず定義を整理する
「VBA」と「マクロ」は同じ意味で使われることがありますが、厳密には別の概念です。コードを書き始める前に、この2つの関係を整理しておきましょう。

VBAとマクロの違い
エクセルの神髄「VBA入門」では、マクロとVBAの違いを次のように整理しています。マクロとはExcelで行う一連の操作を自動化する「仕組み」のことで、VBAはその仕組みを記述するための「プログラミング言語」です。
「マクロの記録」機能を使うと、マウスやキーボードの操作を録画して再実行できます。ただし、記録できるのは定型的な手順だけです。条件によって処理を変えたり、繰り返し回数をデータに応じて変えたりするには、VBAのコードを直接書く必要があります。
| 比較項目 | マクロ(記録) | VBA(コード記述) |
|---|---|---|
| 作成方法 | 操作を記録するだけ | VBEでコードを書く |
| プログラミング知識 | 不要 | 必要 |
| 対応できる処理 | 定型的な繰り返し操作 | 条件分岐・ループ・ファイル操作など |
| 柔軟性 | 低い | 高い |
「マクロの記録」で作ったコードをVBEで開いてみると、VBAの書き方が自然に見えてきます。最初の一歩として、記録→コードを覗く、という流れはとても有効です。
VBAを使うと何ができるのか
MicrosoftのOffice VBA基礎知識ページによると、VBAを使うと「マウス・キーボード・ダイアログボックスで実行できるほとんどすべての操作」をコードで自動化できます。
具体的には、次のような処理が代表的です。
- セルへの値の入力・読み取り・書式設定
- 条件に応じた処理の切り替え(条件分岐)
- 大量のデータを1行ずつ処理する繰り返し
- シートやブックの追加・削除・保存
- ユーザーへのメッセージ表示や入力の受け取り
同じ変更を数十回・数百回繰り返す作業ほど、VBAによる自動化の効果が顕著に出ます。手作業でやっていた集計・転記・レポート出力などを自動化すると、作業時間を大幅に短縮できます。

VBAでよく使うコード:セル操作の基本
VBAを書く場面のほとんどで、セルの読み書きが登場します。まずセル操作の基本パターンを押さえておきましょう。
セルに値を入力する・読み取る
セルを指定する方法は主に2種類あります。Range("A1")はセルのアドレスで指定し、Cells(行, 列)は行番号と列番号の数値で指定します。
値を書き込むときは .Value プロパティを使います。
' セルA1に値を入力する
Range("A1").Value = "おはようございます"
' 2行3列目(C2セル)に数値を入力する
Cells(2, 3).Value = 100
' セルA1の値を変数に読み取る
Dim myValue As String
myValue = Range("A1").Value
Rangeはアドレスが固定のときに読みやすく、Cellsはループの中で行番号を変数にしたいときに便利です。用途に応じて使い分けてください。
最終行を動的に取得したい場合は、次のコードがよく使われます。
' A列でデータが入っている最終行を取得する
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Rows.Countはシートの最終行番号(Excelでは1048576)を返します。そこから上方向(xlUp)に向かってデータを探し、最初に値があるセルの行番号を取得する仕組みです。データ件数が変わるリストを扱うときに欠かせない書き方です。
セルの範囲を選択・コピー・貼り付けする
範囲をコピーして別の場所に貼り付けるコードは、日常業務でよく登場します。
' A1:C10の範囲をコピーしてE1に貼り付ける
Range("A1:C10").Copy Destination:=Range("E1")
' 値のみ貼り付ける(書式を引き継がない)
Range("A1:C10").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
値のみ貼り付けたい場合は PasteSpecial を使います。コピー後に Application.CutCopyMode = False を入れると、コピーモードが解除されてセルの点線が消えます。
セルの値を別セルに直接代入する方法もあります。こちらのほうが処理が速く、クリップボードを使わないためすっきりします。
' A1の値をB1に直接コピー(値のみ)
Range("B1").Value = Range("A1").Value

条件分岐とループはどう書けばよいか?
VBAで処理を自動化するうえで、条件分岐とループは欠かせません。それぞれの書き方と使い分けを確認しましょう。

If〜Then〜Elseで条件分岐する
条件によって処理を変えるには If〜Then〜Else を使います。書き方はシンプルで、英語の文章に近い構造です。
Dim score As Long
score = Range("A1").Value
If score >= 80 Then
Range("B1").Value = "合格"
ElseIf score >= 60 Then
Range("B1").Value = "再試験"
Else
Range("B1").Value = "不合格"
End If
条件が3つ以上になる場合は ElseIf を追加します。条件の数が多いときは Select Case を使うと読みやすくなります。
Select Case Range("A1").Value
Case "東京"
Range("B1").Value = "関東"
Case "大阪", "京都"
Range("B1").Value = "近畿"
Case Else
Range("B1").Value = "その他"
End Select
Case にはカンマ区切りで複数の値を並べられます。分岐の数が多い処理では、If〜ElseIf より Select Case のほうが構造を把握しやすくなります。
For〜NextとDo〜Loopで繰り返し処理する
繰り返し処理には主に2種類の書き方があります。回数が決まっているなら For〜Next、条件が満たされるまで回すなら Do〜Loop を選ぶのが基本です。
' 1行目から10行目まで処理する(For〜Next)
Dim i As Long
For i = 1 To 10
Cells(i, 2).Value = Cells(i, 1).Value * 2
Next i
' 逆順に処理したい場合(Step -1)
For i = 10 To 1 Step -1
' 処理
Next i
行を削除しながらループする場合は、下から上に向かって処理するのが定石です。上から削除すると行番号がずれてしまいます。
' A列が空白の行を下から順に削除する
Sub DeleteBlankRows()
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 1 Step -1
If Cells(i, 1).Value = "" Then
Rows(i).Delete
End If
Next i
End Sub
Do〜Loop は終了条件を柔軟に設定できます。
' A列のデータが空になるまで処理する
Dim row As Long
row = 1
Do While Cells(row, 1).Value <> ""
' 処理
row = row + 1
Loop
Do While は条件が真のあいだ繰り返し、Do Until は条件が真になるまで繰り返します。無限ループに注意しながら使いましょう。

MsgBoxとInputBoxを使ったユーザー対話
処理の完了を知らせたり、ユーザーに値を入力してもらったりするには、MsgBox と InputBox が便利です。
MsgBoxで確認メッセージを表示する
MsgBox はポップアップでメッセージを表示する関数です。処理が完了したことを伝えたり、「本当に削除しますか?」のような確認を取ったりする場面で使われます。
' シンプルなメッセージ表示
MsgBox "処理が完了しました。"
' はい・いいえの選択肢を出して結果を受け取る
Dim answer As Integer
answer = MsgBox("データを削除しますか?", vbYesNo + vbQuestion, "確認")
If answer = vbYes Then
' 削除処理
End If
第2引数にボタンの種類とアイコンを指定できます。よく使う定数は次のとおりです。
vbOKOnly:OKボタンのみ(省略時のデフォルト)vbYesNo:はい・いいえvbYesNoCancel:はい・いいえ・キャンセルvbQuestion:疑問符アイコンvbExclamation:警告アイコン
戻り値は vbYes(6)や vbNo(7)などの定数で判定します。数値よりも定数名を使うほうが、コードの意図が伝わりやすくなります。
InputBoxで値を入力させる
InputBox はユーザーにテキストを入力させるダイアログを表示します。処理対象のシート名や検索キーワードを動的に受け取りたいときに使えます。
' 名前を入力させてセルに書き込む
Dim userName As String
userName = InputBox("名前を入力してください。", "名前の入力")
If userName <> "" Then
Range("A1").Value = userName
End If
キャンセルボタンが押されると空文字("")が返ります。そのまま処理を続けると意図しない動作になるため、空文字チェックを入れるのが定石です。
数値を受け取りたい場合は、CLng や CInt で型変換します。ただし数値以外が入力されるとエラーになるため、IsNumeric 関数で検証してから変換するのが安全です。
Sub InputNumber()
Dim inputText As String ' Input は VBA の予約語なので変数名に使えない
Dim num As Long
inputText = InputBox("処理する行数を入力してください。")
If IsNumeric(inputText) Then
num = CLng(inputText)
Else
MsgBox "数値を入力してください。"
End If
End Sub

シート・ブック操作でよく使うコードの書き方
複数のシートやブックを扱う処理は、業務自動化でよく登場します。シートとブックの基本操作を確認しましょう。

シートを指定・追加・削除する
シートを指定するには、シート名かインデックス番号を使います。名前での指定のほうがコードの意図が伝わりやすく、保守しやすくなります。
' シート名で指定してセルに値を入れる
Worksheets("集計").Range("A1").Value = "完了"
' インデックス番号で指定(1が左から1番目のワークシート)
Worksheets(1).Activate
' 新しいシートを末尾に追加する
Worksheets.Add After:=Worksheets(Worksheets.Count)
' 追加したシートに名前をつける
ActiveSheet.Name = "2026年10月"
シートを削除するときは確認ダイアログが表示されます。マクロ内で自動的に削除したい場合は、次のように警告を一時的に無効にします。
' 確認ダイアログを出さずにシートを削除する
Application.DisplayAlerts = False
Worksheets("削除対象").Delete
Application.DisplayAlerts = True
DisplayAlerts = False にした後は、必ず True に戻してください。戻し忘れると、その後の処理でも警告が表示されなくなります。
エクセルの神髄のVBAサンプル集では、シートの追加・削除をオブジェクト変数と組み合わせて使う方法も紹介されています。シートを変数に格納しておくと、長いコードで何度もシート名を書かずに済みます。
' シートをオブジェクト変数に格納する
Dim ws As Worksheet
Set ws = Worksheets("集計")
ws.Range("A1").Value = "完了"
ws.Range("B1").Value = 100
ファイルを開く・保存・閉じる
別のブックを開いて処理し、保存して閉じる流れは、複数ファイルを一括処理するマクロの基本パターンです。
Sub OpenAndClose()
' ブックを開く(ファイルの場所は自分の環境に合わせて書き換える)
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Users\user\Documents\data.xlsx")
' 処理...
' 上書き保存して閉じる
wb.Close SaveChanges:=True
' 保存せずに閉じる場合
' wb.Close SaveChanges:=False
End Sub
ファイルが存在しない場合に Workbooks.Open を実行するとエラーになります。Dir 関数でファイルの存在を確認してから開くのが安全です。
Sub OpenIfExists()
Dim filePath As String
filePath = "C:\Users\user\Documents\data.xlsx"
If Dir(filePath) <> "" Then
Workbooks.Open filePath
Else
MsgBox "ファイルが見つかりません。"
End If
End Sub
マクロを書いているブック自身を参照するには ThisWorkbook を使います。ActiveWorkbook は現在アクティブなブックを指すため、別のブックを開いた後は意図しないブックを参照することがあります。自分のブックを確実に指定したいときは ThisWorkbook を使うのが確実です。

コードが動かないときはどこを確認すればよいか?
VBAを書いていると、必ずエラーに出会います。エラーのパターンと対処法を知っておくと、解決までの時間が大幅に短くなります。
よくあるエラーと原因のパターン
初心者がよく遭遇するエラーには、いくつか典型的なパターンがあります。エラーメッセージと原因を対応させて覚えておきましょう。
| エラーメッセージ | 主な原因 | 対処法 |
|---|---|---|
| 実行時エラー ‘9’ インデックスが有効範囲にありません |
存在しないシート名・配列の範囲外 | シート名のスペル・全角半角・前後の空白を確認 |
| 実行時エラー ‘1004’ アプリケーション定義またはオブジェクト定義のエラー |
存在しないセル範囲の指定・保護されたシートへの書き込み | 範囲の指定とシートの保護設定を確認 |
| 実行時エラー ’13’ 型が一致しません |
文字列を数値型の変数に入れようとした | IsNumeric で検証してから代入 |
| コンパイルエラー 変数が定義されていません |
Option Explicit が有効なのに Dim を書き忘れた |
変数を Dim で宣言する |
注意:よくある落とし穴
- シート名に全角スペースが混入していてエラーになるケースがあります
- ブックを保存せずに閉じると、書いたコードが消えることがあります(
.xlsm形式で保存を忘れずに) Application.DisplayAlerts = Falseにしても、マクロが終わると通常は自動でTrueに戻ります。ただし同じマクロの中では、Trueに戻すまで警告が出ません(Microsoft Learn「DisplayAlerts プロパティ」)
デバッグの基本操作(ステップ実行・イミディエイトウィンドウ)
デバッグでまず覚えたいのは「ステップ実行」と「イミディエイトウィンドウ」です。Microsoft Learn の説明では、ステップ実行は[デバッグ]メニュー、イミディエイトウィンドウは[表示]メニューにあります。この2つを使いこなすと、コードのどこで問題が起きているかを素早く特定できます。
ステップ実行は、コードを1行ずつ実行する機能です。VBEで F8 キーを押すたびに1行進みます。実行中に変数の上にマウスを重ねると、その時点の値がポップアップで表示されます。
イミディエイトウィンドウは、VBEで Ctrl + G を押すと表示されます。コード内に Debug.Print 変数名 を書いておくと、その時点の変数の値がウィンドウに出力されます。
Sub CheckValues()
' ループ内で変数の値を確認する
Dim i As Long
For i = 1 To 10
Debug.Print "i = " & i & ", 値 = " & Cells(i, 1).Value
Next i
End Sub
また、コードの途中にブレークポイントを設定すると、その行で実行が一時停止します。VBEのコードの左側にある灰色の帯(余白インジケーター バー)をクリックすると赤い点が表示され、そこがブレークポイントになります。止めたい行にカーソルを置いて F9 キーを押しても設定できます。停止した状態でステップ実行に切り替えると、問題箇所を絞り込みやすくなります。
よくある質問
Q. RangeとCellsはどちらを使えばよいですか?
A. アドレスが固定のセルを指定するときは Range("A1") が読みやすく、ループの中で行番号や列番号を変数にしたいときは Cells(i, j) が適しています。どちらも同じセルを指定できるので、状況に応じて使い分けてください。
たとえば「常にA1セルに書き込む」なら Range("A1")、「1行目から最終行まで順に処理する」なら Cells(i, 1) のほうが自然なコードになります。
Q. Option Explicitは必ず書かないといけませんか?
A. 必須ではありませんが、書くことを強くお勧めします。Option Explicit をモジュールの先頭に書くと、Dim で宣言していない変数があるとエラーが出ます。変数名のタイプミスを自動で検出できるため、原因不明のバグを防ぐ効果があります。
VBEの「ツール」→「オプション」→「変数の宣言を強制する」にチェックを入れると、新しいモジュールに自動で追加されます。
Q. ファイルを保存するときに確認ダイアログを出したくない場合はどうすればよいですか?
A. Application.DisplayAlerts = False を処理の前に設定し、処理が終わったら True に戻します。ただし、この設定は確認ダイアログだけでなく警告全般に影響します。処理が終わったら必ず True に戻す習慣をつけてください。
エラーで処理が中断した場合でも戻せるよう、On Error GoTo を使ったエラーハンドリングと組み合わせるとより安全です。
Q. VBAのコードはどこに書けばよいですか?
A. 通常のマクロは「標準モジュール」に書きます。VBEを開いて(Alt + F11)、「挿入」→「標準モジュール」で追加してください。シートのイベント(セルが変更されたときに自動実行するなど)はシートモジュールに、ブック全体のイベント(ブックを開いたときに実行するなど)は「ThisWorkbook」モジュールに書きます。
最初は標準モジュールだけ使えれば十分です。
Q. VBAのコードを書いたのに保存したら消えてしまいました。なぜですか?
A. ファイルを通常の .xlsx 形式で保存するとVBAのコードが削除されます。VBAを含むブックは「Excelマクロ有効ブック(.xlsm)」形式で保存してください。「名前を付けて保存」→ファイルの種類から「Excel マクロ有効ブック」を選択します。既存の .xlsx ファイルにVBAを追加した場合も、保存時にこの形式に変更する必要があります。
※本記事の情報は2026年10月時点のものです。最新情報は各公式サイトでご確認ください。
最終更新: 2026年10月24日
まとめ
VBAでよく使うコードを用途別に整理しました。セル操作・条件分岐・ループ・ユーザー対話・シートとブックの操作、そしてデバッグの手順——まずはこの6つから手元の作業で試してみてください。
まず試してほしいのは、自分が毎日繰り返している手作業を1つ選んで、マクロの記録で録画してみることです。生成されたVBAコードをVBEで開くと、この記事で紹介したコードの多くがそこに現れます。「見たことがある」コードが増えるほど、読み解く力と書く力が同時に育ちます。
集中してコードを書く時間を確保したい方には、静かな環境を選ぶのも一つの手です。管理人が運営するアイデスク新宿自習室は、新宿西口駅から徒歩3分・24時間365日利用可能で、半個室ブース18席・私語厳禁のルールがあります。深夜や早朝にまとまった時間を取りたい方の選択肢のひとつです。
参考サイト
- Microsoft Learn — Excel Visual Basic for Applications (VBA) リファレンス
- Microsoft Learn — Office VBA の基礎知識
- Microsoft Learn — Application.DisplayAlerts プロパティ (Excel)
- Microsoft Learn — [デバッグ] メニュー
- Microsoft Learn — [表示] メニュー
- エクセルの神髄 — VBA入門:Excelマクロを基礎から学習
- エクセルの神髄 — VBAサンプル集:そのまま使える実用マクロ集
- キーボードジム — Excel VBAの始め方とよく使うコード一覧
集中できる学習環境を探している方は、新宿の自習室もご覧ください。24時間利用可・半個室ブース中心の自習室です。
→ アイデスク新宿自習室の詳細

