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.
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... 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.
Criar um módulo de classe no VBE (Editor do Visual Basic) e o renomeie CustomCollection. cc1
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
Exporte este módulo para um arquivo e o armazene no local.cc2
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
Ao usar o editor de texto, remova o
'
caractere da primeira linha abaixo doProperty Get NewEnum() As IUnknown
texto no arquivo. Salve o arquivo modificado.No VBE, remova a classe criada no seu projeto VBA e opte por não exportá-lo quando solicitado.cc3
Importe o arquivo que você removeu o
'
caractere de volta para o VBE.cc4Execute 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.