SUM()在整个表的动态数字(Sum() Across Dynamic Number of Shee

2019-08-16 19:13发布

您好所有,并感谢您的帮助提前,

我有一个Excel片,其是仅采取多张纸的总和。 最好,最简单地说,该公式是一样的东西=sum(Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1) 有迹象表明,事情虽然复杂化的几个问题。 首先要明确的,我不知道张总结的数量和顺序,也不知道他们的名字。 该公式将被复制到其他〜150个细胞,所以我需要的总和是动态的,而不是每次都物理地增加片材以150〜细胞。 (另外的片材的结构和命名不允许容易拖动为公式。)

所以首先,我想我可以用它写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()需要一个分离器作为第一个参数和所述阵列(一个或多个)作为第二个参数。 然后我追加的字符串末尾的“分隔符”以及输出的东西,如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

这个工作! 真棒,对不对? 一些使用和测试,虽然之后,它似乎并不十分一致。 当我们有其他的表格中打开,它并不总是评估(我们将有其他片打开)。 还有就是我用读其他的一些不一致volatile的UDF,但我无法找到他们。

所以对于我的理想,我想这样做没有任何VBA可言,但我怀疑,这将是不可能的。 我宁愿不依赖于用户手动重新计算工作表(部分为理由volatile )。 最后,我只是希望它sum()所以如果用户打开该文档以一致的方式,只是打打印,用户并不需要确认的功能被正确评估(检查#REF错误或手动添加了值以确保它们是正确的)。 我希望能找到一个替代使用eval()公式。

编辑下面的附加信息

我曾与使用三维阵列实验,但有我遇到了一些问题。 比方说,在工作簿有8片。 那些8片,只有两个可能馈入这个总表。 有一个setup片材时, total片, data entry片,以及data analysis片。 的total片合计断的data analysis表。 典型地, data entry片具有一致data analysis表。 因此,用户可以使双方的拷贝data entrydata analysis表。 片材的最合理的顺序将与开始setup片,然后每个配对data entrydata analysis表,和total片。 很显然,这个设置将不会以3D阵列工作。 我们将不得不重新安排表,并确保用户知道纸张的顺序实际上事项(非典型配置)。 也将有其中一个或两个实例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) 我的感觉是一个三维阵列配置几乎可以做加法动态。 我宁愿有一个明确的列表,则取决于用户正在四处移动片以具有正确的总计有信心。

Answer 1:

这里的另一种方法:

假设按照某种制度必须被严格遵守(例如,“数据项1”,“数据输入2”等),你的用户的数据录入表标记,你可以使用建立一个汇总表INDIRECT -和那么这个总表来代替。

详细地说,你有一个帮手表中的“汇总”表,看起来像这样:

   Col A         Col B    Col C    Col D
1                         C5       X7
2  Sheet name    Exists?  Value 1  Value 2
3  Data entry 1  TRUE          10       20
4  Data entry 2  FALSE          0        0
5  Data entry 3  TRUE          20       30
6  ...
.
.
.
20 More sheet names than you'll ever get just to be sure!
  • 在单元格C1和下面的列,你会写你想总的单元格的地址。 如果你有一个模板,并希望保持引用动态(通常是地址的静态特性是这里虫子的来源),使用=ADDRESS(ROW(Template!C5);COLUMN(Template!C5))以获得动态地址。
  • 在B列中你会使用这个公式: =NOT(ISERROR(INDIRECT(ADDRESS(1,1,,,A3))))
  • 在C列与下面的列,使用: =IF(B3,INDIRECT("'"&A3&"'!"&C$1),0)

现在,你只需要合计列C和等等。



Answer 2:

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

如果使用此公式: =SUM(Sheet1:Sheet3!$A$1:$B$2)中,所有细胞在A1:B2将被相加-对面Sheet 1中所有片材到Sheet!

很多时候,是有帮助的使用两个“帮手”张来处理工作表的开/变化的数字:

  1. 插入两个工作表名为STARTEND
  2. 跨度横跨这两个表的3D公式
  3. 移动所有片材之间或那些片四处移动STARTEND片(当然,这可以在步骤1中进行,太)
  4. 隐藏两个辅助表

看看这个链接进行进一步的说明。



文章来源: Sum() Across Dynamic Number of Sheets