总和()在整个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 entry
和data analysis
表。 表单的最合理的顺序将从setup
表开始,然后是data entry
和data 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中的所有图纸上相加!
通常,使用两个“帮助”工作表来处理打开/更改的工作表数量是很有帮助的:
- 插入两个名为START和END的工作表
- 在这两张纸上跨越你的3D公式
- 移动所有的纸张,或者在这些纸张周围移动START和END工作表(当然,这也可以在步骤1中完成)
- 隐藏两个帮手表
看看这个链接进一步的指示。