2014-10-14 2 views
2

Application.calculatefull을 호출하고 다음 명령문에 중단 점을 넣을 때까지 기다리십시오. 잠시 후 상태 표시 줄에 처리가 나타나지만 이미 다음 코드 행에 도달했습니다.Excel VBA Application.calculatefull

DoEvents 사용을 제안한 사람들과 포럼을 확인했습니다. 내 경우에는 그게 문제 야. 워크 시트는 많은 수식을 가지고 있고 그 중 일부는 첫 번째 실행 후 잘못된 결과를 보여 주지만 수식이 정확하므로 워크 시트의 calculateFull을 호출하면 문제가 해결되지만 기다리지 않습니다.

DOEvents를 사용하면 CalculateFull 워크 시트를 업데이트하지 않습니다.

그래서 수정되었습니다.

프로세서가 application.CalculationFull에서 처리를 완료 할 때까지 기다리는 방법을 알려주십시오. 다음 코드 행으로 이동하십시오.

또한 application.wait도 사용했지만 프로세서를 보유하고있는 것으로 보입니다. 일단 계산을 시작하면 문제가 해결되지 않습니다.


waittime (1000) 
SendKeys "+^%{F9}", True 
Application.CalculateFullRebuild 

이 내가 지금 사용하는 코드입니다. 내가 코드의 다음 줄에 중단 점을 넣었을 때, 나는 application.calculatefullRebuild이 몇 초가 걸리고 다음 줄로 간다. 그리고 나는 현재 activesheet를 확인할 때, 상태 막대에서 계산 (4 개의 프로세서) : xx % 워크 시트 값이 올바른 값으로 변경됩니다.

이것은 제 문제입니다. Application.CalculateFullRebuild이 완료되어 다음 줄로 이동하면 워크 시트 결과가 정확하지 않고 몇 초 후에 프로세서가 상태 표시 줄 메시지를 계산하고 워크 시트가 업데이트됩니다.

어떻게 완료 될 때까지 기다릴 수 있습니까? 그렇지 않으면 나머지 코드가 잘못된 결과를 가져옵니다. 바로 계산을 시작한 후 코드에서 위의 루프를 고집

Do While Application.CalculationState <> xlDone 
    DoEvents 
Loop 

:

+0

당신은 어쩌면 일 또는 뭔가 다른 그래서 우리는 당신이 –

+0

AFAIK를 의미하는 것을 볼 수있는 이미지를 제공 할 수있는,'.CalculateFull'은 매우 확률이 낮다 VBA 같은 단일 스레드 환경 때문에 비동기되지 않은 그 코드 계산을 끝내지 않고 다음 줄로 건너 뜁니다./이상한 이상 –

+0

통합 문서에 비동기 함수가 사용됩니까? 왜 CalculateFull 대신 Calculate를 사용해야합니까? –

답변

1

그래서 나는 질문 here는 당신이 (약간 아래 수정 while 루프에 넣어) 찾고있는 해답을 가지고 있다고 생각합니다 프로세스가 모두 필요합니다.

0

사용자에게 일이 잘못되었는지를 알리기 위해 타이머로 확장 한 Brad과 같은 솔루션을 사용했습니다. Application.Calculate 명령 (또는 CalculateFull)을 트리거하지 않으면 Excel이 DoEvents에 의해 계산되지 않는다는 것을 알게되었습니다.

Const MAXTIME_S = 10 
Dim t As Double 
t = Timer() 

If Application.CalculationState <> xlDone Then Application.Calculate 

Do While Application.CalculationState <> xlDone 
    DoEvents 
    If Timer() - t > MAXTIME_S Then Exit Do 
Loop 

If Application.CalculationState <> xlDone Then 
    MsgBox "Calculation not done. Please restart this Macro.", vbInformation + vbOKOnly, "Aktualisieren" 
    Exit Sub 
End If