2012-05-31 87 views
5

我有一個奇怪的問題,Excel計算順序 - 依賴的單元格在設置範圍髒時,先前的單元格在空單元值之前計算。有什麼方法可以檢測到這些「假」電話?當我在真實世界的應用程序中運行一些聰明的業務邏輯時,這對我來說至關重要,而這些「假」的調用會打破所有的邏輯。此外,如果通過RTD註冊,這些「假」呼叫不會正確地將其綁定到主題,因此不會通知主題斷開連接。Excel重新計算順序 - 爲什麼依賴單元格在先前單元格之前計算?

Excel 2010/32bit最新全部。

爲了說明問題,我已經創建簡單函數:

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

和程序:

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

而簡單片:

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

分解成單元格A1,B1,C1。

而且效果明顯:

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

如果我重新計算(CTRL + Alt鍵 + + F9)我得到的,如預期:

$ B $ 1 - $ A $ 1

$ C $ -1 - $ B $ 1

但是,這裏有趣的部分。如果我運行SetDirty:

$ C $ 1 - < ----這是從哪裏來的?

$ B $ 1 - $ A $ 1

$ C $ -1 - $ B $ 1

感謝您的任何輸入。我更喜歡解決這個問題的解決方案,而不是解決方法,因爲它已經是一大堆解決方案的一部分。

+1

本頁:http://www.decisionmodels.com/calcsecretsc.htm,和其他人在同一網站,應該回答你的問題。它的作者也是Satckoverflow上的常規作者。 – jtolle

+0

對我而言,不清楚你在哪些Excel單元格中放置什麼 - 請注意,你可以截圖或者說明你的例子嗎? – brettdj

+0

@brettdj正如我在我的文章中所說:$ A $ 1 = fnc(A1)= fnc(B1)到單元格A1,B1,C1簡單,因爲那個 – Arnas

回答

6

單元格通常會重新計算多次:Excel以重新計算序列開始,該序列是先前的計算序列加上所有已修改單元格的LIFO(後進先出)。 這會導致調用函數並給出未計算的單元格 - 稍後再次調用函數。
可以使用的IsEmpty
檢測未計算的細胞,你的UDF見http://www.decisionmodels.com/calcsecretsj.htm的詳細信息,UDF和檢測未計算細胞
http://www.decisionmodels.com/calcsecretsc.htm爲Excel的計算順序的詳細信息。

順便說一句,Range.Dirty - 它有點錯誤

+0

我正在使用C#,是否足以檢查值爲空,如果單元格HasFormula? – Arnas

+0

我不使用C#(只有VBA,VB6和C++),所以我不能回答這個問題:嘗試一些測試以查看Value是否爲null檢測空單元。爲什麼不只是使用IsEmpty http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.value.aspx –

+0

IsEmpty是VBA函數。 Excel不會從公式中傳遞null。 null只能出現在兩種情況下單元格爲空或未計算公式。糾正我,如果我錯了。 – Arnas

相關問題