2012-06-29 54 views
2

我有幾個公式和數據來自數據庫。我想通過ExcelDna以編程方式刷新所有公式。所有這些公式是ExcelFunctions,我已經把ExcelCommand名稱=「刷新」,我想發佈重新計算Excel表格。 NOW(),SUM()等,它不會調用ExcelDna函數的刷新?Excel Dna - 刷新所有數據源和公式計算

[ExcelCommand(MenuName="Refresh", MenuText="Refresh" )] 
     public static void GetPositionCommand() 
     { 
      XlCall.Excel(XlCall.xlcCalculateNow); 
     } 

在此先感謝...

+0

我正在使用Excel Office 2007 – Ocean

回答

5

xlcCalculateNow只會計算出的Excel知道必須重新計算公式。您可以將Excel函數標記爲「易失性」,以使其表現得像Excel的NOW()函數一樣,每次都會重新計算。使用Excel-DNA,你可以這樣做:

[ExcelFunction(IsVolatile=true)] 
public static string MyVolatileNow() 
{ 
    return DateTime.Now.ToString("HH:mm:ss.fff"); 
} 

,並使用默認的非易失性情況下比較:

[ExcelFunction] 
public static string MyNow() 
{ 
    return DateTime.Now.ToString("HH:mm:ss.fff"); 
} 

另一種方式將數據推到Excel是創建一個RTD服務器,或使用新針對Excel(RxExcel)的反應性擴展支持最新的Excel-DNA簽入。一些信息在這裏 - http://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel

+0

謝謝;這種工作。但我更喜歡跟隨;我使用NonVolatile函數,並用Ctrl + Shift + F9刷新所有ExcelFunction。如果我使它變得不穩定;它按Ctrl + Shift + F9進入無限循環更新..不確定乳清... – Ocean

+0

當標記爲易失性的功能時,每當用戶採取某些操作(如列調整大小)時,都會刷新該功能。是否有可能編程刷新選定的功能(僅當運行自定義命令時)? –

2

我必須按Ctrl + Alt + F9(至少在Excel 2013中)刷新單元格!

2

這工作(至少在Excel 2013):

Excel.Application excelApp = ExcelDnaUtil.Application as Excel.Application; 
excelApp.CalculateFull(); 

Excel.Application excelApp = ExcelDnaUtil.Application as Excel.Application; 
excelApp.CalculateFullRebuild(); 

第一個重新計算所有工作簿(類似於像你按下Ctrl + Alt + F9),第二個類似於重新輸入所有公式。

+0

這對我來說也適用於Excel 2010,IsVolatile = false UDF –

0

嘗試爲ExcelDNA功能的屬性設置IsVolatile=false

[ExcelFunction(Description = "Subscribe to real time data.", IsVolatile = false, Category = UDF_CATEGORY)] 
public static object XSub(  
    string param1) 
{ 
    // Implementation here. 
} 

這個簡單的變化顯着下降的CPU使用率。在我正在處理的一個大電子表格中,CPU使用率從100%下降到了20%(即不斷重新計算,從不追趕)。

使用IsVolatile=true,即使輸入沒有改變,Excel也會定期重新計算函數的輸出值。

對於IsVolatile=false,如果輸入發生變化,Excel將僅重新計算函數的輸出值。

隨着IsVolatile=false,一切都更有效一個數量級,因爲Excel可以跳過大部分時間重新計算電子表格的90%。

話雖如此,一些函數可能需要IsVolatile=true,例如,返回當前時間的函數。