ゼロスタートで1BTC達成  (`・ω・´)σ  普通の会社員がコツコツ資産運用で生活向上するBlog

【Excel VBA】繰り返し処理に複数条件や回数指定を組み合わせる方法&処理の抜け方

  • 2022-03-26
  • 2024-09-15
  • Excel

繰り返し処理は条件分岐と合わせて必ず押さえておきたいポイントです。

手作業を自動処理するのがマクロなので、繰り返し行う作業が自動化できる今回の内容は、業務効率化に大きなメリットをもたらします。

(*’ω’*)σ ここをマスターすれば、無敵に1歩近づきます。

”For Next” 指定した範囲に処理を繰り返す

範囲を指定して同じ処理を繰り返す、基本的な書き方から説明します。例えば「表の1行目から最終行まで」や「シート1からシート5まで」のように、範囲を「変数」として指定したうえで処理の内容を支持します。

For…Nextステートメント

変数が初期値から最終値になるまで同じ処理を繰り返す

Dim 変数 Asデータ型
For 変数 = 初期値 To 最終値
 繰り返し処理の内容
Next(変数)

For…Nextステートメントのイメージを落とし込む図解

まず変数を宣言します。変数の初期値最終値を指定して、繰り返す回数を管理します。次に繰り返し処理の内容を書きます。最後のNextで変数の値が1ずつ増えます。(Nextの後の変数は省略しても大丈夫です)

サンプルプロシージャ

Sub 繰り返し処理()
Dim 変数 As Integer
For 変数 = 1 To 5
Worksheets.Add Before:=Worksheets(変数)
ActiveSheet.Name = “集計” & 変数
Next
End Sub

繰り返し処理
Integer型の変数を宣言
変数が5になるまで繰り返し処理をする
左から1番目のワークシートの前にシート追加
追加したシート名を「集計1」にする
変数の値を1増やす

モカ

今回は分かりやすく「変数」と書いてあるけど、実際には習慣的に小文字の「i」とか「j」を使う事が多いんだよ。

クラゲ

1ずつ増える整数だから、データ型は「integer」か「Long」がいいね。

繰り返し処理が各作業で何を処理しているかの詳細

変数の加算値を変更する時は ”Step”

Step 加算値

変数の範囲の後に「Step 加算値」を付加

Dim 変数 Asデータ型
For 変数 = 初期値 To 最終値 Step 加算値
 繰り返し処理の内容
Next(変数)

変数は通常1ずつ加算されるが、加算値を付け加えることで柔軟な処理が可能になります。例えば「Step 2」と付け加えれば2ずつ加算されるので、1つおきに処理が実行されます。例として表を1行おきに塗りつぶす作業で説明していきます。
表がシマシマになりますよ~(*’ω’*)

サンプルプロシージャ

Sub ひとつおきに処理()
Dim 変数 As Integer
 For 変数 = 4 To 13 Step 2
  Range(Cells(変数, 1), Cells(変数, 5)).Interior.ColorIndex = 22
 Next
End Sub

ひとつおきに処理
Integer型の変数を宣言
変数が4から13になるまで1つおきに繰り返し処理をする
セル(4,1)からセル(4,5)の色を22にする
変数を2増やす
セル(6,1)からセル(6,5)の色を22にする
変数を2増やす・・・
これを変数が13になるまで繰り返す

VBA繰り返し処理で1つおきに処理する場合の参考画像1

・・・てな感じでマクロ実行後は表が1行おきに塗りつぶされてシマシマになりました。ちなみにColorIndex22はコーラルピンクです。

これを応用すれば5行ごとに太い罫線を引きたいとか、10行ごとに色を変えたいとか、様々なことができますね。

VBA繰り返し処理で1つおきに処理する場合の参考画像2

繰り返し処理を抜ける時は ”Exit For”

Exit For

処理内容の前に条件を付加して、一致する場合は繰り返し処理から抜ける

Dim 変数 Asデータ型
For 変数 = 初期値 To 最終値 Step 2
 条件満たすなら Exit For
 繰り返し処理の内容
Next(変数)

指定した変数の範囲内でも、繰り返し処理を途中で抜けることが可能です。たとえば処理内容の前に条件を付加して、条件を満たす時は繰り返し処理を途中で抜けるという書き方ができます。変数の範囲は20行目までなのに、表は13行目までしかない場合で説明していきます。

VBA繰り返し処理で、条件により既定の処理から抜ける場合の参考画像1

途中で繰り返し処理を抜けるという記述が無いと左図のようになります。まぬけです。
表が途切れたら、繰り返し処理もストップしたい・・・どのように書けば良いでしょうか?

°˖✧◝(⁰▿⁰)◜✧˖°
「空白セルなら繰り返し処理から抜ける」で書いてみましょう。

サンプルプロシージャ

Sub ひとつおきに処理して場合によっては離脱()
 Dim 変数 As Integer
 For 変数 = 4 To 20 Step 2
  If Cells(変数, 1).Value = “” Then Exit For
  Range(Cells(変数, 1), Cells(変数, 5)).Interior.ColorIndex = 22
 Next
End Sub

4行目の部分が「空白セルなら繰り返し処理を抜ける」という記述です。これでマクロを実行すると14行目の時点で「空欄だ!STOP!」とExcelが判断してくれるわけです。

モカ

一目で見えない大きな表の時に役立ちそうだね

”Do Until” 条件を満たすまで処理を繰り返す

Do Until…Loopステートメント

繰り返し処理に条件判定

Do Until 条件式
 繰り返す処理内容
Loop

サンプルプロシージャ

Sub 条件判定しながら処理1()
 Dim 変数 As Integer
 変数 = 4
 Do Until Cells(変数, 1).Value = “”
  Cells(変数, 1).Resize(, 5).Interior.ColorIndex = 22
  変数 = 変数 + 2
 Loop
End Sub

変数が2ずつカウントアップされていって空白セルにあたるまで処理を繰り返すという内容です。先程はExit Forを使って「空白セルなら繰り返し処理を抜ける」という書き方をしましたが、結果として同じ処理でも様々な書き方がある事がわかりますね。

VBA繰り返し処理で、条件を判定しながら処理を繰り返す際の参考画像

Do …Loop Untilステートメント

繰り返し処理に条件判定

Do
 繰り返す処理内容
Loop Until 条件式

VBA繰り返し処理で、条件を満たすまで処理を繰り返す際のイメージ図解

サンプルプロシージャ

Sub 条件判定しながら処理2()
 Dim 変数 As Integer
 変数 = 4
 Do
  Cells(変数, 1).Resize(, 5).Interior.ColorIndex = 22
  変数 = 変数 + 2
 Loop Until Cells(変数, 1).Value = “”
End Sub

条件判定を先にするか後にするかで書き方と順番が少し変わります。

モカ

結果に違いは出るの???

クラゲ

最初から条件を満たす場合、先に条件判定の場合は一度も処理が実行されないよ。それに対して、後から条件判定の場合は最低1回は処理が実行されるんだよ。

Do UntilとDo Whileの違い

まだ途中ですが先に言っておきます。この2つは似ていて、言葉で説明されても少々混乱する部分です。つまづくと沼確定なので図解しておきます。(・∀・)じゃーん!

VBA繰り返し処理で、Do UntilとDo Whileの違いが分かるイメージ図解

図にすると一目瞭然、両者は状況的に真逆であることが分かります。日本語って難しいですね。

”Do While” 条件を満たしている間は処理を繰り返す

Do While…Loopステートメント

繰り返し処理に条件判定

Do While 条件式
 繰り返す処理内容
Loop

サンプルプロシージャ

Sub 条件判定しながら処理3()
 Dim 変数 As Integer
 変数 = 4
 Do While Cells(変数, 1).Value <> “”
  Cells(変数, 1).Resize(, 5).Interior.ColorIndex = 22
  変数 = 変数 + 2
 Loop
End Sub

ポイントは4行目です。Do Untilでは比較演算子の「=」を使って「対象セル=空白セルになるまで繰り返し処理をする」という書き方をしていた部分です。今回はDo Whileなので「<>」を使って「対象セルと空白セルが<>(等しくない)の間は繰り返し処理をする」という書き方になっています。

Do…Loop Whileステートメント

繰り返し処理に条件判定

Do
 繰り返す処理内容
Loop While 条件式

サンプルプロシージャ

Sub 条件判定しながら処理4()
 Dim 変数 As Integer
 変数 = 4
 Do
  Cells(変数, 1).Resize(, 5).Interior.ColorIndex = 22
  変数 = 変数 + 2
 Loop While Cells(変数, 1).Value <> “”
End Sub

こちらはDo Whileの条件判定を後からするパターンです。最初から条件を満たす(または満たさない)場合を除いては、条件判定しながら処理1~4のプロシージャは同じ結果になります。

繰り返し処理を抜ける時は ”Exit Do”

Exit Do

For Nextステートメントの時は「Exit For」を使って、繰り返し処理を途中で抜けることができました。同様に、Do Until や Do While の時は「Exit Do」を使って、繰り返し処理を途中で抜けることができます。

”For Each” コレクションに対して処理を繰り返す

回数や条件を指定して繰り返し処理する方法について説明してきましたが、今回はコレクションに対して繰り返し処理を行っていきます。簡単に言うと、シートやブック、指定したセルなどに対して繰り返し処理を行います。

For Each…Nextステートメント

コレクションに対して繰り返し処理

Dim オブジェクト型変数 As オブジェクトの種類
For Each オブジェクト型変数 In コレクション
 繰り返す処理内容
Next

サンプルプロシージャ1

Sub 全シート数量クリア()
 Dim 各シート As Worksheet
 For Each 各シート In Worksheets
  各シート.Range(“D4:D13”).ClearContents
 Next
End Sub

全シートの数量クリア
各シートはワークシートとする
全シートの各シートに繰り返し処理
セルD4からD13の値をクリア
次のシート

コレクションがシートの場合です。豊洲店のシートからオンライン店のシートまで、数量がクリアされたら繰り返し処理は終了します。

サンプルプロシージャ2

Sub 売上達成()
 Dim 売上金額 As Range
 For Each 売上金額 In Range(“E4:E13”)
  If 売上金額.Value > 20000 Then
   売上金額.Resize(1, 1).Font.ColorIndex = 5
  End If
 Next
End Sub

コレクションがセルの場合です。E4から順にE13まで、「値が20,000より大きければ文字を青くする」という繰り返し処理をします。

一つ一つは単純な作業なので時短の効果は感じにくいかもしれません。しかし単純作業が積み重なった時にこそVBAの真価が発揮されます。→超速見積フォーム← 1枚2~3分で作成していた見積を60秒以内に完成させるフォームを紹介している記事です。1枚で1分短縮としても30枚で30分。カフェに寄り道するもよし、早く帰って湯船に浸かるもよし。気になった方はぜひ読んでみて下さい。(‘ω’)ノ