トップ > 玄人向け > For Each ... Next ステートメント

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

ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.