总和()在整个dynamic页数上

大家好,感谢您的帮助提前,

我有一个Excel表格,只是采取多张的总和。 最好也是最简单的,公式就像=sum(Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1) 。 有几个问题使问题复杂化。 首先,我不知道这些表的数量或顺序,也不知道他们的名字。 这个公式将被复制到〜150个其他单元格中,所以我需要总和为dynamic的,而不是每次将单元物理地添加到〜150个单元格。 (同样,表单的configuration和命名不容易拖动公式。)

所以首先,我想我可以使用indirect()引用来编写它。 我列了一个列,列出将被添加到每个单元格中的所有图纸名称。 不幸的是, concatenate()不能用于数组,所以我不得不求助于下面看到的UDF:

 Function CONCAT(Delimiter As Variant, ParamArray CellRanges() As Variant) As String Dim Cell As Range, Area As Variant If IsMissing(Delimiter) Then Delimiter = "" For Each Area In CellRanges If TypeName(Area) = "Range" Then For Each Cell In Area If Len(Cell.Value) Then CONCAT = CONCAT & Delimiter & Cell.Value Next Else CONCAT = CONCAT & Delimiter & Area End If Next CONCAT = Mid(CONCAT, Len(Delimiter) + 1) End Function 

使用UDF,我可以得到一个正确的语法,例如=CONCAT("'!A"&(B1+1)&",'",Array_of_Sheets)&"'!A"&(B1+1)CONCAT()将分隔符作为第一个参数,将数组作为第二个参数。 然后在string的末尾附加“分隔符”以输出诸如Sheet1'!A1,'Sheet2'!A1 。 我认为在这一点上,简单=sum(indirect(STRING))就足够了,但是=sum(indirect("Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1")) indirect()看似不能处理逗号。

所以为了解决这个问题,我把=CONCAT()切换到=CONCAT("'!A"&(B1+1)&"+'",Array_of_Sheets)&"'!A"&(B1+1) Sheet1'!A1+'Sheet2'!A1 。 现在我写了另一个UDF来强制它评估如下:

 Function EVAL(RefCell As String) Application.Volatile EVAL = Evaluate(RefCell) End Function 

这工作! 真棒,对吧? 经过一些使用和testing,似乎不太一致。 当我们打开其他纸张时,并不总是评估(我们将打开其他纸张)。 还有一些其他的不一致,我读了关于在UDF中使用volatile ,但我找不到它们。

所以对于我的理想,我想这样做没有任何VBA,但我怀疑这是不可能的。 我宁愿不依赖用户手动重新计算工作表(部分原因是volatile )。 最后,我只是希望它以一致的方式sum() ,所以如果用户打开文档并打印,用户无需确认函数是否正确计算(检查#REF错误或手动添加值以确保他们是正确的)。 我希望find使用eval()方程的替代方法。

编辑下面的附加信息

我曾尝试过使用3D数组,但遇到了一些问题。 比方说,工作簿有八张。 在这八张纸中,只有两张可以input这张总页。 有一个setup表, total表, data entry表和data analysis表。 data analysis表总计总计。 data entry表通常与data analysis表一致。 因此,用户可以复制data entrydata analysis表。 表单的最合理的顺序将从setup表开始,然后是data entrydata analysis表的每个配对以及total表。 显然,这个设置不适用于3D数组。 我们将不得不重新排列表单,并确保用户知道表单的顺序实际上很重要(非典型configuration)。 也会有一两张data analysis表不包含在total表中的情况。 因此,我们最终可能会得到setup \ data entry (1) \ data entry (2) \ START \ data anaylsis (1) \ data analysis (2) \ END \ totals \ data entry (3) \ data entry (4) \ data anaylsis (3) \ data analysis (4) 。 我的感觉是,3Darraysconfiguration几乎会使添加过于dynamic。 我宁愿有一个明确的清单,然后取决于用户有信心移动表单,以获得适当的总和。

这是另一种方法:

假设用户的数据input表根据某种必须严格遵守的系统进行标记(例如,“数据input1”,“数据input2”等),则可以使用INDIRECT来构build汇总表然后总计这个表。

详细地说,你在“总计”表中有一个帮助表,看起来像这样:

    Col A Col B Col C Col D
 1 C5 X7
 2表名是否存在? 价值1价值2
 3数据input1 TRUE 10 20
 4数据input2 FALSE 0 0
 5数据input3 TRUE 20 30
 6 ...
 。
 。
 。
 20更多的名单比你永远只能确定!
  • 在单元格C1和下面的列中,你会写出你想要的单元格地址。 如果你有一个模板,并希望保持引用dynamic(通常地址的静态性质是一个错误的来源),使用=ADDRESS(ROW(Template!C5);COLUMN(Template!C5))来获得dynamic地址。
  • 在列B中,您将使用以下公式: =NOT(ISERROR(INDIRECT(ADDRESS(1,1,,,A3))))
  • 在列C和后面的列中,使用这个: =IF(B3,INDIRECT("'"&A3&"'!"&C$1),0)

现在你只需要总计C列等等。

好消息! 你可以使你的生活更简单 – 通过使用3D公式:

如果使用以下公式: =SUM(Sheet1:Sheet3!$A$1:$B$2) ,A1:B2中的所有单元格将在Sheet1到Sheet3中的所有图纸上相加​​!

通常,使用两个“帮助”工作表来处理打开/更改的工作表数量是很有帮助的:

  1. 插入两个名为STARTEND的工作表
  2. 在这两张纸上跨越你的3D公式
  3. 移动所有的纸张,或者在这些纸张周围移动STARTEND工作表(当然,这也可以在步骤1中完成)
  4. 隐藏两个帮手表

看看这个链接进一步的指示。