10 maneiras de acelerar suas macros

À medida que suas macros do Excel se tornam cada vez mais robustas e complexas, você pode descobrir que elas perdem desempenho. Ao discutir macros, a palavra desempenho geralmente é sinônimo de velocidade . Velocidade é a rapidez com que seus procedimentos VBA executam as tarefas pretendidas. A seguir estão dez maneiras de ajudar a manter as macros do Excel em execução em seu nível de desempenho ideal.

Parando cálculos de folha

Você sabia que cada vez que uma célula que afeta qualquer fórmula em sua planilha é alterada ou manipulada, o Excel recalcula a planilha inteira? Em planilhas que possuem uma grande quantidade de fórmulas, esse comportamento pode tornar drasticamente as macros mais lentas.

Você pode usar a propriedade Application.Calculation para informar ao Excel para alternar para o modo de cálculo manual. Quando uma pasta de trabalho está no modo de cálculo manual, ela não será recalculada até que você acione explicitamente um cálculo pressionando a tecla F9.

Coloque o Excel no modo de cálculo manual, execute seu código e, em seguida, volte ao modo de cálculo automático.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
 'Coloque seu código de macro aqui
Application.Calculation = xlCalculationAutomatic
End Sub

Definir o modo de cálculo de volta para xlCalculationAutomatic acionará automaticamente um recálculo da planilha, portanto, não há necessidade de pressionar a tecla F9 após a execução da macro.

Desativando a atualização da tela da planilha

Você pode notar que, quando suas macros são executadas, sua tela pisca bastante. Essa cintilação é o Excel tentando redesenhar a tela para mostrar o estado atual da planilha. Infelizmente, cada vez que o Excel redesenha a tela, ele consome recursos de memória.

Você pode usar a propriedade Application.ScreenUpdating para desativar as atualizações de tela até que a macro seja concluída. Desativar a atualização da tela economiza tempo e recursos, permitindo que sua macro seja executada um pouco mais rápido. Após o término da execução do código de macro, você pode ativar a atualização da tela novamente.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 'Coloque seu código de macro aqui
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Depois de definir a propriedade ScreenUpdating de volta para True, o Excel irá automaticamente disparar um redesenho da tela.

Desativando as atualizações da barra de status

A barra de status do Excel, que aparece na parte inferior da janela do Excel, normalmente exibe o andamento de certas ações no Excel. Se sua macro estiver trabalhando com muitos dados, a barra de status ocupará alguns recursos.

É importante observar que desligar a atualização da tela é diferente de desligar a exibição da barra de status. A barra de status continuará a ser atualizada, mesmo se você desativar a atualização da tela. Você pode usar a propriedade Application.DisplayStatusBar para desativar temporariamente quaisquer atualizações da barra de status, melhorando ainda mais o desempenho de sua macro:

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'Coloque seu código de macro aqui
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
End Sub

Dizendo ao Excel para ignorar eventos

Você pode implementar macros como procedimentos de evento, informando ao Excel para executar determinado código quando uma planilha ou pasta de trabalho for alterada.

Às vezes, as macros padrão fazem alterações que irão disparar um procedimento de evento. Por exemplo, se você tiver uma macro padrão que manipula várias células na Planilha1, cada vez que uma célula nessa planilha for alterada, sua macro deverá pausar enquanto o evento Worksheet_Change é executado.

Você pode adicionar outro nível de aumento de desempenho usando a propriedade EnableEvents para dizer ao Excel para ignorar eventos enquanto sua macro é executada.

Defina a propriedade EnableEvents como False antes de executar sua macro. Após a conclusão da execução do código de macro, você pode definir a propriedade EnableEvents de volta para True.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Coloque seu código de macro aqui
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub

Ocultando quebras de página

Cada vez que sua macro modifica o número de linhas, modifica o número de colunas ou altera a configuração da página de uma planilha, o Excel é forçado a levar algum tempo para recalcular as quebras de página mostradas na planilha.

Você pode evitar esse comportamento simplesmente ocultando as quebras de página antes de iniciar sua macro.

Defina a propriedade de folha DisplayPageBreaks como False para ocultar quebras de página. Se você deseja continuar a mostrar quebras de página após a execução da macro, defina a propriedade de folha DisplayPageBreaks de volta para True.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Coloque seu código de macro aqui
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
End Sub

Suspendendo atualizações da tabela dinâmica

Se sua macro manipula tabelas dinâmicas que contêm grandes fontes de dados, você pode ter um desempenho ruim ao fazer coisas como adicionar ou mover campos dinamicamente.

Você pode melhorar o desempenho de sua macro suspendendo o recálculo da tabela dinâmica até que todas as alterações do campo dinâmico tenham sido feitas. Basta definir a propriedade PivotTable.ManualUpdate como True para adiar o recálculo, executar seu código de macro e, em seguida, definir a propriedade PivotTable.ManualUpdate novamente como False para acionar o recálculo.

Sub Macro1 ()
ActiveSheet.PivotTables ("PivotTable1"). ManualUpdate = True
 'Coloque seu código de macro aqui
ActiveSheet.PivotTables ("PivotTable1"). ManualUpdate = False
End Sub

Evitando copiar e colar

É importante lembrar que, embora o Macro Recorder economize tempo escrevendo código VBA para você, ele nem sempre escreve o código mais eficiente. Um exemplo importante é como o Macro Recorder captura qualquer ação de copiar e colar que você executa durante a gravação.

You can give your macros a slight boost by cutting out the middleman and performing a direct copy from one cell to a destination cell. This alternate code uses the Destination argument to bypass the clipboard and copy the contents of cell A1 directly to cell B1.

Range("A1").Copy Destination:=Range("B1")

If you need to copy only values (not formatting or formulas), you can improve performance even more by avoiding the Copy method all together. Simply set the value of the destination cell to the same value found in the source cell. This method is about approximately 25 times faster than using the Copy method:

Range("B1").Value = Range("A1").Value

Se precisar copiar apenas fórmulas de uma célula para outra (não valores ou formatação), você pode definir a fórmula da célula de destino para a mesma fórmula contida na célula de origem:

Intervalo ("B1"). Fórmula = Intervalo ("A1"). Fórmula

Usando a declaração With

Ao gravar macros, você geralmente manipulará o mesmo objeto mais de uma vez. Você pode economizar tempo e melhorar o desempenho usando a instrução With para executar várias ações em um determinado objeto de uma só vez.

A instrução With utilizada no exemplo a seguir diz ao Excel para aplicar todas as alterações de formatação de uma vez:

    Com intervalo ("A1"). Fonte
    .Bold = True
    .Italic = True
    .Underline = xlUnderlineStyleSingle
    Terminar com

Adquirir o hábito de agrupar ações em instruções With não apenas manterá suas macros rodando mais rapidamente, mas também tornará mais fácil ler seu código de macro.

Evitando o método Select

Macro Recorder gosta de usar o método Select para selecionar explicitamente objetos antes de executar ações sobre eles. Geralmente, não há necessidade de selecionar objetos antes de trabalhar com eles. Na verdade, você pode melhorar drasticamente o desempenho da macro não usando o método Select.

Depois de gravar suas macros, crie o hábito de alterar o código gerado para remover os métodos Select. Nesse caso, o código otimizado seria parecido com o seguinte:

    Folhas ("Folha1"). Intervalo ("A1"). FormulaR1C1 = "1000"
    Folhas ("Folha2"). Intervalo ("A1"). FormulaR1C1 = "1000"
    Folhas ("Folha3"). Intervalo ("A1"). FormulaR1C1 = "1000"

Observe que nada está sendo selecionado. O código simplesmente usa a hierarquia de objetos para aplicar as ações necessárias.

Limitando viagens para a planilha

Outra maneira de acelerar suas macros é limitar a quantidade de vezes que você faz referência aos dados da planilha em seu código. É sempre menos eficiente obter dados da planilha do que da memória. Ou seja, suas macros serão executadas com muito mais rapidez se não precisarem interagir repetidamente com a planilha.

Por exemplo, o código simples a seguir força o VBA a retornar continuamente às Planilhas ("Planilha1"). Intervalo ("A1") para obter o número necessário para a comparação realizada na instrução If:

Para ReportMonth = 1 a 12
     If Range ("A1"). Value = ReportMonth Then
     MsgBox 1000000 / ReportMonth
Fim se
Próximo ReportMonth

Um método muito mais eficiente é salvar o valor em Planilhas (“Planilha1”). Intervalo (“A1”) para uma variável chamada MeuMês. Dessa forma, o código faz referência à variável MyMonth em vez da planilha:

Dim MyMonth as Integer
MyMonth = Range ("A1"). Valor
Para ReportMonth = 1 a 12
If MyMonth = ReportMonth Then
MsgBox 1000000 / ReportMonth
Fim se
Próximo ReportMonth

Considere aproveitar variáveis ​​para trabalhar com dados na memória em vez de fazer referência direta a planilhas.

Evite referências excessivas

Ao chamar um método ou propriedade de um objeto, ele precisa passar pela interface IDispatch do componente OLE. As chamadas para esses componentes OLE demoram, portanto, reduzir o número de referências a componentes OLE pode melhorar a velocidade do código de macro.

Para a invocação de propriedades ou métodos de objetos, geralmente é utilizado o método de representação de  Object.Method  , ou seja, o "." símbolo é usado para invocar propriedades e métodos.

Portanto, o número de chamadas de métodos ou propriedades pode ser avaliado de acordo com o número de símbolos ".". Quanto menos "." símbolo, mais rápido o código será executado.

Por exemplo, a instrução a seguir inclui 3 símbolos ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

A instrução a seguir possui apenas um símbolo ".".

Activewindow.Top = 100

Aqui estão alguns truques para reduzir o número de símbolos "." para correr mais rápido.

Primeiro, quando você precisar se referir ao mesmo objeto repetidamente, poderá definir o objeto como uma variável para reduzir o número de chamadas. Por exemplo, o código a seguir requer duas chamadas por linha.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Como o  objeto Sheets("Sheet1")  precisa ser referenciado repetidamente, ele pode ser definido como uma variável  sht  primeiro, de modo que cada código precise ser chamado apenas uma vez.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

Segundo, se você não quiser declarar uma variável temporária sht, você também pode usar a  instrução With  mencionada anteriormente. Conforme mostrado no exemplo a seguir:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

Terceiro,  quando houver muitos loops, tente manter propriedades e métodos fora do loop.  Ao reutilizar um valor de propriedade do mesmo objeto em um loop, você pode primeiro atribuir o valor da propriedade a uma variável especificada fora do loop e, em seguida, usar a variável no loop, o que pode atingir uma velocidade mais rápida. Conforme mostrado no exemplo a seguir:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Cada loop neste exemplo obtém a propriedade Value da célula Cells(1,2). Se você atribuir a propriedade Value de Cells(1.2) a uma variável antes do início do loop, você obterá uma execução mais rápida. Conforme mostrado no exemplo a seguir:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

O código acima chama  ThisWorkbook.Sheets("Sheet1")  sempre que faz um loop. Você pode fazer isso mais rapidamente usando a  instrução With  para mover a chamada para  ThisWorkbook.Sheets("Sheet1")  fora do loop. Conforme mostrado no exemplo a seguir:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Evite usar tipos de variantes

Iniciantes geralmente preferem usar variáveis ​​do tipo Variant, o que tem a vantagem de ser menos complicado porque qualquer tipo de dado pode ser usado sem o problema de estouro de memória se os dados forem muito grandes para os tipos de dados Integer ou Long. No entanto, os dados do tipo Varienmt requerem mais espaço de memória extra do que os outros tipos especificados (2 bytes para dados inteiros, 4 bytes para dados longos e 16 bytes para dados variantes), o VBA requer mais tempo para processar dados do tipo variante do que outros tipos especificados De dados. Como mostra o exemplo a seguir.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

No código acima, as linhas 8 a 13 fazem 1 milhão de operações de adição, subtração, multiplicação e divisão de variáveis ​​variantes, e as linhas 17 a 22 fazem 1 milhão de operações de adição, subtração, multiplicação e divisão de variáveis ​​inteiras. No meu computador, a operação da variável Variant demorou cerca de  0,09375  segundos, enquanto a operação da variável Integer demorou cerca de  0,03125  segundos. Os resultados podem variar de computador para computador, mas  as variáveis ​​Variant são significativamente mais lentas que as variáveis ​​Integer .

Por esse motivo,  é recomendável evitar o uso de variáveis ​​Variant quando você puder usar explicitamente o tipo de dados especificado .


Smartsheet 9.1.1

Smartsheet 9.1.1

Smartsheet é uma plataforma de trabalho dinâmica que permite gerenciar projetos, criar fluxos de trabalho e colaborar com sua equipe.

SharePoint

SharePoint

SharePoint é um sistema de colaboração baseado na web que usa uma variedade de aplicativos de fluxo de trabalho, bancos de dados de “lista” e outros componentes da web, bem como recursos de segurança para dar controle ao trabalho conjunto de grupos empresariais.

Calendário Perpétuo 1.0.38/1.0.36

Calendário Perpétuo 1.0.38/1.0.36

Van Nien Calendar é um aplicativo de visualização de calendário em seu telefone, ajudando você a ver rapidamente a data lunisolar em seu telefone, organizando assim seu trabalho importante.

Microsoft Outlook 2021

Microsoft Outlook 2021

O Microsoft Outlook é um aplicativo comercial e de produtividade desenvolvido pela Microsoft Corporation.

Clique para cima

Clique para cima

ClickUp é uma das plataformas de produtividade mais bem avaliadas para qualquer empresa. Grandes empresas como Google, Booking.com, San Diego Padres e Uber usam ClickUp para aumentar a produtividade no local de trabalho.

Visualizador PDF-XChange 2.5.322.10

Visualizador PDF-XChange 2.5.322.10

PDF se tornou um formato comumente usado para leitura, criação e envio de documentos de texto. Por sua vez, tem havido um aumento no número de programas utilizados para este tipo de documentação. PDF-XChange Viewer está entre um número crescente de visualizadores de PDF.

Apache Open Office

Apache Open Office

Apache OpenOffice oferece um conjunto completo de aplicativos Office que rivalizam com o Microsoft 365, especialmente em Excel, PowerPoint e Word. Ele permite que você gerencie seus projetos de forma mais eficaz e suporta diversos formatos de arquivo.

Baixar iTaxviewer 1.8.7

Baixar iTaxviewer 1.8.7

O software iTaxViewer é o software de leitura de arquivos XML mais popular atualmente. Este software é uma aplicação para leitura de declarações fiscais eletrónicas em formato XML da Direção Geral de Impostos.

Leitor de PDF Nitro

Leitor de PDF Nitro

Nitro PDF Reader é um prático editor de PDF que cobre todas as tarefas básicas que a maioria das pessoas realiza todos os dias com documentos PDF.

Leitor Foxit 12

Leitor Foxit 12

Foxit Reader é principalmente um leitor de PDF e também permite criar arquivos PDF, assiná-los, editá-los e adicionar anotações. Funciona em sistemas operacionais, existem plugins para diversos programas do pacote Microsoft Office.