Blog

Postado em em 12 de setembro de 2020

Como Acelerar seu código em VBA

Como Acelerar seu código em VBA

Vou te mostrar como acelerar seu código em VBA utilizando algumas dicas e truques bem simples e fáceis de serem implementados!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber a planilha que usamos na aula no seu e-mail, preencha:

Por que deixar seu código mais rápido?

Sempre é bom fazer uma tarefa mais rápido, para usar esse tempo em outra. Acelerando seu código em VBA, você terá mais tempo para fazer outras operações com sua planilha, ou apenas fará tudo mais rápido, simplesmente, e usará seu tempo com outra coisa.

Como acelerar seu código em VBA?

Estamos aqui na nossa décima primeira aula da série compilação de planilhas no VBA. Se você não conferiu as anteriores, não perca! Nesse post abordaremos alguns conteúdos mais superficialmente se comparado à forma que foram abordados nos anteriores, que foram mais explicados.

Vamos mostrar através do código exemplo do post passado. Vamos rodá-lo, e inicialmente marcar seu tempo. Após, fazer algumas modificações no código, que gerarão uma segunda e uma terceira rodadas, que serão marcadas também, para podermos comparar o quão mais rápido ele ficou.

Repare abaixo o código presente no nosso vídeo, que explicaremos em seguida:

Sub percorrer_pasta()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False

Dim pasta As Object
Dim caminho_pasta As String
Dim planilha As Object
Dim tempo As Double
Dim tempo_final As Double
Dim tempo_total As Double

tempo = Timer

caminho_pasta = "C:UsersdamorOneDriveHashtag (1)OnlineConteúdosPlanilhas2020VBA8-01 - Série Compilação com PlanilhasPlanilhas" & ""

Set pasta = CreateObject("Scripting.FileSystemObject").getfolder(caminho_pasta)

For Each arquivo In pasta.Files

    If InStr(arquivo.Name, "Aula") = 0 Then

        primeira_vazia = Range("A1048576").End(xlUp).Row + 1     

        Set planilha = Workbooks.Open(caminho_pasta & arquivo.Name)

        planilha.Close      

        Cells(primeira_vazia, 1).Value = arquivo.Name

    End If

Next

tempo_final = Timer

tempo_total = Round(tempo_final - tempo, 1)

Application.DisplayAlerts = True

MsgBox ("Concluído em " & tempo_total & " segundos")

' 1ª Tentativa: 58,63
' 2ª Tentativa: 43
' 3ª Tentativa: 39,41

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

 

Explicação da sub percorrer_pasta():

Basicamente essa sub irá fazer o que fizemos no último post, com o adendo “setar” a variável planilha a cada arquivo da pasta como objeto da estrutura For Each, de abrir e fechar cada planilha da pasta.

Além disso, temos uma parte inicial de definição de variáveis que irão compor nosso cronômetro (Timer) que irá marcar o tempo que a macro irá rodar, algumas linhas de código novas (três primeiras), e uma função de texto para evitar de abrir arquivos que não queremos.

Ao entrar na estrutura de repetição, queremos, a partir da função InStr buscar a palavra “Aula” no nome do arquivo (arquivo.Name). Se a função não achar (retornar 0), então queremos localizar a primeira linha vazia da nossa planilha, abrir a planilha (arquivo), fechá-la e registrar seu nome na primeira linha vazia da coluna A da nossa planilha. Caso contrário, ou seja, se tiver “Aula” no nome desse arquivo, não faremos nada.

Inicialmente dimensionamos tempo, tempo_final e tempo_total como Double, porque elas representarão números com casas decimais (inteiros), que armazenarão o tempo de funcionamento da macro dado através da função Timer nativa do VBA.

A variável tempo irá armazenar a hora que a macro começou a rodar, e a tempo_total irá armazenar a hora que a macro parou de rodar. Por consequência de como está definida, a tempo_total irá representar a duração da macro.

Ela será mostrada na MsgBox (caixa de mensagem) nas três rodadas que demonstramos no vídeo com tempos respectivos de 58,63 s, 43 s e 39,41 s (como estão escritos os comentários). Lembrando que usamos a função Round para arredondar os segundos mostrados pela msgbox para apenas 1 casa decimal.

As três primeiras linhas do código dizem respeito a ações na aplicação do Excel, que devem ser “desativadas” no começo e ser “ativadas” no final.

O primeiro comando diz respeito à atualização de tela do Excel. Ou seja, desativamos a “piscada” de tela ao realizar ações com trocas de abas ou arquivos, e faz com que o código fique mais fuido.

O segundo diz respeito ao cálculo de fórmulas do Excel. A todo momento, o Excel realiza cálculos em todo o arquivo, que por padrão fica com os cálculos automáticos.

O nosso código força o Excel a ter o cálculo da planilha como manual durante o tempo que a macro roda para fazer com que o Excel não calcule nada, e evite perder tempo com esses cálculos automáticos.

O terceiro diz respeito a desativiar o fato do Excel mostrar caixas de alertas (ex: msgbox, caixa de salvamento pré-fechamento sem salvar). Se não mostrarmos, ou ignorarmos essas caixas, ficaremos com a macro mais fluida também.

Lembrando que iremos desfazer esses comandos ao final da nossa macro. Ou seja, voltaremos à situação padrão para que o Excel volte a operar normalmente.

OBS: O comando de caixas de alertas irá ser ativado novamente antes do comando de Msgbox porque queremos ver a Msgbox que dirá quanto tempo nosso código demorou para rodar.

OBS2: Lembre-se que o caminho da nossa sub será diferente do que está apresentado no arquivo de gabarito. Cada computador tem um caminho de pasta diferente.

Com isso, aprendemos a deixar a macro mais rápida e eficiente, apenas com alguns ajustes. Ao acelerar uma macro, você terá mais tempo para fazer outras operações com sua planilha, ou desenvolver outras atividades. Afinal, poupar tempo é sempre um objetivo de qualquer pessoa no dia-a-dia.

Ficamos por aqui! Fique ligado no nosso blog para mais conteúdo de VBA e no nosso canal do Youtube https://www.youtube.com/c/HashtagTreinamentos para as próximas aulas!

Hashtag Treinamentos

Para acessar outras publicações de VBA, clique aqui!


Quer aprender mais sobre VBA com um Minicurso Gratuito?


Intensivão de Power BI
28/09 a 01/10
100% Online e Gratuito