Excel UDF 对变量工作表的范围求和

Posted

技术标签:

【中文标题】Excel UDF 对变量工作表的范围求和【英文标题】:Excel UDF to sum ranges on variable worksheets 【发布时间】:2016-08-31 18:37:31 【问题描述】:

这是我在这里的第一篇文章,所以我会尽可能地清楚。

我已经决定将 UDF 作为正确的解决方案,但这主要是因为我无法弄清楚什么内置函数会起作用。

我的工作簿一开始有两张表:“摘要表”和“系统模板”。在摘要表上,我创建了一个系统列表,从该列表中,我有一些代码使用 System Template 生成新工作表并根据列表中的值命名工作表,这工作得很好。在汇总表上包含系统名称的单元格旁边的单元格中,我试图对各自工作表上每个不同系统的“Q:Q”范围内的值求和。唯一变化的范围是数据来自的工作表名称。这是我遇到麻烦的地方。我收到 #Value 错误,我不知道如何找出问题所在。通常我会使用内置的公式评估工具,但它对 UDF 有点没用。任何帮助将不胜感激。

Function FrictionSum(rngInput As Range)
    Dim rngCell, rngDomain As Range
    Dim strName As String
    FrictionSum = 0

    'FrictionSum = rngInput.Value
    Set rngDomain = Sheets(strName).Range("Q:Q")

        For Each rngCell In rngDomain
            FrictionSum = FrictionSum + rngCell.Value
        Next rngCell

End Function

【问题讨论】:

您正在定义Function,但您没有返回任何内容,您可以只使用Sub,或者您需要将其定义为Function FrictionSum(rngInput As Range) As Long。此外,您正在传递 rngInput ,但您在 UDF 中没有对它做任何事情? 所以公式 =SUM(INDIRECT("'" & A1 & "'!Q:Q")) 其中 A1 是工作表名称不起作用? 另外你没有给strName赋值,Excel应该猜吗? 【参考方案1】:

如公式所述:

=SUM(INDIRECT("'" & A1 & "'!Q:Q"))

应该做你想做的。

工作表 Function Sum 无需重复即可完成您想要的操作。 还要确保将值分配给 strName。

代码:

Function FrictionSum(rngInput As Range) As Double
    Dim rngDomain As Range
    Dim strName As String


    strName = rngInput.Value


    Set rngDomain = Sheets(strName).Range("Q:Q")
    FrictionSum = Application.WorksheetFunction.Sum(rngDomain)


End Function

【讨论】:

我最初尝试将 SUM 与 INDIRECT 结合使用,但由于某种原因,它对我不起作用(可能缺少报价)。现在可以了。在 UDF 中,我没有分配 strName 的唯一原因是我在进行故障排除。我将 FrictionSum 分配给 rngInput.Value,然后在它工作正常时将其注释掉,我只是没有重新分配 strName。至于不返回,为什么我的 For Each 循环中的 FrictionSum 不能作为返回值? 对不起,我错过了。它应该有。也许这只是级联,修复一个错误以创建另一个错误。但这应该更快。

以上是关于Excel UDF 对变量工作表的范围求和的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中使用 UDF 更新工作表

限制对 Excel 工作表的查看访问

将多维数组传递到 VBA 中的 Excel UDF

excel工作表可以用作UDF吗?

在一个 Excel 工作簿中拆分具有相同名称范围的工作表 - Excel VBA

excel查找一段时间内的数据