Uso de instruções For Each...Next

As instruções For Each...Next repetem um bloco de instruções para cada objeto em uma coleção ou cada elemento em uma matriz . O Visual Basic define automaticamente uma variável cada vez que o loop é executado. Por exemplo, o procedimento a seguir adiciona 10 ao valor de cada célula no intervalo de A1 a A10.

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

O seguinte código faz loop em todos os elementos de uma matriz e define o valor de cada um para o da variável de índice I.

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

Fazer loop em um intervalo de células

Use um loop For Each...Next para fazer loop nas células de um intervalo. O procedimento a seguir faz um loop no intervalo A1:D10 na Planilha1, definindo como 0 (zero) qualquer número cujo valor absoluto seja menor que 0,01.

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

Sair de um loop For Each...Next antes da conclusão

É possível sair de um loop For Each...Next usando a instrução Exit For. Por exemplo, quando ocorre um erro, use a instrução Exit For no bloco da instrução True de uma instrução If...Then...Else ou de uma instrução Select Case que verifica especificamente o erro. Se o erro não ocorrer, a instrução If…Then…Else será False e o loop continuará a ser executado conforme o esperado.

O exemplo a seguir testa a primeira célula no intervalo A1:B5 que não contém um número. Se tal célula for encontrada, será exibida uma mensagem e Exit For sairá do loop.

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

Use um loop For Each...Next para iterar uma classe VBA

Para cada um... Os loops Next não são iterados apenas em matrizes e instâncias do objeto Collection . O loop For Each...Next também podem iterar através de uma classe VBA que você escreveu.

A seguir está um exemplo que demonstra como fazer isso.

  1. Criar um módulo de classe no VBE (Editor do Visual Basic) e o renomeie CustomCollection. cc1

  2. Adicione o seguinte código no módulo recém-criado.

    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. Exporte este módulo para um arquivo e o armazene no local.cc2

  4. Após exportar o módulo, abra o arquivo exportado usando um editor de texto (o software do Bloco de notas do Windows deve ser o suficiente). O conteúdo do arquivo deve ter a seguinte aparência.

    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. Ao usar o editor de texto, remova o ' caractere da primeira linha abaixo do Property Get NewEnum() As IUnknown texto no arquivo. Salve o arquivo modificado.

  6. No VBE, remova a classe criada no seu projeto VBA e opte por não exportá-lo quando solicitado.cc3

  7. Importe o arquivo que você removeu o ' caractere de volta para o VBE.cc4

  8. Execute o seguinte código para ver que você agora pode iterar através da classe VBA personalizada que escreveu usando o VBE e um editor de texto.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
        MsgBox Element
    Next
    
Notas de rodapé Descrição
[cc1] Você pode criar um módulo de classe escolhendo módulo de classe no menu inserir. Você pode renomear um módulo de classe modificando suas propriedades na janela Propriedades.
[cc2] Você pode ativar a caixa de diálogo Exportar arquivo ao escolher Exportar arquivo no menu Arquivo.
[cc3] Você pode remover um módulo de classe VBE ao selecionar Remover Item no menu arquivo.
[cc4] Você pode importar um arquivo externo do módulo de classe ao ativar a caixa de diálogo Importar Arquivo (escolha Importar Arquivo no menu Arquivo).

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.