Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por Sullivan2021
Posts
#68039
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!!
Por osvaldomp
#68042
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.
Sullivan2021 agradeceu por isso
#68047
@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
Por osvaldomp
#68050
Código: Selecionar todos
 With Range("AA2,AA13,AA15,AA18,AA21,AA50,AA54").Interior
  .Pattern = xlNone
  .TintAndShade = 0
  .PatternTintAndShade = 0
 End With
Sullivan2021 agradeceu por isso
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord