Excel VBA For文による繰り返し 意外と簡単!? 徹底解説

Excelを使っていると、繰り返し処理は必ずと言っていいほどあるのではないでしょうか?

繰り返し処理って大変だし、ちょっとしたミスとかもでますよね?

そんなときに便利なのがExcel VBAのFor文です。

For文には、For~Next、For Eachの2種類があります。

今回は、上記の2種類に加え、For文の入れ子(ネスト)、特定の条件でループを抜ける、処理を飛ばす方法についてご紹介します。

記事の内容
  • 繰り返し処理から解放されたい
  • For~Next文の使い方を知りたい
  • For Each文の使い方を知りたい
  • 特定の条件で、ループを抜けたり、処理を飛ばしたい

For~Next

For文が使えると、面倒な繰り返し処理から解放されます。
私も昔は、繰り返し処理を手動でやっていました。。。

Excel VBAに出会って、For文を使えるようになったことで、驚くほど作業効率が上がりました。
あなたもこの機会に、For文の使い方をマスターしちゃいましょう。

基本的な使い方

基本的な使い方は以下の通りです。

コード

Dim カウンタ変数 As Integer

For カウンタ変数 = 初期値 To 終了値
    繰り返し処理
Next

For~Nextのステップは以下の通りです。

手順1
処理開始
開始値から処理を実行
手順2
カウンタ変数 加算
“繰り返し処理”を1度実行したら、カウンタ変数に”1″が加算される
手順3
再度ループ処理
カウンタ変数が開始値から終了値の間であれば、”繰り返し処理”を実行
手順4
ループ処理を抜ける
カウンタ変数が終了値を超えたら、ループを抜ける

実際に”A1″からA5″まで値を入力するコードを見ていきましょう。

コード

Sub test()
    Dim i As Integer

    For i = 1 To 5
        Cells(i, 1).Value = i
    Next
End Sub

今は、5回の繰り返し処理なので、手動で入力した方がいいと思うかもしれませんが、繰り返し処理が100、1000、・・・となったら大変です。

膨大な数の繰り返し処理がExcel VBAの実行をするだけで一瞬でできるってなったら、使わないと損じゃないですか?

セルに値を入力する方法は、以下をご参照ください。
Excel VBA 値の入力と取得はRange、Cellsプロパティを使うだけ!

ステップ(加算値)を変更

For~Nextで1回処理が終わると”1″が加算されるといいました。

For文を使っていると、1つ飛ばしで処理をしたいということもあります。

そんなときは、“Step 加算値”を使いましょう。

コード

Sub test()
    Dim i As Integer

    For i = 1 To 5 Step 2
        Cells(i, 1).Value = i
    Next
End Sub

値が1つ飛ばしで入力されているのがおわかり頂けると思います。

Stepを省略すると、”1″になります。

セルに値を入力する方法は、以下をご参照ください。
Excel VBA 値の入力と取得はRange、Cellsプロパティを使うだけ!

特定の条件でループを抜ける

特定の条件でループを抜けたい場合は、Exit Forを使いましょう。

実際に、i = 3のときにループを抜ける処理を見ていきましょう。

コード

Sub test()
    Dim i As Integer
    For i = 1 To 5
        If i = 3 Then
            Exit For
        End If
        
        Debug.Print "処理回数:" & i
    Next
End Sub

i = 3になったら、For文を抜けるため、i = 4以降の処理は実行されません。

特定の条件で処理を飛ばす

処理を飛ばしたい場合、他のプログラミング言語では、“continue”が用意されていますが、Excel VBAでは用意されていないため、if文を使います。

実際にi = 3のときに処理を飛ばす処理を見ていきましょう。

コード

Sub test()
    Dim i As Integer
    For i = 1 To 5
        If Not i = 3 Then
            Debug.Print "処理回数:" & i
        End If
    Next
End Sub

Exit Forとは違い、i = 3の処理を飛ばし、i = 4以降はループ処理を継続しています。

if文の使い方は、以下をご参照ください。
Excel VBA If文 複数条件の分岐処理は”Or”を使う!

For~Next 入れ子(ネスト)

For文の中にFor文を入れることを入れ子(ネスト)と言います。

行数と列数の両方を増減して処理をすることがよくあり、そういった場合は、For文の入れ子を使う必要があります。

書き方は簡単で、For文の中にFor文を入れるだけで大丈夫です。

3行 x 3列に値を入力する簡単な処理を見ていきましょう。

コード

Sub test()
    Dim i As Integer
    Dim j As Long
    
    For i = 1 To 3
        For j = 1 To 3
            Cells(i, j).Value = i & "行 x " & j & "列"
        Next
    Next
End Sub

For Each

For Eachを使うことで、コレクションや配列に対して、繰り返し処理をすることができます。

コレクションって?

コレクションとは、同じ種類のオブジェクトのグループ(集合体)のことです。

例えば、以下のような集合体があります。
 ・セルの範囲(“A1:C3”)
 ・ブック内のすべてのWorksheetオブジェクト

 ・シート内のすべてのグラフオブジェクト

基本的な使い方

コード

For Each オブジェクト変数 In コレクション
    処理
Next オブジェクト変数

セル範囲Ver.

コード

Sub test()
    Dim r As Range
    
    For Each r In Range("A1:C3")
        r.Value = "1"
    Next r
End Sub

実行後

Rangeオブジェクトでセル範囲を取得して、1つ1つのセルに”1″を入力しています。
複数のセルに対して、処理を実行したいというときに便利です。

配列Ver.

For Eachで配列を指定した場合、配列の要素数だけ処理を実行することができます。

コード

Sub test()
    Dim fruit As Variant
    Dim fruits As Variant

    fruits = Array("apple", "grape", "orange")

    For Each fruit In fruits
        Debug.Print fruit
    Next fruit
End Sub

実行後

WorksheetオブジェクトVer.

For EachでWorksheetオブジェクトを指定することで、ブック内のすべてのシートに対して処理を実行することができます。


参考
Worksheet オブジェクト (Excel)Microsoft

コード

Sub test()
    Dim ws As Worksheet
    Dim i As Integer
    i = 1
    
    For Each ws In Worksheets
        ws.Name = "シート" & i
        i = i + 1
    Next ws
End Sub

実行前

実行後

上のコードでは、取得したWorksheetオブジェクトの名前(“.Name”)に新たな値を入力しています。


参考
配列の使用Microsoft

シート内オブジェクト(図形)Ver.

シート内の図形のすべてに対して、同じ処理を加えたいというときに便利です。

コード

Sub test()
    Dim shp As Shape
    Dim i As Integer
    i = 0
    For Each shp In ActiveSheet.Shapes
        shp.Delete
        i = i + 1
    Next shp
    ActiveSheet.Select
End Sub

実行前

実行後

シート内に図形がない状態

まとめ

ここまで、Excel VBAのFor~Next、For Eachについてご紹介しました。

For文の繰り返し処理はとっても便利なので、ぜひ使ってみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です