【VBA入門】第3回:条件分岐とループ処理の完全ガイド|「判断」と「繰り返し」で仕事を自動化しよう
はじめに:なぜこの2つが重要なのか?
前回の第2回では、セルに文字を入れたり、シートを操作したりする方法を学びました。しかし、それだけでは「手作業の代わり」にはなっても、「自動化」とは言えません。
真の自動化を実現するために必要なのが、今回学ぶ**「条件分岐(判断)」と「ループ処理(繰り返し)」**です。
- 条件分岐(If):「もし赤字なら文字を赤くする」「もし値が空白なら処理を飛ばす」という人間の判断を代行する機能。
- ループ処理(For):「1行目から1000行目まで同じことをやる」という単純作業を代行する機能。
この2つを組み合わせれば、「1000件のデータを見て(ループ)、条件に合うものだけを転記する(条件分岐)」という、実務で最もよく使う処理が作れるようになります。焦らずじっくり学んでいきましょう。
1. 条件分岐(If文):プログラムに「判断力」を与える
条件分岐とは、**「もし~なら、〇〇する。そうでなければ、××する」**という命令のことです。VBAではIf(イフ)文を使います。
基本の書き方
まずは最もシンプルな形です。「もし(If)、A1セルの値が100以上なら(Then)、メッセージを出す」というコードを見てみましょう。
VBA
Sub CheckScore()
' A1セルの値が100以上かどうかチェック
If Range("A1").Value >= 100 Then
MsgBox "目標達成です!"
End If
End Sub
ポイント:
If 条件 Thenで始まり、End Ifで終わります。このセットは必須です。- その間に書かれたコードは、条件が合ったときだけ実行されます。
「そうでなければ」を追加する(Else)
条件に合わなかった場合の処理も追加したいときは、Else(エルス)を使います。
VBA
Sub CheckPassOrFail()
Dim score As Long
score = Range("A1").Value
If score >= 80 Then
' 条件に合うとき(True)
Range("B1").Value = "合格"
Range("B1").Interior.Color = vbBlue ' 背景を青に
Else
' 条件に合わないとき(False)
Range("B1").Value = "不合格"
Range("B1").Interior.Color = vbRed ' 背景を赤に
End If
End Sub
3つ以上の分岐(ElseIf)
「80点以上はA、60点以上はB、それ以外はC」のように段階的に分けたい場合は、ElseIfを使います。
VBA
Sub CheckGrade()
Dim score As Long
score = Range("A1").Value
If score >= 80 Then
Range("B1").Value = "評価A"
ElseIf score >= 60 Then
Range("B1").Value = "評価B"
Else
Range("B1").Value = "評価C"
End If
End Sub
- 注意:条件は上から順に判定されます。最初に合致したところで処理が実行され、以降のElseIfは無視されます。
覚えておきたい「比較演算子」
条件を指定するときに使う記号です。特に「等しくない」や「以上・以下」の書き方に注意しましょう。
| 記号 | 意味 | 例 |
= | 等しい | If A = B Then |
<> | 等しくない | If A <> "" Then (Aが空白でなければ) |
> | より大きい | If A > 100 Then (100は含まない) |
>= | 以上 | If A >= 100 Then (100を含む) |
< | より小さい | If A < 100 Then |
<= | 以下 | If A <= 100 Then |
Google スプレッドシートにエクスポート
もう一つの分岐:Select Case文
条件分岐の条件が「特定の変数の値」である場合(例:「部署名」が営業か、人事か、開発か…など)、If文で書くと長くなってしまいます。そんなときはSelect Case文が便利です。
VBA
Sub CheckDepartment()
Dim dept As String
dept = Range("A2").Value
Select Case dept
Case "営業部"
MsgBox "別館へ行ってください"
Case "人事部"
MsgBox "本館3階です"
Case "総務部", "経理部" ' カンマで区切って複数指定もOK
MsgBox "本館2階です"
Case Else
MsgBox "受付で聞いてください"
End Select
End Sub
2. ループ処理(For文):プログラムに「忍耐力」を与える
ループ処理を使えば、Excelの行を上から下まで順番に処理するような作業を一瞬で終わらせることができます。
最も基本:For...Next文
**「回数が決まっている繰り返し」**に使います。 特に重要なのが、変数i(カウンター変数)の使い方です。
VBA
Sub SimpleLoop()
Dim i As Long
' i が 1 から 10 になるまで繰り返す
For i = 1 To 10
' Cells(行, 列) の「行」の部分に i を使うのがコツ!
Cells(i, 1).Value = i & "回目の処理"
Next i
End Sub
このコードの動きを実況解説
- 開始:
iに1が入ります。 Cells(1, 1)(つまりA1セル)に「1回目の処理」と書き込みます。Next iに到達すると、iが1増えて2になり、上に戻ります。Cells(2, 1)(A2セル)に「2回目の処理」と書き込みます。- これを繰り返し、
iが10の処理が終わったらループを抜けます。
これが「行ごとの処理」の正体です。 i という変数が1つずつ増える性質を利用して、処理する行をずらしているのです。
データがある最後まで繰り返すテクニック
実務では「10回」と決まっていることより、「データが入っている最終行まで」処理したいことのほうが多いでしょう。 その場合、第2回で学んだ「最終行の取得」と組み合わせます。
VBA
Sub LoopUntilLastRow()
Dim i As Long
Dim lastRow As Long
' A列のデータがある最終行を調べる
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 2行目から最終行までループ(1行目は見出しと仮定)
For i = 2 To lastRow
' A列の値 × B列の値 を計算して C列に入れる
Cells(i, 3).Value = Cells(i, 1).Value * Cells(i, 2).Value
Next i
End Sub
コレクションのループ:For Each文
「ブック内の全シート」や「指定した範囲の全セル」など、**「ひとかたまりのグループ(コレクション)」**の中身を順番に取り出すループです。回数を気にする必要がないので便利です。
VBA
Sub LoopAllSheets()
Dim ws As Worksheet
' ブックにある「全てのシート」を1枚ずつ ws という変数に入れて繰り返す
For Each ws In Worksheets
' シート名を表示(イミディエイトウィンドウに出力)
Debug.Print "シート名:" & ws.Name
' 全シートのA1セルに今日の日付を入れる
ws.Range("A1").Value = Date
Next ws
End Sub
3. 実践演習:条件分岐とループの組み合わせ
ここまでの知識を総動員して、実務で使えるマクロを作ってみましょう。
課題:未提出者をあぶり出す
シナリオ: B列に「氏名」、C列に「提出状況」が入力された名簿があります。 C列が「未提出」の人を見つけたら、D列に「督促」と書き込み、さらにその行を黄色に塗りつぶします。
ステップ1:日本語でロジックを考える
いきなりコードを書かず、手順を整理しましょう。
- データの最終行を調べる。
- 2行目から最終行まで、1行ずつ以下のチェックをする。
- もし C列の値が「未提出」なら、
- D列に「督促」と書く。
- その行の背景色を黄色にする。
- 次の行へ進む。
ステップ2:コードにする
VBA
Sub HighlightUnsubmitted()
Dim i As Long
Dim lastRow As Long
' 1. 最終行を取得
lastRow = Cells(Rows.Count, 2).End(xlUp).Row ' B列(2列目)基準で最終行取得
' 2. ループ開始
For i = 2 To lastRow
' 3. 条件分岐:C列(3列目)が "未提出" か?
If Cells(i, 3).Value = "未提出" Then
' D列(4列目)に文字を入れる
Cells(i, 4).Value = "督促"
' A列からD列まで色を塗る
Range(Cells(i, 1), Cells(i, 4)).Interior.Color = RGB(255, 255, 153) ' 薄い黄色
Else
' 提出済みの場合はD列をクリアしておく(再実行時用)
Cells(i, 4).ClearContents
Range(Cells(i, 1), Cells(i, 4)).Interior.ColorIndex = xlNone
End If
Next i
MsgBox "チェック完了しました!"
End Sub
このコードをコピーして実行してみてください。一瞬で「判断」と「処理」が終わる快感を味わえるはずです。
4. 初心者がハマりやすいポイント(エラー回避)
1. 「End If」や「Next」を忘れる
If文を書き始めたらすぐにEnd Ifを、For文を書いたらすぐにNextを書いて、枠を作ってから中身を書く癖をつけるとエラーが減ります。
2. インデント(字下げ)をしない
上記のコード例を見てください。Ifの中身やForの中身は、Tabキーで少し右にずらしています(インデント)。 これをしないと、どこからどこまでがループなのか分からなくなります。インデントはマナーであり、バグを防ぐ命綱です。
3. 無限ループ
Do...Loop文(条件を満たすまで繰り返す)を使う場合、終了条件が永遠に来ないコードを書くとExcelが固まります。 初心者のうちは、回数が明確なFor...Next文を使うことをおすすめします。もし固まったらキーボードの Esc キーまたは Ctrl + Break キーを連打して停止させてください。
まとめと次回予告
今回は、VBAの「脳」にあたる条件分岐と、「筋肉」にあたるループ処理を学びました。
- If文:状況によって処理を分ける。
- For文:行番号を変数
iにして、上から順に処理する。 - 組み合わせ:全データを走査して、条件に合うものだけ処理する。
これができれば、Excel業務の自動化における「基礎」は卒業です!
次回(第4回)の予告
次回は、さらに一歩進んだテクニックとして、**「ユーザーフォーム(入力画面)」**の作成に挑戦します。 「ボタンを押すと専用の入力画面が出てきて、データを入力しやすくする」という、本格的なアプリのような機能を作ってみましょう。
- ユーザーフォームの作り方
- テキストボックスやボタンの配置
- 入力されたデータをシートに転記する
次回もお楽しみに!
関連記事
