For Each ... Next ステートメント 2010.07.11
For Each ... Next ステートメントは、配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。
「選択しているセル範囲、全てのセルの値を調べる」「シート上の全てのオートシェイプを消去する」といった使い方が考えられます。
配列やコレクションの要素数が変動しても、データの取りこぼしを防ぐのが特徴です。
構文
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
For Each...Next ステートメントの構文は、次の指定項目から構成されます。
データ処理の順序
セル範囲
セル範囲に対してFor Each...Nextステートメントを実行する場合の、データ処理順序は、下図の通りです。左上のセルから列方向に進み、選択範囲最後の列までくると、次の行の最初の列に進みます。
尚、選択範囲の列数を取得し、ループ回数をカウントすることで、現在処理されているセル位置を取得すことが可能です(取得できるセルの位置は、選択範囲の左上のセルをCells(1,1)とした場合のものです)。取得方法は下記を参考にしてください。
Sub Cells_Location() Dim lngRow As Long Dim lngCol As Long Dim lngColumnsC As Long Dim lngIndex As Long Dim objRange As Range With Application lngColumnsC = .Selection.Columns.Count '選択範囲の行数を取得 For Each objRange In .Selection lngIndex = lngIndex + 1 'ループ数をカウント lngCol = ((lngIndex - 1) Mod lngColumnsC) + 1 '列を取得 lngRow = (lngIndex + lngColumnsC - 1) \ lngColumnsC '行を取得 MsgBox "Cells(" & lngRow & "," & lngCol & ") 値:" & objRange.Value Next End With End Sub
オートシェイプ
オートシェイプの場合は、セル範囲と異なり、位置ではなく挿入した順に処理されます。写真等の図形も同様に挿入した順になります。
オートシェイプと写真をが混同しているシートの場合は、オートシェイプと図形の種類に関係なく、挿入した順に処理されます。
多次元配列変数
多次元配列は、1次元、2次元、3次元...の順で処理されていきます。ですから、2次元配列はセル範囲の場合と同様の処理順になります。多次元配列の処理順序を確認するサンプルコードを下に記載しました。興味のある方は試してみて下さい。
Sub Order_Sample() '4次元配列の処理順序確認コード Dim intI As Integer Dim intII As Integer Dim intIII As Integer Dim intIIII As Integer Dim lngI As Long Dim varI As Variant Dim lngValue(1 To 2, 1 To 2, 1 To 2, 1 To 2) As Long '4次元配列 For intIIII = 1 To 2 For intIII = 1 To 2 For intII = 1 To 2 For intI = 1 To 2 lngI = lngI + 1 lngValue(intI, intII, intIII, intIIII) = lngI Next Next Next Next For Each varI In lngValue MsgBox varI Next End Sub