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 の値に設定します。
Sub SetArrayValue()
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
End Sub
セル範囲の各セルをループ処理する
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 クラスを反復することもできます。
以下は、これを行う方法を示す例です。
VBE (Visual Basic Editor) でクラス モジュールを作成し、その名前を CustomCollection に変更します。cc1
以下のコードを新しく作成したクラスに配置します。
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
このモジュールをファイルにエクスポートしてローカルに保存します。cc2
モジュールをエクスポートしたら、テキスト エディターを使用してエクスポートされたファイルを開きます (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
テキスト エディターを使用して、ファイル内の
Property Get NewEnum() As IUnknown
テキスト下の最初の行から文字'
を削除します。 変更したファイルを保存します。VBE に戻り、VBA プロジェクトから作成したクラスを削除します。プロンプトが表示されてもエクスポートしないでください。cc3
文字
'
を削除したファイルをインポートして VBE に戻します。cc4次のコードを実行して、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 のサポートおよびフィードバックを参照してください。