Notifications
Clear all

Calculo Automatico

9 Posts
3 Usuários
0 Reactions
1,948 Visualizações
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

Ola, a um bom tempo nao faço uma pergunta, entao vamos la.

tenho uma planilha gigante e que contem certas abas muitas formulas. Esta planilha possui tb muitos formularios e esta um pouco lenta.

Resumindo, como eu faco para que o Excel faca o calculo automatico somente nas abas ao qual o comando esta relacionado ? ficando assim sem fazer a atualizacao de calculos em toda a planilha ?
Sei que ao executar um comando , pode ser que algumas abas sofram o recalculo, pois estao relacionadas, mas tem abas que sao independentes, portanto nao faz sentido fazer o recalculo.

podem me ajudar ?

Andre

 
Postado : 30/01/2018 4:53 pm
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

Andei pesquisando e encontrei isso:

" Para recalcular manualmente a planilha aberta, além de gráficos e planilhas de gráficos vinculados a essa planilha, na guia Fórmulas, no grupo Cálculo, clique no botão Calcular Folha."
Digamos que eu tenha a Plan1, Plan2, Pla3 e Plan4.
De fato fiz um teste aqui na Plan 1 e na Plan 2, apenas a planilha ativa atualizou ao pressionar Shift+F9. Sendo que a ideia era
Digamos que ao atualizar a Plan2, e caso a plan2 esteja interligada a Plan4, somente essas duas atualizem e as plan2 e Plan3 nao atualizem ? como faria isso em vba ?

Mas como faco pra por este comando dentro do comando VBA para nao ter que usar Shift+F9 ?

Application.Calculation = xlCalculationManual
Seu código...
Application.Calculation = xlCalculationAutomatic

Acima eu faria para habilitar ou desabilitar em toda a planilha, como fazer para habilitar o calculo automatico somente nas planilhas que envolverem os calculos ?

 
Postado : 30/01/2018 5:17 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

.
Tópico correto ... viewforum.php?f=10
.
Além disso faltou o arquivo (ou um exemplo idêntico)!!!!!!!!!!!
.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/01/2018 5:19 pm
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

como fazer esse comando abaixo em VBA?

Recalcula as fórmulas que foram alteradas desde o último cálculo e as fórmulas que dependem desses cálculos, na pasta de trabalho ativa =
Shift+F9

Application.Calculation = xlCalculationManual - esse comando uso numa VBA

 
Postado : 30/01/2018 5:31 pm
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

Pesquisando achei este topico abaixo, e é quase isso que preciso.

https://www.clubedohardware.com.br/foru ... lha-ativa/

Melhor resposta foi essa:

Olá, Renard.

Experimente colocando os dois códigos abaixo no módulo de 'EstaPasta_de_trabalho' .

É o suficiente, não requer outros códigos nem outras variáveis.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Sh.EnableCalculation = True
End SubPrivate

Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Sh.EnableCalculation = False
End Sub

Na verdade eu preciso que atualize todas as planilhas que estiverem envolvidas no calculo, Assim sendo se eu alterar algo na plan1 e a plan2 estiver envolvida entao Plan2 tb é recalculada , porem a Plan3 e Plan4 nao sao recalculadas pois nao tem nada a ver com o evento.

Espero que tenha entendido.

Peco desculpas por abrir esta materia em topico errado, fiz sem querer.

Andre

 
Postado : 30/01/2018 6:01 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Fazerbem,

Estando sua planilha no modo Recálculo Manual, use o método Calculate para atualizar determinados objetos. Este pode agir sobre um Range, sobre uma planilha inteira ou sobre todos as pastas de trabalho abertas (curiosamente o método não está disponível em nível de Workbook, mas de Application, Worksheet e Range).

Exemplos:
Para recalcular somente a Planilha Plan1: ThisWorkbook.Worksheets("Plan1").Calculate
Para recalcular somente a Coluna B da Plan1: ThisWorkbook.Worksheets("Plan1").Columns("B").Calculate

Estando sua planilha no modo Recálculo Manual, se vc quiser marcar alguns intervalos para serem atualizados somente ao final, marque-os primeiro com o método Dirty e quando estiver tudo OK use o método Calculate como indicado acima.
Exemplo:

  With Worksheets("Plan1")
      'blá , blá, blá
     .Range("A1").Dirty
     'blá , blá, blá
     .Range("B5:D8").Dirty
     'blá , blá, blá
     .Calculate
  End With

 
Postado : 30/01/2018 8:26 pm
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

Obrigado por sua explicacao, e fiz aqui, deu quase certo, porem aconteceu o seguinte:

Criei uma Plan 1, Plan2 e Plan3.
Na Plan1 eu apliquei em B3=2, B4=1 e B5= Soma (neste caso 3). Em D3=1, D4=20 e D5=Soma ( neste caso 21)
Na Plan1 e Plan2 coloquei identico acima.
Usei o comando abaixo e de fato atualizou somente a Plan1.

So nao entendi porque B11 em Plan 1 sofreu o Calculo , pois no codigo abaixo eu especifiquei que somente a Range B5 seria atualizada o calculo.
No entanto D5 ficou como eu queria sem atualizar a soma

Sub Retângulo1_Clique()

With Worksheets("Plan1").Columns("B")
.Range("B5").Dirty
.Calculate
End With

End Sub

usei tb assim e nao deu certo, somente percebi que somou tb D5

Sub Retângulo1_Clique()

With Worksheets("Plan1")
.Range("B5").Dirty
.Calculate
End With

End Sub

POrem pra minha felicidade ja me atende plenamente a meu objetivo, so queria mesmo entender o motivo pelo qual B5 e B11 sofreu o calculo, pois especifiquei apenas calculo em B5

 
Postado : 31/01/2018 6:03 am
(@fazerbem)
Posts: 697
Honorable Member
Topic starter
 

Fiz uma modificacao e parece que deu certo, e somente B5.

Sub Retângulo1_Clique()

Range("B5").Formula = "=B3+B4"

'Aqui eu forcei apenas fazer o calculo inteiro da Plan2 e Plan 3 nao somou
'Worksheets("Plan2").Calculate

End Sub

 
Postado : 31/01/2018 6:40 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

So nao entendi porque B11 em Plan 1 sofreu o Calculo

Porque B11 também está na coluna B, e vc pediu um recálculo em toda a coluna B, veja:

With Worksheets("Plan1").Columns("B")
...
.Calculate
End With

...pois no codigo abaixo eu especifiquei que somente a Range B5 seria atualizada o calculo.

.Range("B5").Dirty só diz que esta célula está "suja" (Dirty) e terá que ser atualizada quando houver um recálculo futuro e não que você especificou que só ela seria atualizada.

Para atualizar somente a B5, vc deveria ter usado:

.Range("B5").Calculate

Note que nesse caso não teria sido nem necessário dizer que a célula estava suja, pois você ordenou explicitamente que ela fosse recalculada, então tanto faria se estivesse ou não marcada com Dirty.

No outro código também vc manda recalcular toda a planilha, então é mais abrangente ainda e o .Dirty acaba sendo inútil pois o range está na planilha que vc mandou recalcular.

With Worksheets("Plan1")
.Range("B5").Dirty
.Calculate
End With

Para conhecer um pouco mais sobre recálculo do Excel, veja o artigo no MSDN Recálculo do Excel

 
Postado : 31/01/2018 7:32 am