2011-04-01 102 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。