excel - 将工作表代号作为范围函数中的参数传递

标签 excel vba excel-formula reference range

在 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/

相关文章:

vba - 使用 IIf 时出现语法错误

javascript - 如何使用 JavaScript 将数据从 Excel(xlsx、csv)导入到 HTML 页面?

excel - 宏 - 将同一行中的某些单元格(由复选框触发)复制到不同的工作表

ms-access - 使用 VBA 在 Access 中创建记录集

excel - 从外部 vbs 运行时宏的行为不同

c# - Excel公式T.INV计算错误使用C#

vba - 在 VBA 中比较日期时出现问题?

arrays - 最常出现的带有条件的文本值。模式不起作用

excel - 在 Excel 中自动编号一列,并在另一列指定时包括范围

excel - 根据另一列的值从相邻列中获取立即值