在 VBA 中
Function SNAME(number As String) As String
Dim WORD$
WORD = "Sheet" + number
' SNAME = Worksheets(1).CodeName
For i = 1 To ThisWorkbook.Worksheets.Count
If Worksheets(i).CodeName = WORD Then SNAME = Worksheets(i).Name
Next i
End Function
在 Excel 中
=SUMIFS((SNAME(19)!$T$2:$T$9962),(SNAME(19)!$A$2:$A$9962),"=31",(SNAME(19)!$C$2:$C$9962),"<="&EDATE(TODAY(),-12))
目的:
这里的想法是,我想根据工作表的代码名称将工作表名称传递给范围函数。 VBA 函数 SNAME 似乎有效,并根据 VBA 对象代码名称返回工作表的名称。当我尝试将其与方程中的范围函数结合起来时,似乎存在一个错误,我不确定如何解决。当我用工作表名称替换 SNAME(19) 时,方程可以正确执行。
目标:
我需要能够使用其代号来引用该工作表,以避免将来因个人更改工作表名称而出现错误。我真的很感激有人就这个问题提出的任何建议。
最佳答案
据我所知,如果其中使用的任何名称发生更改,Excel 会自动更正公式。所以我不确定你是否需要这个结构。不管怎样,为了让它工作,我们必须将 SNAME(19)!$T$2:$T$9962
更改为 INDIRECT("'"& SNAME(19) & "'!$ T$2:$T$9962")
.
为了使这个更清晰,让我们在函数 SNAME
中添加引号。另外,我会将 number
的类型更改为 Variant
并在成功时添加 Exit For
:
Function SNAME(number) As String
Dim sh As Worksheet
Dim WORD$
WORD = "Sheet" & number
For Each sh In ThisWorkbook.Worksheets
If sh.CodeName = WORD Then
SNAME = "'" & sh.Name & "'"
Exit For
End If
Next sh
End Function
在公式中,我将使用 LET
来轻松编辑函数调用并调用它一次:
=LET(sh, SNAME(19),
SUMIFS(
INDIRECT(sh & "!$T$2:$T$9962"),
INDIRECT(sh & "!$A$2:$A$9962"),
"=31",
INDIRECT(sh & "!$C$2:$C$9962"),
"<=" & EDATE(TODAY(),-12)
)
)
关于excel - 将工作表代号作为范围函数中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73178590/