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のステップは以下の通りです。
実際に”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”)に新たな値を入力しています。
シート内オブジェクト(図形)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文の繰り返し処理はとっても便利なので、ぜひ使ってみてください。