2011-04-01 99 views
2

我正在使用Excel互操作庫獲取工作表並替換工作表中的值。我的表結構如下:Excel互操作和公式範圍

列A-E包含處理列中數據的公式F-L 當我更新工作表時,我清除F-L中的內容並在A-E中保留任何公式。然後我用新數據填寫F-L列。

我需要我的公式列A-E(任何行)來擴展到我輸入的新數據的全部範圍。

例如=sum(G1,G8)應該變成=sum(G1,G20)如果我將數據從8擴展到20行。有沒有辦法在工作表中找到所有當前的公式?如何擴展公式的範圍?

回答

4

我假設你將從8行輸入的數據量擴展到20個編程 - 所以,當你輸入這個數據的時候,你要輸入每個單元格的數量,然後在最後,你可以這樣做:

yourWorkSheet.Cells[rowCount, column].Formula = string.Format("=SUM(G1:G{0})", rowCount); 

我希望我有你問的是什麼,讓我知道如果我錯過了一些點,我會修改。

+1

看起來你可能會在格式末尾丟失一個')'。 '「= SUM(G1,G {0})」' – SwDevMan81 2011-04-01 10:58:40

+0

@ SwDevMan81不錯的地方。修訂。 – SeeSharp 2011-04-01 11:01:11

+0

這就是我的想法 - 但我希望有一個更簡單的方法,因爲他們真的可以有任何公式(儘管他們必須從1行到最大)。我會使用這種方法,然後我猜是正則表達式? – Bob 2011-04-01 11:06:29

0

有關操作Excel對象模式的信息,我建議首先查找VBA解決方案,然後將其轉換爲C#(這很簡單)。網絡上有更多的VBA資源可供使用,有時甚至可以通過錄制VBA宏來幫助自己。

根據你公式的確切位置,你可以通過插入行來實現你想要的。

E.g.如果您有一個公式,例如A3引用範圍G1:G8,並且您現在要插入20行數據而不是8行,那麼可以在寫入數據之前將第8行向下移動20-8 = 12次,如下所示。

Dim rng As Range 
Dim nIndex As Long 
Set rng = Rows("8:8") 
For nIndex = 1 To 20 - 8 
    rng.Insert Shift:=xlDown 
Next nIndex 

當您這樣做時,A3中的公式將自動修改爲包含插入的行。

請注意,通過Interop執行此操作對於大量行(對於插入的每行,從您的應用程序到Excel進程的往返行程)不會特別有效。提高性能的一種方法是一次插入多行。

+0

這看起來好像只是將範圍向下移動。我需要修改任何公式的範圍,而不僅僅是一個簡單的範圍G1:G20。我希望有總和(G1:G20)或最大(G1:G20)或連接(G1:G20)等等。 – Bob 2011-04-01 11:58:26

0

您可能需要解析的對象範圍...

(((Excel.Range))yourWorkSheet.Cells[rowCount, column]).Formula = string.Format("=SUM(G1,G{0})", rowCount); 
0

我也有類似的問題,但與IF公式。將其設置爲「公式」屬性不起作用。但是,如果設置爲FormulaLocal同一作品...

感謝微軟:)

BTW:公式和FormulaLocal將只能用於A1 reference style。對於R1C1,您應該使用FormulaR1C1和FormulaR1C1Local。