繰り返し処理は条件分岐と合わせて必ず押さえておきたいポイントです。
手作業を自動処理するのがマクロなので、繰り返し行う作業が自動化できる今回の内容は、業務効率化に大きなメリットをもたらします。
(*’ω’*)σ ここをマスターすれば、無敵に1歩近づきます。
”For Next” 指定した範囲に処理を繰り返す
範囲を指定して同じ処理を繰り返す、基本的な書き方から説明します。例えば「表の1行目から最終行まで」や「シート1からシート5まで」のように、範囲を「変数」として指定したうえで処理の内容を支持します。
For…Nextステートメント
変数が初期値から最終値になるまで同じ処理を繰り返す
Dim 変数 Asデータ型
For 変数 = 初期値 To 最終値
繰り返し処理の内容
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になるまで繰り返す
・・・てな感じでマクロ実行後は表が1行おきに塗りつぶされてシマシマになりました。ちなみにColorIndex22はコーラルピンクです。
これを応用すれば5行ごとに太い罫線を引きたいとか、10行ごとに色を変えたいとか、様々なことができますね。
繰り返し処理を抜ける時は ”Exit For”
Exit For
処理内容の前に条件を付加して、一致する場合は繰り返し処理から抜ける
Dim 変数 Asデータ型
For 変数 = 初期値 To 最終値 Step 2
条件満たすなら Exit For
繰り返し処理の内容
Next(変数)
指定した変数の範囲内でも、繰り返し処理を途中で抜けることが可能です。たとえば処理内容の前に条件を付加して、条件を満たす時は繰り返し処理を途中で抜けるという書き方ができます。変数の範囲は20行目までなのに、表は13行目までしかない場合で説明していきます。
途中で繰り返し処理を抜けるという記述が無いと左図のようになります。まぬけです。
表が途切れたら、繰り返し処理もストップしたい・・・どのように書けば良いでしょうか?
°˖✧◝(⁰▿⁰)◜✧˖°
「空白セルなら繰り返し処理から抜ける」で書いてみましょう。
サンプルプロシージャ
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を使って「空白セルなら繰り返し処理を抜ける」という書き方をしましたが、結果として同じ処理でも様々な書き方がある事がわかりますね。
Do …Loop Untilステートメント
繰り返し処理後に条件判定
Do
繰り返す処理内容
Loop Until 条件式
サンプルプロシージャ
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つは似ていて、言葉で説明されても少々混乱する部分です。つまづくと沼確定なので図解しておきます。(・∀・)じゃーん!
図にすると一目瞭然、両者は状況的に真逆であることが分かります。日本語って難しいですね。
”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分。カフェに寄り道するもよし、早く帰って湯船に浸かるもよし。気になった方はぜひ読んでみて下さい。(‘ω’)ノ