O que é?
Em VBA, a instrução For Each repete uma mesma ação por um número de vezes definido por uma coleção.
Observe sua estrutura:

[variável] é uma variável de um dos tipos de objetos válidos para a linguagem VBA no contexto do Microsoft Excel, por exemplo, String, Integer ou mesmo Workbook ou Worksheet.
[coleção] é uma variável do gênero coleção do VBA. Variáveis de coleção são como "Arrays", só que um pouco mais inteligentes.
[código] o código que tratará o uso da variável naquele contexto.
Exemplo
Utilizaremos à estrutura For Each para acessar as informações de todas as planilhas contidas em uma pasta de trabalho.
Ao abrir uma pasta de trabalho, por padrão o Microsoft Excel criar três planilhas de nomes Plan1, Plan2 e Plan3como mostra a figura:

Estes nomes geralmente são alterados e as planilhas excluídas ou mesmo adicionadas.
O que queremos é ter acesso às informações das planilhas, não importam quantas existam e em que ordem estejam. O VBA disponibiliza coleções padrão que refletem objetos do Microsoft Excel. Para nosso caso, utilizaremos o objeto Worksheet e a coleção Worksheets.
Suponto que quiséssemos uma lista de nomes de todas as planilhas e preenche-la em nossa planilha Plan1. O código para executar a tarefa segue abaixo:

Para enteder o código acima, é preciso saber que:
- wsheet é uma variável do tipo Worksheet e será utilizada dentro de nosso laço For Each;
- lin e col são variáveis inteiras que armazenarão os valores de linha e coluna respectivamente da célula ativa na pasta de trabalho;
- ActiveCell é do tipo Cell e faz referência à célula que esta ativa na pasta de trabalho;
- ActiveWorkbook é do tipo Workbook e faz referência a pasta de trabalho ativa;
- ActiveWorkbook.Worksheets é a coleção de Worksheet (planilhas) da pasta e trabalho atual;
Após declarar as variáveis necessárias (linhas 2, 3 e 4), o código captura as coordenadas de linha (linha 4) e coluna (linha 5) da célula ativa na pasta de trabalho para poder acessá-la posteriormente. Em seguida o código efetua o laço For Each na coleção de planilhas (linha 6 a 9).
O laço For Each sabe que deve fazer uam varredura em todos os itens contidos na coleção informada. Não é necessário incrementos ou verificações de quantidade como é o caso do laço For ... Next tradicional ou mesmo oWhile ... Wend. O laço For Each garante que todos os itens da coleção serão contemplados na varredura.
Em nosso código, a garantia é que as instruções das linhas 7 e 8 serão executas o número de vezes que corresponde a quantidade de planilhas existente na pasta de trabalho. A linha 7 pega o nome da planilha (propriedade Name no objeto Worksheet, representado pela variável wsheet em nosso código) e envia para a célula com base das coordenadas das variáveis lin e col. A linha 8 apenas soma 1 à variável lin para que o código "pule" para a célula logo abaixo da que acabou de ser preenchida.
Com o código pronto, faça o teste de funcionamento indo a sua planilha:
- clicando em Ferramentas;
- em seguida Macro;
- e clique em Macros.
Fazendo isso, a seguinte caixa de diálogo será mostrada:

- Clique em Executar e veja o resultado:

Para testar a eficácia do código, tente excluir, inserir ou renomear qualquer planilha. Logo após isso, execute o código novamente. Veja que sem mudar o código, o laço For Each conseguiu alcançar todas as planilha existentes na coleção Worksheets. O VBA junto com o Microsoft Excel disponibiliza uma série de coleções prontas para facilitar nosso trabalho. Dentre elas, algumas das mais utilizadas são:
- Workbooks;
- Worksheets;
- Cells;
- Shapes;
Conforme a lógica de funcionamento do For Each, se não existir nenhum elemento na coleção, o bloco de código interno não será executado.
É importante dizer que para não haver erros no código, é requerido que o tipo da variável seja compatível com o tipo da coleção.
Muito bem!!
ResponderExcluir