Warten auf Berechnung

Hallo zusammen,

ich benutze einen Event „onChange“ um die Berechnung der mappe neu zu starten und dann ein Pivot zu aktualisieren. Dazu nutze ich folgenden Code:

Public Sub refreshAllData()
   
        Dim newHour
        Dim newMinute
        Dim newSecond
        Dim waitTime
       
        Calculate
           
        If Application.StatusBar = „FALSE“ Then
            newHour = Hour(Now())
            newMinute = Minute(Now())
            newSecond = Second(Now()) + 2
            waitTime = TimeSerial(newHour, newMinute, newSecond)
            Application.wait waitTime
        End If
       
        Application.StatusBar = False
        ActiveSheet.PivotTables(„auswertung“).PivotCache.Refresh
       
End Sub

Leider wird die Schleife immer benutzt. Dann ist zwar alles ok, aber es soll ja nur bei Bedarf gewartet werden.

Bei meinen Test war Application.StatusBar = „FALSE“ immer true. Also ab in die Schleife!

Also zwei Fragen:
Wartet das Pivot nicht auf die Berechnung?
Wie stelle ich fest, dass die Berechnung fertig ist?

Danke schon mal an alle!

fg

Dirk.P

Hallo zusammen,

hallo Dirk,

ich benutze einen Event „onChange“ um die Berechnung der mappe
neu zu starten und dann ein Pivot zu aktualisieren. Dazu nutze
ich folgenden Code:

Public Sub refreshAllData()

        Dim newHour
        Dim newMinute
        Dim newSecond
        Dim waitTime

        Calculate

Hier sehe ich ein Problem: Die Kommandos in VBA laufen ja nicht asynchron, d.h., das Calculate wird erst fertig abgearbeitet, bis der Code weiterläuft. Du wirst also nie eine Meldung kriegen, das noch eine Berechnung läuft.

        If Application.StatusBar = „FALSE“ Then

Hier hast du glaube ich einen Denkfehler: „FALSE“ ist eine Text und etwas anderes als die Konstante False. Mich wundert, dass deine Schleife immer durchlaufen wird. Der Text „FALSE“ wird doch nie in die Statusbar geschrieben, oder?

            newHour = Hour(Now())
            newMinute = Minute(Now())
            newSecond = Second(Now()) + 2
            waitTime = TimeSerial(newHour, newMinute,
newSecond)
            Application.wait waitTime
        End If

        Application.StatusBar = False

ActiveSheet.PivotTables(„auswertung“).PivotCache.Refresh

End Sub

Leider wird die Schleife immer benutzt. Dann ist zwar alles
ok, aber es soll ja nur bei Bedarf gewartet werden.

Bei meinen Test war Application.StatusBar = „FALSE“ immer
true. Also ab in die Schleife!

Also zwei Fragen:
Wartet das Pivot nicht auf die Berechnung?

Mit Pivot kenne ich mich leider nicht aus.

Wie stelle ich fest, dass die Berechnung fertig ist?

Ich würde so etwas versuchen:

While Application.CalculationState xlDone
 DoEvents
Wend
MsgBox "fertig"

Aber vermutlich wird das nur funktionieren, wenn du die Berechnung außerhalb von VBA anstößt und dann den Code startest.
Ich habe es mal mit einer großen Tabelle probiert: Sie ist so aufgebaut, dass alle Zellen neu berechnet werden müssen, wenn ich A1 ändere. Dann A1 von Hand geändert und sofort den Code gestartet. Die Meldung kommt dann erst, wenn du Berechnungen fertig sind. Aber wie gesagt: Die Berechnungen müssen von Hand ausgelöst werden.
Wie das per Code gehen soll, weiß ich noch nicht

Danke schon mal an alle!

fg

Dirk.P

Gruß, Andreas

Hallo Andreas,

vielen Dank für die Antwort!

Hier sehe ich ein Problem: Die Kommandos in VBA laufen ja
nicht asynchron, d.h., das Calculate wird erst fertig
abgearbeitet, bis der Code weiterläuft. Du wirst also nie eine
Meldung kriegen, das noch eine Berechnung läuft.

Das sehe ich auch so. Daher ja das Problem…

        If Application.StatusBar = „FALSE“ Then

Hier hast du glaube ich einen Denkfehler: „FALSE“ ist eine
Text und etwas anderes als die Konstante False. Mich wundert,
dass deine Schleife immer durchlaufen wird. Der Text „FALSE“
wird doch nie in die Statusbar geschrieben, oder?

Hatte das im I-net gefunden und was gefummelt. Es gibt das posts, das so auch ein Kommentar gesetzt werden kann. Sehr merkwürdig… Ich dachte, das irgendwann EXCEL wieder „Bereit“ da hin schreibt, also es ist fertig.

While Application.CalculationState xlDone
DoEvents
Wend

Werde ich mal testen. CalculationState hatte ich gesehen, allerdings habe ich das nichts hinbekommen.

fg

Dirk.P