Como Acelerar Macros no Excel: ScreenUpdating, Calculation e Outras Técnicas

Para acelerar suas macros VBA, desative a atualização de tela com Application.ScreenUpdating = False e o recálculo automático com Application.Calculation = xlCalculationManual logo no início do código, e restaure os dois valores para True e xlCalculationAutomatic ao final da macro — isso evita que o Excel redesenhe a tela e recalcule fórmulas a cada célula alterada, focando o processamento apenas no resultado final.

Você já rodou uma macro que processa muitas linhas ou várias planilhas e ficou esperando minutos vendo a tela do Excel piscar, célula por célula, enquanto o processamento avança devagar demais para o tamanho da tarefa?

Esse tipo de lentidão não costuma vir do computador ser fraco: na maioria dos casos, o Excel está gastando tempo redesenhando a tela e recalculando todas as fórmulas da pasta de trabalho a cada célula que a macro altera, um trabalho repetido milhares de vezes sem necessidade nenhuma até o fim do processamento.

Neste artigo iremos mostrar as configurações do VBA que mais aceleram a execução de macros — ScreenUpdating, Calculation, EnableEvents e DisplayAlerts —, com um exemplo prático de processamento de milhares de linhas e a forma correta de restaurar essas configurações mesmo se a macro encontrar um erro no meio do caminho.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

ScreenUpdating: parando de redesenhar a tela a cada passo

Por padrão, o Excel redesenha a tela toda vez que uma célula muda de valor, cor ou formatação, mesmo que essa mudança venha de uma macro rodando em segundo plano e não de um clique do usuário. Para uma macro que altera milhares de células, isso significa milhares de atualizações de tela desnecessárias, já que ninguém precisa ver o resultado piscando célula por célula — só o resultado final importa.

Application.ScreenUpdating = False
' ... código da macro que altera muitas células ...
Application.ScreenUpdating = True

Com o ScreenUpdating desativado, a tela congela no estado anterior enquanto a macro roda, e só é atualizada de uma vez quando você reativa com True ao final. Em macros que percorrem milhares de linhas ou muitas planilhas, essa única linha costuma ser responsável pelo maior ganho de velocidade.

Calculation: parando de recalcular a cada alteração

Se a pasta de trabalho tem fórmulas espalhadas pelas planilhas, cada célula que a macro altera pode disparar um recálculo de todas as fórmulas dependentes daquela célula — e isso acontece de novo a cada nova alteração, o que se torna muito lento em planilhas grandes com muitas fórmulas encadeadas. A propriedade Calculation do objeto Application controla esse comportamento:

Application.Calculation = xlCalculationManual
' ... código da macro ...
Application.Calculation = xlCalculationAutomatic

Com xlCalculationManual, o Excel para de recalcular fórmulas automaticamente a cada mudança, deixando isso para o final. Se a própria macro precisar de um valor recalculado no meio do processamento, force um recálculo pontual com Application.Calculate antes de ler o valor, ou use Application.CalculateFull para recalcular tudo, incluindo fórmulas marcadas como já calculadas.

EnableEvents e DisplayAlerts: evitando efeitos colaterais

Duas configurações adicionais ajudam tanto na velocidade quanto em evitar comportamentos inesperados. EnableEvents desativa temporariamente os eventos de planilha (como Worksheet_Change), evitando que uma macro que altera muitas células dispare outra macro de evento repetidamente, uma vez para cada alteração:

Application.EnableEvents = False
' ... código da macro ...
Application.EnableEvents = True

DisplayAlerts suprime as caixas de confirmação que o Excel normalmente exibe, como o aviso ao excluir uma planilha ou sobrescrever um arquivo, o que evita que a macro pare esperando um clique manual no meio de uma execução automática:

Application.DisplayAlerts = False
' ... código que excluiria uma planilha, por exemplo ...
Application.DisplayAlerts = True

Exemplo prático: processando dez mil linhas com e sem otimização

Imagine uma planilha com 10.000 linhas de dados, onde a coluna C precisa ser calculada como o produto das colunas A e B. Sem nenhuma otimização, uma macro simples percorrendo célula por célula pode levar vários segundos, pois a cada linha o Excel redesenha a tela e recalcula todas as fórmulas dependentes:

Linha Coluna A Coluna B Coluna C (resultado)
2 120 3 360
3 85 7 595
4 200 2 400

A macro otimizada, combinando todas as configurações apresentadas, fica assim:

Sub ProcessarDadosRapido()
    Dim i As Long
    Dim ultimaLinha As Long

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ultimaLinha = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 2 To ultimaLinha
        Cells(i, "C").Value = Cells(i, "A").Value * Cells(i, "B").Value
    Next i

    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    MsgBox "Processamento concluído: " & (ultimaLinha - 1) & " linhas."
End Sub

Em planilhas grandes e com muitas fórmulas dependentes, essa combinação costuma reduzir o tempo de execução de forma bem perceptível, já que o Excel deixa de redesenhar a tela e recalcular a cada uma das 10.000 repetições do loop, fazendo isso apenas uma vez, no final.

Restaurando as configurações mesmo se a macro der erro

Um risco real dessas otimizações é a macro travar no meio do caminho por causa de um erro, deixando o Excel com o ScreenUpdating desativado e o cálculo manual permanentemente — o que confunde bastante quem for usar a planilha depois, vendo que as fórmulas pararam de atualizar sozinhas. A forma correta de evitar isso é usar tratamento de erros para garantir que as configurações sejam restauradas mesmo se algo falhar:

Sub ProcessarComSeguranca()
    On Error GoTo TratarErro

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' ... código da macro que pode falhar ...

TratarErro:
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        MsgBox "Ocorreu um erro: " & Err.Description
    End If
End Sub

Esse padrão usa o rótulo TratarErro tanto para capturar um erro real (via On Error GoTo) quanto como ponto de saída normal da macro, garantindo que as duas linhas de restauração sempre rodem, aconteça o que acontecer no meio do código.

Disponibilidade

As propriedades ScreenUpdating, Calculation, EnableEvents e DisplayAlerts do objeto Application estão disponíveis em VBA no Excel para Windows a partir da versão 2007, incluindo 2010, 2013, 2016, 2019, 2021 e Excel 365, e também no Excel para Mac. O Excel Online não executa macros VBA. No Google Sheets, o equivalente mais próximo em Apps Script é reduzir o número de chamadas a getRange/setValue dentro de loops, lendo e escrevendo intervalos inteiros de uma vez em vez de célula por célula — o princípio de reduzir interações repetidas é parecido, mas a sintaxe e as propriedades específicas são diferentes.

Perguntas frequentes

Esqueci de reativar o ScreenUpdating no final da macro, e agora a tela do Excel não atualiza mais. O que fazer?

Vá até o editor VBA (Alt+F11), abra a Janela Imediata (Ctrl+G) e digite Application.ScreenUpdating = True, pressionando Enter. Isso reativa a atualização de tela imediatamente, sem precisar rodar a macro inteira de novo. O mesmo vale para Application.Calculation = xlCalculationAutomatic, caso o cálculo automático também tenha ficado desativado.

Desativar o cálculo automático com Application.Calculation = xlCalculationManual afeta a pasta de trabalho toda ou só a planilha atual?

Afeta a instância inteira do Excel, ou seja, todas as pastas de trabalho abertas no momento, não apenas a planilha ou o arquivo onde a macro está rodando. Por isso é importante sempre restaurar para xlCalculationAutomatic ao final, para não deixar outras planilhas abertas também sem recálculo automático.

Essas otimizações fazem alguma diferença em macros pequenas, com poucas linhas?

Em macros muito pequenas (algumas dezenas de células) a diferença costuma ser imperceptível. O ganho fica visível principalmente em macros que processam centenas ou milhares de linhas, várias planilhas de uma vez, ou pastas de trabalho com muitas fórmulas encadeadas dependendo das células alteradas.

Veja também: Como Trabalhar com Células e Intervalos no VBA do Excel (aquele artigo menciona o ScreenUpdating rapidamente como uma dica dentro de um conteúdo mais amplo sobre Range; este aqui aprofunda todas as configurações de performance, incluindo Calculation, EnableEvents e como restaurá-las com segurança) e Como Tratar Erros no VBA do Excel: On Error e Técnicas de Depuração.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como usar ScreenUpdating, Calculation, EnableEvents e DisplayAlerts para acelerar macros VBA que processam muitas linhas ou planilhas, e como restaurar essas configurações com segurança mesmo se ocorrer um erro, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Suas macros já demoraram mais do que deveriam para processar uma planilha grande? Você já usava alguma dessas configurações de performance antes? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *