3

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

我有一个 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()似乎无法处理逗号,所以不起作用。

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

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

这行得通!太棒了,对吧?但是经过一些使用和测试,它似乎不太一致。当我们打开其他工作表时,它并不总是评估(我们将打开其他工作表)。我读到了volatile在 UDF 中使用的一些其他不一致之处,但我找不到它们。

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

编辑以下附加信息

我曾尝试使用 3D 数组,但遇到了一些问题。假设工作簿有八张纸。在这八张纸中,只有两张可以输入到这张总纸中。有setup片材、total片材、data entry片材、data analysis片材。工作表total总计关闭工作data analysis表。通常,一张data entry纸与一张纸重合data analysisdata entry因此,用户可以制作表格和data analysis表格的副本。最合乎逻辑的工作表顺序将从工作表开始,然后是和工作表setup的每一对,以及data entrydata analysistotal床单。显然,此设置不适用于 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)。我的感觉是 3D 阵列配置几乎会使添加过于动态。我宁愿有一个明确的列表,然后依赖于用户有信心移动工作表以获得正确的总数。

4

2 回答 2

14

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

如果您使用这个公式:=SUM(Sheet1:Sheet3!$A$1:$B$2),A1:B2 中的所有单元格将被求和 - 从 Sheet1 到 Sheet3 的所有工作表!

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

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

查看此链接以获取更多说明。

于 2013-02-05T21:49:15.387 回答
2

这是另一种方法:

假设您的用户的数据输入表根据某种必须严格遵守的系统进行标记(例如“数据输入 1”、“数据输入 2”等),您可以使用INDIRECT- 构建一个汇总表,然后而是总计此表。

详细地说,您的“总计”表中有一个辅助表,看起来像这样:

   Col A Col B Col C Col D
1个C5 X7
2 工作表名称存在吗?价值 1 价值 2
3 数据输入 1 真 10 20
4 数据输入 2 FALSE 0 0
5 数据输入 3 真 20 30
6 ...
.
.
.
20 多个工作表名称比你永远得到的要确定!
  • 在单元格 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 等等。

于 2013-02-06T00:00:03.000 回答