Página 1 de 1

Aumentando a eficiência das macros

Enviado: 24 Nov 2021 às 20:13
por Sullivan2021
Procurei aqui e não encontrei nada relacionado ao assunto, então, se já tiverem perguntado isso em algum outro post, me desculpem por repetir a pergunta
Recentemente vi algumas formas de otimizar o tempo para rodar uma macro. Numa dessas dicas, vi que quando uma macro é gravada pode aparecer o .Select e isso ocupa muita memória, ainda mais se for executada uma macro que tenha muitos .Select.
Ao analisar uma das macros que eu fiz, reparei que tinham vários .Select, como em:

Range("A1").Select
ActiveCell.FormulaR1C1 = "X"
Range("A2").Select
ActiveCell.FormulaR1C1 = "X"
Range("A3").Select
ActiveCell.FormulaR1C1 = "X"
Range("A4").Select
... e assim vai

Como posso fazer para alterar esse .Select, de forma que o tempo decorrido para executar a macro seja o mais veloz possível? Ainda, vocês sabem também outras formas de reduzir o tempo de execução das macros? Por exemplo, uma que eu sei é usar o Application.ScreenUpdating = False no começo da macro, e no final encerrar com Application.ScreenUpdating = True. Se souberem de mais dicas assim, postem aqui!! Muito obrigado pela atenção!!

Re: Aumentando a eficiência das macros

Enviado: 24 Nov 2021 às 21:27
por osvaldomp
Sullivan2021 escreveu: 24 Nov 2021 às 20:13 ... pode aparecer o .Select e isso ocupa muita memória, ...
O uso de Select raramente é necessário. Ele aparece em macros gravadas porque a gravação somente grava o que é feito pelo usuário, não planeja a elaboração do código e tampouco raciocina.
Esse comando aumenta o tempo de execução da macro, provoca "flicking" na tela, limita o desenvolvimento e "engessa" o código.
É recomendável depois da gravação proceder a uma depuração do código gravado.


Range("A1").Select
ActiveCell.FormulaR1C1 = "X"
Range("A2").Select
ActiveCell.FormulaR1C1 = "X"
Range("A3").Select
ActiveCell.FormulaR1C1 = "X"
Range("A4").Select
... e assim vai
Range("A1:A4).Value="X"
ou
[A1:A4]="X"


Por exemplo, uma que eu sei é usar o Application.ScreenUpdating = False no começo da macro,
Esse comando é útil se a macro executa várias interações com a(s) planilha(s). Por exemplo, para inserir "X" como no caso que eu sugeri acima, a diferença no tempo de execução, com e sem aquele comando, é imperceptível.
Já ao executar um Loop por uma tabela com o fim de excluir linhas, esse comando é importante para reduzir o tempo de execução.
Outro comando que pode reduzir o tempo de execução é passar o recálculo para manual e ao final retornar para automático. Tem enorme diferença se o código faz interações em planilha(s) com grande quantidade de fórmulas ou de UDFs voláteis


... e no final encerrar com Application.ScreenUpdating = True.
Não é necessário, pois tal como DisplayAlerts, o comando ScreenUpdating por padrão retorna para True ao encerrar a execução do código.

Re: Aumentando a eficiência das macros

Enviado: 25 Nov 2021 às 00:13
por Sullivan2021
@osvaldomp , show, coloquei como .Value e ficou muito mais rápido

Nesse caso abaixo, como eu substituo o .Select?

Range("AA2,AA13,AA15,AA18,AA21,AA50,AA54").Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With

Re: Aumentando a eficiência das macros

Enviado: 25 Nov 2021 às 08:32
por osvaldomp
Código: Selecionar todos
 With Range("AA2,AA13,AA15,AA18,AA21,AA50,AA54").Interior
  .Pattern = xlNone
  .TintAndShade = 0
  .PatternTintAndShade = 0
 End With