如何按 excel 中的工作表索引号对多个工作表中的同一单元格求和?
How can you sum the same cell across multiple worksheets by worksheet index number in excel?
我正在尝试对 excel 工作簿中所有有效工作表的单元格 Y116 求和。为了帮助定义有效的工作表,我编写了一个 VBA 函数 SHEETNAME(number),即 returns 给定工作表索引(数字)处的工作表名称。我这样做是因为有效工作表的名称和数量永远不会保持不变,但是有效范围将始终从第 3 个工作表(即 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(number As Long) As String<br>
SHEETNAME = Sheets(number).名称
结束功能
要用 SUM(INDIRECT()) 做您想做的事,需要 return 一个包含 sheet 个名称的数组到间接函数。
要做到这一点,需要将 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"))
但是,如果您无论如何都要迭代 sheet,为什么不直接在 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")
我正在尝试对 excel 工作簿中所有有效工作表的单元格 Y116 求和。为了帮助定义有效的工作表,我编写了一个 VBA 函数 SHEETNAME(number),即 returns 给定工作表索引(数字)处的工作表名称。我这样做是因为有效工作表的名称和数量永远不会保持不变,但是有效范围将始终从第 3 个工作表(即 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(number As Long) As String<br>
SHEETNAME = Sheets(number).名称
结束功能
要用 SUM(INDIRECT()) 做您想做的事,需要 return 一个包含 sheet 个名称的数组到间接函数。
要做到这一点,需要将 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"))
但是,如果您无论如何都要迭代 sheet,为什么不直接在 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")