Obtendo Excel com os dados de atualização na folha de dentro VBA
Pergunta
Como você recebe os dados da planilha no Excel para recalcular-se a partir de dentro VBA, sem a kluge de apenas mudando um valor de célula?
Solução
As seguintes linhas irá fazer o truque:
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
Editar: O método .Calculate()
não vai funcionar para todas as funções. Eu testei-o em uma folha com add-in funções de matriz. A folha de produção que estou usando é bastante complexa, que eu não quero para testar o método .CalculateFull()
, mas pode funcionar.
Outras dicas
Isso deve fazer o truque ...
'recalculate all open workbooks
Application.Calculate
'recalculate a specific worksheet
Worksheets(1).Calculate
' recalculate a specific range
Worksheets(1).Columns(1).Calculate
Às vezes, o Excel irá soluçar e precisa de um pontapé de saída para reaplicar uma equação. Isso acontece em alguns casos, quando você estiver usando fórmulas personalizadas.
Certifique-se de que você tem o seguinte script
ActiveSheet.EnableCalculation = True
Reaplicar a equação de escolha.
Cells(RowA,ColB).Formula = Cells(RowA,ColB).Formula
Este pode então ser enrolada quando necessário.
Você também pode tentar
Application.CalculateFull
ou
Application.CalculateFullRebuild
Se você não se importa reconstruir todos os livros abertos, em vez de apenas a planilha ativa. (CalculateFullRebuild
reconstrói dependências também.)
Eu tive um problema com desligar uma imagem de fundo (a marca d'água PROJECTO) em VBA. Minha mudança não estava aparecendo (que foi realizada com o método Sheets(1).PageSetup.CenterHeader = ""
) - então eu precisava de uma forma de atualizar. A abordagem ActiveSheet.EnableCalculation
parcialmente fez o truque, mas não abrange as células não utilizadas.
No final, eu encontrei o que precisava com um forro que fez a desaparecer imagem quando já não foi definido: -
Application.ScreenUpdating = True
Depois de uma atualização de conexão de dados, alguns UDF de foram não execução. Usando um sub-rotina, eu estava tentando recalcuate uma única coluna com:
Sheets("mysheet").Columns("D").Calculate
Mas, acima de declaração não teve nenhum efeito. Nenhuma das soluções acima ajudou, exceto kambeeks sugestão para substituir fórmulas trabalhou e foi rápido se recalc Manual ligado durante a actualização. Abaixo código resolveu o meu problema, mesmo que não seja exatamente o responsável por OP "kluge" comentário, ele forneceu uma solução rápida / confiável para força recálculo de células especificado pelo usuário.
Application.Calculation = xlManual
DoEvents
For Each mycell In Sheets("mysheet").Range("D9:D750").Cells
mycell.Formula = mycell.Formula
Next
DoEvents
Application.Calculation = xlAutomatic