如何在excel中按工作表索引编号对多个工作表中的同一单元格求和?

如何在excel中按工作表索引编号对多个工作表中的同一单元格求和?,excel,excel-formula,sum,excel-indirect,Excel,Excel Formula,Sum,Excel Indirect,我正在尝试对excel工作簿中所有有效工作表的Y116单元格求和。为了帮助定义有效的工作表,我编写了一个VBA函数SHEETNAME(number),它返回给定工作表索引(number)处的工作表名称。我这样做是因为有效工作表的名称和数量永远不会保持不变,但有效范围始终从第三个工作表(即SHEETNAME(3))开始,并始终从工作簿中最后一个工作表的第三个工作表(即SHEETNAME(SHEETS()-2))结束 对于SUM()和INDIRECT(),我觉得这应该是相对简单的,但是我不断得到引用

我正在尝试对excel工作簿中所有有效工作表的Y116单元格求和。为了帮助定义有效的工作表,我编写了一个VBA函数SHEETNAME(number),它返回给定工作表索引(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()函数:

函数SHEETNAME(与字符串一样长的数字)
SHEETNAME=图纸(编号)。名称 端函数

要使用SUM(INDIRECT())执行所需操作,on需要将工作表名称数组返回给INDIRECT

为此,需要将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

但是,如果仍要迭代工作表,为什么不在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

@JNevill你可以用这种方法做一个3d求和<代码>=SUM('Sheet1:Sheet3'!Y116)就可以了。OP,请共享UDF
SHEETNAME()
,这样我们就可以测试.D*#它了。在我职业生涯的几十年里,我怎么会发现这些事情呢。我需要RTFM。谢谢@ScottCraner!就我个人而言,我会写一个包含三个参数的UDF。第一个工作表编号、结束工作表编号和单元格地址,然后迭代工作表并对单元格求和。跳过全部尝试部分自定义项部分本地公式。非常感谢Scott,这两种解决方案都非常有用。一般来说,我对VBA不太熟悉,所以我试图在工作表中正确地完成大部分工作。看起来这毕竟是一种更具挑战性的方式。@Scott-认为值得在UDF中使用
WorksheetFunction.Sum
“本机”处理文本或错误值,否则会导致
temp=temp+
行失败吗?虽然我想它会慢一些,但我个人希望它出错,这样我就知道我是否遗漏了什么。
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")