2012-11-15 16 views
1

我有一個問題,當我在C#製作一個簡單的UDF與ExcelDna當xlCoerce返回一個值時,它是否再次評估單元格中的公式?

功能使用此:

var reference = XlCall.Excel(XlCall.xlfCaller); 
    string oldValue = ((ExcelReference)reference).GetValue().ToString(); 

它會通過調用造成循環引用錯誤(GetValue試圖重新評估細胞UDF)除非我指定IsMacroType=true,它將函數標記爲第2類(將#添加到公式中)。

我不知道它將如何連接到循環錯誤。但我想ExcelReference.GetValue()有時會評估細胞,有時不會?

看來類2隻影響xlfCaller

後來我檢查的源代碼ExcelReference,事實證明,它實際上是xlCoerce被調用。

此外,我注意到當我在單元格上按F2時,無論單元格是什麼,GetValue()都返回0。當我按Ctrl + Alt + F9強制重新計算全部時,GetValue()返回以前的計算值。

有人能詳細說明我這一點嗎?無論如何,xlCoerce如何在單元值/公式上工作,以及類2如何影響它?

回答

1

xlCoerce只是獲取參考中包含的值的標準方式。就其本身而言,使用ExcelReference進行此調用不應導致單元重新計算。

如果你的函數被註冊爲一個宏表等效函數(在Excel-DNA的聲明中加上IsMacroType=true),那麼它將能夠在計算時讀取工作表上的任何值,包括調用單元的上一個值。在用F2編輯公式的情況下,它不僅僅是重新計算,而是整個重新輸入單元格內容,因此與強制執行重新計算相比,它的行爲有所不同。

它可能不會直接回答你的問題,但查爾斯威廉姆斯在這裏的Excel計算過程有一個很好的寫法:http://www.decisionmodels.com/calcsecretsc.htm

相關問題