Muitas pessoas que utilizam o VBA para resolver os seus problemas no dia a dia, sequer imaginam que a linguagem VBA é a mesma utilizada no VB 6.0.
Essa dica a seguir serve para aqueles que corajosamente começaram criando uma macro aqui e outra ali e com o tempo interessaram-se pelo VBA, e hoje criam soluções prá lá e prá cá.
Application.ScreenUpdating & Application.Calculation
O modo como estes dois trabalham juntos encorajaram muitos desenvolvedores VBA para o MS Excel a desligá-los, enquanto seu código executa salvando um monte de tempo e desperdício de ciclos de processamento. E a melhoria é realmente significativa. Há aplicações que chegam a ficar 100 vezes mais rápido (por exemplo: Certo processo levava vários minutos antes da customização, após a otimização leva apenas par de segundos).
A configuração do cálculo é vital embora um erro grave tenha sido relatado depois que alguém, inadvertidamente desabilitou os cálculos dos números manualmente, não percebendo a necessidade de reativá-los quando a aplicação fazia cálculos.
Application.Calculation
Por padrão o MS Excel está definido para o cálculo automático. Para isso o MS Excel usa o seu motor inteligente - apenas calcula as células que foram alteradas, ou tenham sido afetadas por mudanças desde o último cálculo. Isso é ótimo, mas é importante ter em mente as coisas que fazem o MS Excel recalcular:
- Inserir / editar ou apagar um valor na célula
- Pressionar F9 para acionar um cálculo manual
- Inserir ou excluir linhas ou colunas
- ocultar ou reexibir linhas ou colunas
- fixação ou remoção de dados de filtragem
- e alguns outros.
Application.Screenupdating
O padrão do MS Excel mantém a visão da tela atualizada para refletir quaisquer alterações. Isso é uma coisa boa, caso contrário, não veríamos os efeitos quando editássemos uma planilha. A grosso modo a atualização da tela acontece sempre que um calcule ocorre. E isso às vezes pode ser uma chatice no desempenho, especialmente se houver gráficos complexos ou gráficos para redesenhar.
Aqui está um código que ajudará a tornar as suas aplicações muito mais rápidas:
Option ExplicitOption Private ModulePrivate mlCalcStatus As LongPrivate mbInSpeed As BooleanPublic Sub speed()On Error Resume NextIf Not mbInSpeed ThenLet Application.ScreenUpdating = FalseLet Application.DisplayAlerts = FalseLet Application.EnableEvents = FalseLet mlCalcStatus = Application.CalculationLet Application.Calculation = xlCalculationManualLet mbInSpeed = TrueElse'we are already in speed - don't do the settings againEnd IfEnd SubPublic Sub unspeed()On Error Resume NextLet Application.ScreenUpdating = TrueLet Application.DisplayAlerts = TrueLet Application.EnableEvents = TrueIf mbInSpeed ThenLet Application.Calculation = mlCalcStatusElse'this shouldn't be happening - put calc to auto - safest modeLet Application.Calculation = xlCalculationAutomaticEnd IfLet mbInSpeed = FalseEnd Sub
Use mais ou menos assim nas suas aplicações:
Public Sub mnu_ListFormulaLinks()On Error GoTo err_hIf Not ActiveWorkbook Is Nothing Thenspeed'do your stuffElseMsgBox "Please open the workbook you wish to analyse", vbExclamation, gc_MsgBoxTitleEnd Ifexit_proc:unspeedExit Suberr_h:MsgBox "Error " & Err.NumberResume exit_procEnd Sub
Reference: Codematic.net
Tags: VBA, Excel, performance,