2016-07-12 36 views
0

選擇具有公式的單元格後,我們可以在Excel公式欄中選擇其公式的一部分並計算它(通過按F9)。我需要通過JavaScript API重新評估子公式。評估公式的子公式

例如,讓我們假設細胞A1B1的值,C1分別123和Cell D1包含公式=A1+B1+C1。我希望能夠快速評估子公式,如A1+B1,B1+C1,並獲得結果35

在VBA中,下manual計算模式,我們可以的D1初始式的子式(例如,=A1+B1)存儲在變量中,然後分配到D1得到結果3,然後還原回初始公式到D1好像什麼都沒有發生;此評估不會提高D1後代的任何其他單元的計算(感謝manual模式)。

但是,使用JavaScript API時,重新計算僅適用於automatic模式。如果我們將一個子公式(例如,=A1+B1)分配給D1D1後代的所有單元格都會被ctx.sync重新計算,這可能很昂貴。

那麼有沒有一種方法或解決方法來優化?

一種可能的解決方法是在工作簿中找到沒有單元依賴的單元格(例如工作表的usedRange之外的單元格,但我們仍然需要確保沒有單元格依賴於該單元格,原因是usedRange ...),然後爲該單元格分配一個子公式並獲取該值。這種方法的缺點是

1)它仍然是一個黑客,並修改工作表的區域。

2)用戶定義的函數(如果編程不好)可能依賴於工作表的尺寸或單元的位置。在這種情況下,評估孤立單元中的用戶定義函數可能會導致原始單元中的評估產生不同的結果(或副作用)。

任何人都可以幫忙嗎?

+0

我很想了解更多關於您正在使用如此多的功能和API功能的這個加載項。如果您想演示或分享您的想法,請通過[email protected]與我聯繫,並提供我的工作電子郵件地址。謝謝! –

+0

感謝您的關注和感謝@MichaelZlatkovsky不斷回答我的問題。我認爲這是一個特權,可以直接與微軟團隊聯繫,並且非常感謝。實際上,我之前已經在OCaml中開發了一個「引擎」,並且一個月後我一直在開發Excel JavaScript加載項作爲「接口」。我已經提交了2個,並且正在開發第三個(所以不是所有的功能都集成在一個插件中)。當我認爲我的加載項是可表達的,我很樂意繼續與你們密切合作(並遠程)... – SoftTimur

回答

0

我認爲你列出的第一種方法可能是最簡單的。也就是說,重寫單元格的公式並將其保存爲一個JavaScript變量(字符串)。接下來修改公式,對該值發出一個負載,然後將公式恢復爲保存字符串。這種方法唯一的缺點就是你搞亂了某人的公式,這意味着如果在步驟1和步驟2之間出現問題,你就會使文檔處於骯髒的狀態。而且,正如你所說的那樣,它可能會對計算產生下游影響(表現方式)。

另外,如果你真的知道有什麼公式,你可以使用「工作表函數」功能。例如,在此計算20 +兩個工作表範圍總和的總和。

Excel.run(function (ctx) { 
    var result = ctx.workbook.functions.sum(
     20, 
     ctx.workbook.worksheets.getItem("Sheet1").getRange("F3:F5"), 
     ctx.workbook.worksheets.getItem("Sheet1").getRange("H3:H5") 
    ).load(); 

    return ctx.sync(); 
}).catch(function(e) { 
    console.log(e); 
}); 

這是「最乾淨」的方式來計算的,因爲它不影響工作狀態,甚至可以連鎖計算:

Excel.run(function (ctx) { 
    var range = ctx.workbook.worksheets.getItem("Sheet1").getRange("E2:H5"); 

    var sumOfTwoLookups = ctx.workbook.functions.sum(
     ctx.workbook.functions.vlookup("Wrench", range, 2, false), 
     ctx.workbook.functions.vlookup("Wrench", range, 3, false) 
     ); 
    sumOfTwoLookups.load(); 

    return ctx.sync(); 
}).catch(function(e) { 
    console.log(e); 
}); 

的缺點是,這將不與UDF一起工作(以及與數組公式有關的事情),以及您需要先驗地知道細胞組成的公式。但是如果你在談論計算公式的子公式,我假設你已經有了關於公式的一些信息,所以後者可能不成問題。

+0

好的,這很有趣,我不知道「工作表函數」。 ..有一點是我沒有找到'-','/'和'+','*'的函數(而不是使用諸如SUM,PRODUCT之類的解決方法)。如果它們不存在,似乎我們必須執行兩次'ctx.sync'才能實現SUM(1,SUM(3,4)-2)',因爲我們不能直接寫'var result = ctx。 workbook.functions.sum(1,ctx.workbook.functions.sum(3,4)-2)'... – SoftTimur

+0

我問[另一個問題](http://stackoverflow.com/questions/38337870/worksheet-function對於這個...... – SoftTimur

+0

對於這個和許多其他場景,真正需要的是相當於VBA Application.Evaluate和Worksheet.Evaluate(最好是少了一些比VBA評估) –