VBAの制御構造(ループ構造)

投稿日: 2024年5月27日

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で効率的に繰り返し処理を行うことができます。用途に応じて適切なループ構造を選びましょう。

記事