目標
For Each文を理解して利用できる
For Eachステートメントの概要と利用方法
For Eachステートメントとは
For Each ステートメントは指定した配列やコレクションの各要素を順番に取り出して処理に利用することができます。
コレクションとは配列のように沢山の値を(順番をつけて)まとめたものです。※配列は厳密にはコレクションとは異なります。For Eachでは配列や複数のワークシート、複数のセルなど、指定したオブジェクトをひとつずつ取り出して処理に利用することができます。
For Eachステートメントの利用方法
Rangeを利用する場合
サンプルプロシージャ1
Sub DayPrint()
Dim DayNum As Range
Dim i As Integer
i = 1
For Each DayNum In Range("A1:A31")
DayNum = i & "日"
i = i + 1
Next DayNum
End Sub
実行結果
Worksheetを利用する場合
サンプルプロシージャ2
こちらのサンプルプロシージャは、制御構文|Excel VBA (Part.6)【For Next】ネスト編(前編)で利用したものをFor Eachで書き換えた内容となります。
Sub sample()
Dim i As Integer, j As Integer
Dim tableRow As Integer, tableColumns As Integer
Dim ws As Worksheet
Sheets("Sheet4").Select
Range("C3").Select
ActiveCell.CurrentRegion.Select
Selection.ClearContents
For Each ws In Worksheets
If ws.Name = "Sheet4" Then
Exit For
End If
ws.Select
Range("C3").Select
ActiveCell.CurrentRegion.Select
tableRow = Selection.Rows.Count
tableColumns = Selection.Columns.Count
If ws.Name = "Sheet1" Then
Selection.Copy
Sheets("Sheet4").Select
Range("C3").Select
ActiveSheet.Paste
Range("C3").Select
ElseIf ws.Name <> "Sheet1" Then
ActiveCell.Offset(1, 0).Resize(tableRow - 1, tableColumns).Select
Selection.Copy
Sheets("Sheet4").Select
Range("C3").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
End If
Application.CutCopyMode = False
If ws.Name = "Sheet3" Then
ActiveCell.CurrentRegion.Select
tableRow = Selection.Rows.Count
tableColumns = Selection.Columns.Count
ActiveSheet.Range("H5").Select
Application.ScreenUpdating = False
Application.EnableEvents = False
For j = 1 To tableRow - 2
ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-2]-RC[-1]"
ActiveCell.Offset(1, 0).Select
Next j
Application.ScreenUpdating = True
Application.EnableEvents = True
End If
Next ws
End Sub
実行結果
配列を利用する場合
‘配列をArray関数を利用して初期化する時はVariant型で宣言して動的配列にする。
Dim arr() As Variant
arr = Array(0, 1, 2, 3, 4)
‘For Eachステートメント内の要素を取り出す方の変数はVariant型に設定する。
Dim item As Variant
For Each item In arr
Debug.Print (item)
Next
実行結果
‘要素ごとに代入をするときは配列の個数を指定してString型やInteger型など明示して指定する。(Variant型でも可)
Dim arr(4) As Integer
arr(0) = 0
arr(1) = 1
arr(2) = 2
arr(3) = 3
arr(4) = 4
‘For Eachステートメント内の要素を取り出す方の変数はVariant型に設定する。
Dim item As Variant
For Each item In arr
Debug.Print (item)
Next
実行結果
サンプルプロシージャ3
Sub ForEachArray()
Dim Days() As Variant
Days = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31)
Dim Day As Variant
Dim Months As Integer
Months = InputBox("月数を入力して下さい")
For Each Day In Days
Cells(Day, 1) = Day & "日"
Select Case Months
Case 4, 6, 9
If Day = 31 Then
Exit For
End If
Case 2
If Day = 28 Then
Exit For
End If
End Select
Next Day
Dim Sat As Integer
Dim i As Integer
Sat = InputBox("最初の土曜日の日付を入力してください")
For i = Sat To 31 Step 7
Cells(i, 1).Font.Color = RGB(0, 0, 255)
Cells(i + 1, 1).Font.Color = RGB(255, 0, 0)
Next i
End Sub
実行結果
For Each ステートメントの処理を途中で止める方法
Exit Forを利用する
For Each ステートメントでは要素の最後まで繰り返しが行われます。途中で繰り返しを止めたい時はIfステートメントとExit Forステートメントを利用して処理を抜けることが出来ます。
実際の利用方法
今回は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。