For Each...Next ステートメントを使用する

For Each...Next ステートメントは、コレクション内のオブジェクトごと、または配列内の要素ごとに、ステートメントのブロックを繰り返します。 ループを実行するたびに、Visual Basic によって変数が自動的に設定されます。 たとえば、次の 手順では 、A1 から A10 の範囲のすべてのセルの値に 10 を追加します。

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub

次のコードでは、配列内の各要素をループ処理し、それぞれの値をインデックス変数 I の値に設定します。

Dim TestArray(10) As Integer, I As Variant 
For Each I In TestArray 
 TestArray(I) = I 
Next I 

セル範囲の各セルをループ処理する

For Each...Next ループを使用して、範囲内のセルをループ処理します。 次のプロシージャは、Sheet1 のセル範囲 A1:D10 を対象にしてループ処理を行い、セルの値の絶対値が 0.01 より小さい場合はその値を 0 (ゼロ) に設定します。

Sub RoundToZero() 
 For Each rng in Range("A1:D10") 
 If Abs(rng.Value) < 0.01 Then rng.Value = 0 
 Next 
End Sub

For Each...Next ループの完了前にループを終了する

For Each...Next ループは、Exit For ステートメントを使用することで終了できます。 たとえば、エラーの発生時には、If...Then...Else ステートメントまたは具体的なエラーを確認する Select Case ステートメントの True ステートメント ブロックで Exit For ステートメントを使用します。 エラーが発生していない場合、If…Then…Else ステートメントは False になるため、ループは期待どおりに引き続き動作します。

次の例では、セル範囲 A1:B5 内のセルをテストして、数値が含まれない最初のセルを見つけます。 そのようなセルが見つかった場合、メッセージが表示され、Exit For によってループが終了します。

Sub TestForNumbers() 
 For Each rng In Range("A1:B5") 
  If IsNumeric(rng.Value) = False Then 
   MsgBox "Cell " & rng.Address & " contains a non-numeric value." 
   Exit For 
  End If 
 Next rng 
End Sub

For Each...Next ループを使用して VBA クラスを繰り返す

Each...次 のループは、 Collection オブジェクトの配列とインスタンスを反復処理するだけではありません。 For Each...Next ループは、書き込んだ VBA クラスを反復することもできます。

以下は、これを行う方法を示す例です。

  1. VBE (Visual Basic Editor) でクラス モジュールを作成し、その名前を CustomCollection に変更します。cc1

  2. 以下のコードを新しく作成したクラスに配置します。

    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  3. このモジュールをファイルにエクスポートしてローカルに保存します。cc2

  4. モジュールをエクスポートしたら、テキスト エディターを使用してエクスポートされたファイルを開きます (Window のメモ帳ソフトウェアでも十分です)。 ファイルの内容は、次のようになります。

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1  'True
    END
    Attribute VB_Name = "CustomCollection"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  5. テキスト エディターを使用して、ファイル内の Property Get NewEnum() As IUnknown テキスト下の最初の行から文字 ' を削除します。 変更したファイルを保存します。

  6. VBE に戻り、VBA プロジェクトから作成したクラスを削除します。プロンプトが表示されてもエクスポートしないでください。cc3

  7. 文字 ' を削除したファイルをインポートして VBE に戻します。cc4

  8. 次のコードを実行して、VBE とテキスト エディターの両方を使用して記述したカスタム VBA クラスを反復できるようになったことを確認します。

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
    MsgBox Element
    Next
    
脚注 説明
[cc1] [挿入] メニューの [クラス モジュール] を選択すると、クラス モジュールを作成できます。 [プロパティ] ウィンドウでプロパティを変更すると、クラス モジュールの名前を変更できます。
[cc2] [ファイル] メニューの [ファイルのエクスポート] を選択すると、[ファイルのエクスポート] ダイアログ ボックスを開くことができます。
[cc3] [ファイル] メニューで [アイテムの削除] を選択すると、VBE からクラス モジュールを削除することができます。
[cc4] [ファイルのインポート] ダイアログ ボックスを開いて、外部クラス モジュール ファイルをインポートできます ([ファイル] メニューの [ファイルのインポート]を選択します)。

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。