Ao pressionar F8 para percorrer uma macro VBA longa no Word, o depurador às vezes pula várias linhas de código sem executá-las. Isso impossibilita rastrear alterações de variáveis ou confirmar o fluxo lógico. A causa raiz é uma otimização de desempenho conhecida no mecanismo VBA que ignora linhas consideradas “código morto” ou inacessíveis durante a depuração rápida. Este artigo explica por que o depurador pula linhas, fornece uma correção confiável para forçar a depuração linha por linha e aborda problemas relacionados, como pontos de interrupção que não disparam ou procedimentos que parecem travar.
Principais conclusões: Forçando o depurador VBA a percorrer cada linha
- Editor VBA > Ferramentas > Opções > Geral > Interromper em Todos os Erros: Impede que o depurador pule linhas após um erro silencioso ser capturado e tratado.
- Adicionar DoEvents após cada bloco lógico: Força o depurador a pausar e processar eventos da interface do usuário, o que evita a omissão de linhas em loops longos.
- Compilar o projeto antes de depurar: Garante que todas as variáveis sejam declaradas e erros de sintaxe sejam capturados, eliminando uma causa de linhas puladas.
Por que o depurador VBA pula linhas em procedimentos longos
O depurador VBA no Word usa uma estratégia de compilação just-in-time para desempenho. Ao percorrer um procedimento longo, o depurador compila apenas o bloco de código atual. Se ele detectar que uma linha não tem efeitos colaterais—por exemplo, um comentário, uma atribuição redundante ou uma variável que nunca é usada depois—pode pular essa linha para acelerar a execução. Isso não é um bug; é uma otimização intencional que se torna problemática quando você precisa verificar cada etapa.
Uma segunda causa é o tratamento de erros. Se seu procedimento usa On Error Resume Next, o depurador trata erros como eventos não críticos. Após um erro ocorrer, o depurador pode pular várias linhas para continuar a execução, ignorando as linhas que seriam executadas se o erro não tivesse ocorrido. Da mesma forma, se você tiver uma instrução GoTo ou um Exit Function dentro de um loop, o depurador pode pular todas as linhas restantes no bloco atual.
Uma terceira causa é o uso de rótulos de linha ou caracteres de continuação. O depurador pode avaliar um rótulo de linha como uma operação nula e pular diretamente para a próxima instrução executável. Isso é especialmente comum em procedimentos longos que contêm vários blocos Select Case ou If...ElseIf...End If.
Etapas para impedir que o depurador pule linhas
As etapas a seguir forçam o editor VBA a percorrer cada linha, independentemente de otimização ou lógica de tratamento de erros. Execute estas etapas na ordem mostrada.
- Abra o editor VBA e defina Interromper em Todos os Erros
No editor VBA, clique em Ferramentas > Opções. Na guia Geral, em Captura de Erros, selecione Interromper em Todos os Erros. Clique em OK. Essa configuração substitui qualquer instruçãoOn Error Resume Nexte interrompe a execução na linha exata onde ocorre um erro, impedindo que o depurador pule linhas após um erro silencioso. - Compile o projeto antes de iniciar
No editor VBA, clique em Depurar > Compilar VBAProject. Corrija quaisquer erros de sintaxe ou variáveis não declaradas que aparecerem. A compilação remove caminhos de código morto que o depurador poderia pular. Após a compilação, pressione F8 para começar a percorrer o procedimento. - Insira DoEvents após cada bloco principal
Em procedimentos longos, adicioneDoEventsapós cada loopFor, loopWhileou blocoIf. Por exemplo, apósEnd IfouNext i, adicione uma nova linha comDoEvents. Isso força o depurador a ceder ao sistema operacional e processar eventos pendentes, quebrando a otimização que pula linhas. O depurador agora parará na própria linhaDoEventse depois na próxima linha executável. - Remova temporariamente todas as instruções On Error Resume Next
Se seu procedimento usaOn Error Resume Next, comente-o adicionando um apóstrofo no início da linha. Substitua porOn Error GoTo 0para restaurar o tratamento de erros padrão. Isso impede que o depurador pule linhas após um erro. Após a depuração, descomente o manipulador de erros original. - Defina um ponto de interrupção na primeira linha e percorra linha por linha
Clique na margem esquerda da primeira linha executável do procedimento para adicionar um ponto de interrupção vermelho. Pressione F5 para executar a macro até o ponto de interrupção. Em seguida, pressione F8 repetidamente. O depurador agora deve parar em cada linha, incluindo comentários se forem o único conteúdo em uma linha. Se uma linha ainda for pulada, verifique se ela contém um rótulo de linha ou um caractere de continuação (sublinhado).
Se o depurador ainda pular linhas após a correção principal
Pontos de interrupção não disparam em certas linhas
Se um ponto de interrupção ficar cinza ou não interromper a execução, a linha provavelmente está dentro de um caminho de código inativo. Por exemplo, um ponto de interrupção dentro de um bloco ElseIf que nunca é avaliado como verdadeiro não será acionado. Mova o ponto de interrupção para uma linha que sempre executa, como a linha de declaração Sub ou Function. Alternativamente, use instruções Debug.Print para gerar valores de variáveis na janela Imediato em vez de depender de pontos de interrupção.
O Word congela ou fica sem resposta durante a depuração
Procedimentos longos que manipulam objetos do Word—como Selection.Find ou ActiveDocument.Tables—podem fazer o depurador travar. Adicione uma chamada DoEvents dentro do loop e reduza a sobrecarga de atualização de tela definindo Application.ScreenUpdating = False no início da macro. Defina de volta para True após o loop. Isso não corrige a omissão de linhas, mas impede que o depurador fique sem resposta.
O depurador pula de um loop para o final do procedimento
Isso acontece quando a condição do loop se torna falsa inesperadamente. Verifique a variável contadora do loop na janela Imediato digitando ?variavelContadora e pressionando Enter. Se a variável estiver fora do intervalo, o loop sai mais cedo e o depurador pula as iterações restantes. Para evitar isso, adicione uma observação na variável do loop: clique com o botão direito no nome da variável na janela de código e selecione Adicionar Observação. Defina o tipo de observação como Interromper Quando o Valor Mudar.
| Comportamento do Depurador | Antes da Correção (Pulando Linhas) | Após a Correção (Passo Único Forçado) |
|---|---|---|
| Tratamento de erros | Pula linhas após On Error Resume Next | Interrompe em cada linha de erro |
| Otimização de loop | Pula linhas em loops For ou While longos | Para em cada linha, incluindo DoEvents |
| Compilação | Pula linhas com variáveis não declaradas | Compila todo o código, sem caminhos mortos |
| Rótulos de linha | Pula diretamente para a próxima linha executável | Para na linha do rótulo se for o único conteúdo |
Ao ativar Interromper em Todos os Erros, compilar o projeto e adicionar chamadas DoEvents, você pode forçar o depurador VBA do Word a percorrer cada linha de um procedimento longo. Use a janela Imediato para inspecionar variáveis em cada parada. Para procedimentos que ainda pulam linhas, verifique caminhos de código inativos e remova manipuladores de erros temporários. Essas etapas fornecem controle total sobre o processo de depuração e ajudam a identificar erros de lógica que passariam despercebidos.