Corrigir depurador VBA do Word pulando linhas em procedimentos longos
🔍 WiseChecker

Corrigir depurador VBA do Word pulando linhas em procedimentos longos

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.

ADVERTISEMENT

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.

  1. 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ção On Error Resume Next e interrompe a execução na linha exata onde ocorre um erro, impedindo que o depurador pule linhas após um erro silencioso.
  2. 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.
  3. Insira DoEvents após cada bloco principal
    Em procedimentos longos, adicione DoEvents após cada loop For, loop While ou bloco If. Por exemplo, após End If ou Next i, adicione uma nova linha com DoEvents. 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 linha DoEvents e depois na próxima linha executável.
  4. Remova temporariamente todas as instruções On Error Resume Next
    Se seu procedimento usa On Error Resume Next, comente-o adicionando um apóstrofo no início da linha. Substitua por On Error GoTo 0 para 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.
  5. 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).

ADVERTISEMENT

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.

ADVERTISEMENT