2012-05-31 6 views
5

Ich habe ein komisches Problem mit Excel-Berechnungsreihenfolge - abhängige Zelle wird vor der vorhergehenden Zelle mit leerem Parameterwert berechnet, wenn der Bereich verschmutzt ist. Gibt es eine Möglichkeit, diese "falschen" Anrufe zu erkennen? Es ist kritisch für mich, da ich in der realen Welt eine clevere Geschäftslogik betreibe und diese "falschen" Anrufe alle Logik durchbrechen. Darüber hinaus binden diese "falschen" Aufrufe, wenn sie bei RTD registriert sind, sie nicht korrekt an das Thema und somit nicht an das Trennen des Themas.Excel-Neuberechnungsreihenfolge - warum abhängige Zelle vor der vorhergehenden Zelle berechnet?

Excel 2010/32bit neuesten alle.

Problem zu veranschaulichen, habe ich einfache Funktion erstellt:

Function Fnc(param2 As String) As String 
    Fnc = Application.ThisCell.Address 
    Debug.Print (Application.ThisCell.Address & " - " & param2) 
End Function 

Und Prozedur:

Sub SetDirty() 
    Range("B1:C1").Dirty 
End Sub 

Und einfaches Blatt:

$ A $ 1 = FNC (A1) = FNC (B1)

in Zellen A1, B1, C1.

Und Ergebnis offensichtlich:

$ A $ 1 $ B $ 1 $ C $ 1

Wenn ich neu berechnen (CTRL + Alt + Umschalttaste + F9) Ich werde, wie erwartet :

$ B $ 1 - 1 $

A $

$ C $ 1 - B $ 1 $

Aber hier geht der Spaß Teil. Wenn ich SetDirty:

$ C $ 1 - < ---- Woher kommt das?

$ B $ 1 - 1 $

A $

$ C $ 1 - $ B $ 1

Vielen Dank für jede Eingabe. Ich würde eine Lösung bevorzugen, die dieses Problem löst, nicht eine Problemumgehung, da es bereits Teil einer Reihe von Problemumgehungen ist.

+1

Diese Seite: http://www.decisionmodels.com/calcsecretsc.htm, und andere auf der gleichen Website, sollte Ihre Frage beantworten. Sein Autor ist auch regelmäßig bei Satckoverflow. – jtolle

+0

Es ist mir nicht klar, was Sie in welche Excel-Zellen stecken - cau Sie bitte einen Screenshot oder erläutern Sie Ihr Beispiel? – brettdj

+0

@bretttj wie ich in meinem Beitrag sagte: $ A $ 1 = FNC (A1) = FNC (B1) in die Zellen A1, B1, C1 so einfach wie das – Arnas

Antwort

6

Zellen werden oft mehrmals neu berechnet: Excel beginnt mit einer Neuberechnungssequenz, bei der es sich um die vorherige Berechnungssequenz plus LIFO (last in first out) für alle modifizierten Zellen handelt. Dadurch werden Funktionen aufgerufen und unberechnete Zellen ausgegeben - die Funktionen werden später erneut aufgerufen. mit IsEmpty
Siehe http://www.decisionmodels.com/calcsecretsj.htm Einzelheiten zu UDF und den Nachweis uncalculated Zellen
und http://www.decisionmodels.com/calcsecretsc.htm für Details von Excel Berechnungsfolge
Sie können uncalculated Zellen in Ihrem UDF erkennen.

BTW sei vorsichtig mit Range.Dirty - es ist ein bisschen buggy

+0

Ich benutze C#, ist es genug, um Wert für null zu überprüfen, wenn Zelle HasFormula? – Arnas

+0

Ich verwende nicht C# (nur VBA, VB6 und C++), also kann ich das nicht beantworten: Versuche einige Tests, um zu sehen, ob der Wert Null ist, erkennt leere Zellen. Warum nicht einfach IsEmpty verwenden http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.value.aspx –

+0

IsEmpty ist VBA-Funktion. Excel übergibt niemals null aus der Formel. null kann nur in zwei Fällen sein, Zelle ist leer oder Formel nicht berechnet. korrigiere mich, wenn ich falsch liege. – Arnas

Verwandte Themen