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 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.

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

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... Os próximos loops não iteram 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.