【问题标题】:How can you sum the same cell across multiple worksheets by worksheet index number in excel?如何通过 Excel 中的工作表索引号将多个工作表中的相同单元格相加?
【发布时间】:2020-04-24 08:57:36
【问题描述】:

我正在尝试对我的 Excel 工作簿中所有有效工作表中的单元格 Y116 求和。为了帮助定义有效的工作表,我编写了一个 VBA 函数 SHEETNAME(number),它返回给定工作表索引(数字)处的工作表名称。我这样做是因为有效工作表的名称和数量永远不会保持不变,但是有效范围将始终从第三个工作表(即 SHEETNAME(3))开始,并将始终在最后一个工作表的第三个结束(即 SHEETNAME(SHEETS( )-2)) 在我的工作簿中。

我觉得 SUM() 和 INDIRECT() 都应该相对简单,但我不断收到引用错误 (#REF!)。

我可以使用

将字符串格式化为我想要的格式
="'"&SHEETNAME(3)&":"&SHEETNAME(SHEETS()-2)&"'!Y116"

但是当我尝试将它们放在一起时出现参考错误:

=SUM(INDIRECT("'"&SHEETNAME(3)&":"&SHEETNAME(SHEETS()-2)&"'!Y116"))

我知道单元格 Y116 是我所有工作表中的有效参考,因为我可以使用工作表的实际名称而不是索引对公式进行硬编码,我得到了我正在寻找的答案。有什么建议吗?

这里是 SHEETNAME() 函数: Function SHEETNAME(number As Long) As String
SHEETNAME = Sheets(number).Name End Function

【问题讨论】:

  • @JNevill 您可以通过这种方式进行 3d 求和。 =SUM('Sheet1:Sheet3'!Y116) 会做到这一点。 OP,请分享 UDF SHEETNAME() 以便我们进行测试。
  • D*@# IT。在我职业生涯的几十年里,我怎么会发现这些事情。我需要 RTFM。谢谢@ScottCraner!
  • 就我个人而言,我只会编写一个带有三个参数的 UDF。第一个工作表编号,结束工作表编号和单元格地址,然后只需迭代工作表并对单元格求和。跳过整个尝试做部分 udf 部分原生公式。

标签: excel excel-formula sum excel-indirect


【解决方案1】:

要使用 SUM(INDIRECT()) 执行您想要的操作,on 需要将工作表名称数组返回给间接。

为此,需要将 UDF 更改为:

Function SHEETNAME(srt As Long, ed As Long) As Variant
Application.Volatile

If ed - srt <= 0 Then Exit Function

Dim temp() As Variant
ReDim temp(1 To ed - srt + 1) As Variant

Dim i As Long
For i = srt To ed
    temp(i - srt + 1) = Worksheets(i).Name
Next

SHEETNAME = temp
End Function

然后可以使用:

=SUM(INDIRECT("'"&SHEETNAME(3,SHEETS()-2)&"'!Y116"))

但是,如果您仍然要迭代工作表,为什么不直接在 UDF 中求和:

Function MY3DSUM(srt As Long, ed As Long, add As String) As Double
Application.Volatile

If ed - srt <= 0 Then Exit Function

Dim temp As Double
temp = 0

Dim i As Long
For i = srt To ed
     temp = temp + Worksheets(i).Range(add).Value2
Next

MY3DSUM = temp
End Function

那你就叫它:

 =MY3DSUM(3,SHEETS()-2,"Y116")

【讨论】:

  • 非常感谢 Scott,这两种解决方案都非常有帮助。我一般对 VBA 不太熟悉,所以我试图在工作表中完成大部分工作。看起来这毕竟是更具挑战性的方式。
  • @Scott - 认为值得在 UDF 中使用 WorksheetFunction.Sum 来“本机”处理会导致 temp = temp + 行失败的文本或错误值?虽然我认为它会慢一些。
  • 个人我希望它出错,所以我知道我是否遗漏了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2021-06-23
相关资源
最近更新 更多