VBAの制御構造(ループ構造)は、特定のコードブロックを繰り返し実行するための構文です。主に使用されるループ構造には、For…Nextループ、For Each…Nextループ、Do Whileループ、Do Untilループの4つがあります。
制御構造 | 構文 | 説明 |
---|---|---|
条件分岐 | If…Then…Else 文 | 条件に応じて異なるコードを実行します。 |
Select Case 文 | 特定の変数の値に基づいて異なるコードを実行します。 | |
ループ構造 | For…Next ループ | 指定した回数だけコードを繰り返します。 |
For Each…Next ループ | コレクションや配列の各要素に対して繰り返し処理を行います。 | |
Do While…Loop ループ | 条件が真である限り、コードを繰り返します。 | |
Do Until…Loop ループ | 条件が偽である限り、コードを繰り返します。 |
For…Nextループ
For…Nextループは、特定の回数だけコードブロックを繰り返し実行するための構文です。カウンタ変数を使ってループの開始値、終了値、および増分を制御します。これを使うことで、繰り返し処理を簡単に行うことができます。
For…Nextの構文
For カウンタ変数 = 開始値 To 終了値 [Step 増分]
繰り返し実行するコード
Next カウンタ変数
数値を1から5まで順番に表示する例を見てみましょう。
Sub ExampleForNext()
Dim i As Integer
' 1から5までの数を表示する
For i = 1 To 5
MsgBox "現在の値は " & i & " です。"
Next i
End Sub
i が1のとき、メッセージボックスに「現在の値は 1 です。」と表示されます。Next i により i が1増えます。
i が2のとき、メッセージボックスに「現在の値は 2 です。」と表示されます。このプロセスが i が5になるまで繰り返されます。
増分を指定する例
iが1,2,3…と増え続けていますが1,3,5…や1、5,10など増分してもできます。
増分を指定する場合は、Stepキーワードを使います。例えば、1から10まで2ずつ増やす場合は次のようになります。
Sub ExampleForNextStep()
Dim i As Integer
' 1から10まで2ずつ数を表示する
For i = 1 To 10 Step 2
MsgBox "現在の値は " & i & " です。"
Next i
End Sub
For i = 1 To 10 Step 2: 変数 i を1から始め、2ずつ増やしながら10までループを実行します。
このコードを実行すると、i の値は1, 3, 5, 7, 9の順にメッセージボックスに表示されます。
逆順にループする
10,9,8…のようなカウントダウンをする場合はどうすればいいでしょうか。その場合はstepにマイナスをすれば可能になります。
例えば、10から1まで1ずつ減らしながらループする場合は次のようになります。
Sub ExampleForNextReverse()
Dim i As Integer
' 10から1まで1ずつ減らしながら数を表示する
For i = 10 To 1 Step -1
MsgBox "現在の値は " & i & " です。"
Next i
End Sub
For i = 10 To 1 Step -1: 変数 i を10から始め、1ずつ減らしながら1までループを実行します。
このコードを実行すると、i の値は10, 9, 8, … , 2, 1の順にメッセージボックスに表示されます。
For…Nextループは、特定の回数だけ繰り返し処理を実行したいときに非常に便利です。
For Each…Nextループ
For Each…Nextループは、コレクションや配列の各要素に対して繰り返し処理を行うための構文です。このループ構造を使うことで、コレクションや配列の要素を簡単に順に処理することができます。
要素変数: コレクションや配列の各要素を表す変数です。
For Each…Nextの構文
For Each 要素変数 In コレクションまたは配列
繰り返し実行するコード
Next 要素変数
Excelのセルを使った例
シート上の選択されたセルの各セルに対して処理を行う例を見てみましょう。まずExcelシートで値が入ったセルにカーソルをあわせます。
次のFor Each…Nextを実行します。(複数選択にも対応しています。)
Sub ExampleForEachNext()
Dim cell As Range
' シート上の選択されたセルの各セルに対して処理を行う
For Each cell In Selection
cell.Value = cell.Value * 2 ' セルの値を2倍にする
Next cell
End Sub
For Each cell In Selectionは選択範囲 (Selection) の各セル (cell) に対して繰り返し処理を行います。cell.Value = cell.Value * 2は 各セルの値を2倍にします。最後にNext cellで次のセルに移動します。
このコードを実行すると、選択範囲内の各セルの値が順に2倍になります。
配列を使った例
配列の各要素に対して処理を行う例を見てみましょう。
Sub ExampleForEachArray()
Dim fruits As Variant
Dim fruit As Variant
' 配列を定義
fruits = Array("スイカ", "キウイ", "ブドウ")
' 配列の各要素に対して処理を行う
For Each fruit In fruits
MsgBox "フルーツの名前は " & fruit & " です。"
Next fruit
End Sub
このコードを実行すると、配列内の各フルーツの名前が順にメッセージボックスに表示されます。
コレクションを使った例
ワークシートの各シートに対して処理を行う例を見てみましょう。
コレクションとはワークシートやセルを指します。
Sub ExampleForEachCollection()
Dim ws As Worksheet
' ワークブック内の各ワークシートに対して処理を行う
For Each ws In ThisWorkbook.Worksheets
MsgBox "シートの名前は " & ws.Name & " です。"
Next ws
End Sub
For Each ws In ThisWorkbook.Worksheetsは現在のワークブック (ThisWorkbook) の各ワークシート (ws) に対して繰り返し処理を行います。MsgBox “シートの名前は ” & ws.Name & ” です。” 各ワークシートの名前を表示します。Next wsは次のワークシートに移動します。
このコードを実行すると、ワークブック内の各ワークシートの名前が順にメッセージボックスに表示されます。
For Each…Nextループを使うことで、コレクションや配列の各要素に対して簡単に繰り返し処理を行うことができます。
Do While…Loopループ
Do While…Loopループは、指定された条件が真(True)である間、コードブロックを繰り返し実行するための構文です。このループは、条件が満たされなくなるまで繰り返します。
Do While…Loopの構文
Do While 条件
繰り返し実行するコード
Loop
Do While…Loopループの基礎
変数iを1から10まで増やしながら表示する例を見てみましょう。
Sub ExampleDoWhileLoop()
Dim i As Integer
i = 1
' iが10未満である間、ループを実行する
Do While i < 10
MsgBox "現在の値は " & i & " です。"
i = i + 1 ' iを1ずつ増やす
Loop
End Sub
このコードを実行すると、iの値が1から9まで順に表示されます。10になるとループの条件から外れるので処理が次に移行します。
条件が最初に満たされない場合
条件が最初から満たされていない場合、ループは一度も実行されません。例えば、次のような例を見てみましょう。
Sub ExampleDoWhileLoopNotExecuted()
Dim i As Integer
i = 10
' iが10未満である間、ループを実行する
Do While i < 10
MsgBox "現在の値は " & i & " です。"
i = i + 1
Loop
End Sub
iの値がすでに10になっているのでループ内のコードは一度も実行されません。
無限ループに注意
条件が常に真の場合、ループは無限に続いてしまいます。これを無限ループと呼びます。無限ループが発生しないように、ループ内で条件が偽になるように注意深く設計する必要があります。
' 無限ループの例(避けるべき)
Sub ExampleInfiniteLoop()
Dim i As Integer
i = 1
' 条件が常に真であるため、無限ループになる
Do While i > 0
MsgBox "現在の値は " & i & " です。"
' iの値を変えないため、条件が常に真となる
Loop
End Sub
無限ループになってしまったら
「Ctrl + Brake」または「Ctrl + Pause」 を押します。
キーが無い場合は「Fn」+「B」で代用できる場合があります。
Do While…Loopループは、指定された条件が真である間、コードブロックを繰り返し実行するために使います。
Do Until…Loopループ
Do Until…Loopループは、指定された条件が偽(False)である間、コードブロックを繰り返し実行するための構文です。このループは、条件が真(True)になるまで繰り返します。
Do Until…Loopの構文
Do Until 条件
繰り返し実行するコード
Loop
Do Until 条件の基本
変数iを1から10まで増やしながら表示する例を見てみましょう。
Sub ExampleDoUntilLoop()
Dim i As Integer
i = 1
' iが10になるまでループを実行する
Do Until i = 10
MsgBox "現在の値は " & i & " です。"
i = i + 1 ' iを1ずつ増やす
Loop
End Sub
このコードを実行すると、条件を満たさない間処理を繰り返しiの値が1から9まで順に表示されます。
条件が最初に満たされる場合
条件が最初から満たされている場合、ループは一度も実行されません。例えば、次のような例を見てみましょう。
Sub ExampleDoUntilLoopNotExecuted()
Dim i As Integer
i = 10
' iが10になるまでループを実行する
Do Until i = 10
MsgBox "現在の値は " & i & " です。"
i = i + 1
Loop
End Sub
このコードを実行すると、iにはすでに10が入っているのでループ内のコードは一度も実行されません。
無限ループに注意
条件が常に偽の場合、ループは無限に続いてしまいます。これを無限ループと呼びます。無限ループが発生しないように、ループ内で条件が真になるように注意深く設計する必要があります。
' 無限ループの例(避けるべき)
Sub ExampleInfiniteLoop()
Dim i As Integer
i = 1
' 条件が常に偽であるため、無限ループになる
Do Until i = 0
MsgBox "現在の値は " & i & " です。"
' iの値を変えないため、条件が常に偽となる
Loop
End Sub
ここでも同じように無限ループになってしまったら
「Ctrl + Brake」または「Ctrl + Pause」 を押します。
キーが無い場合は「Fn」+「B」で代用できる場合があります。
Do Until…Loopループは、指定された条件が真になるまでコードブロックを繰り返し実行するために使います。
これらのループ構造を使うことで、VBAで効率的に繰り返し処理を行うことができます。用途に応じて適切なループ構造を選びましょう。