Excel自定义项对可变工作表上的范围求和

Excel自定义项对可变工作表上的范围求和,excel,udf,vba,Excel,Udf,Vba,这是我在这里的第一篇文章,所以我会尽我最大的努力让自己尽可能清楚 我已经确定UDF是正确的解决方案,但这主要是因为我不知道什么内置函数可以工作 我的工作簿一开始有两张表:“摘要表”和“{System Template}”。在Summary Sheet上,我创建了一个系统列表,从该列表中我有一些代码,可以使用{System Template}生成新的工作表,并根据列表中的值命名工作表,这很好。在汇总表上包含系统名称的单元格旁边的单元格中,我尝试对其各自表上每个不同系统的“Q:Q”范围内的值求和。范

这是我在这里的第一篇文章,所以我会尽我最大的努力让自己尽可能清楚

我已经确定UDF是正确的解决方案,但这主要是因为我不知道什么内置函数可以工作

我的工作簿一开始有两张表:“摘要表”和“{System Template}”。在Summary Sheet上,我创建了一个系统列表,从该列表中我有一些代码,可以使用{System Template}生成新的工作表,并根据列表中的值命名工作表,这很好。在汇总表上包含系统名称的单元格旁边的单元格中,我尝试对其各自表上每个不同系统的“Q:Q”范围内的值求和。范围中唯一更改的部分是数据来源的图纸名称。这就是我遇到麻烦的地方。我得到一个#值错误,我不知道如何找出问题所在。通常情况下,我会使用内置的公式评估工具,但对于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
如公式所述:

=SUM(INDIRECT("'" & A1 & "'!Q:Q"))
你应该做你想做的

工作表函数Sum将执行您想要的操作,而无需迭代。 还要确保将该值指定给strName

代码:

如公式所述:

=SUM(INDIRECT("'" & A1 & "'!Q:Q"))
你应该做你想做的

工作表函数Sum将执行您想要的操作,而无需迭代。 还要确保将该值指定给strName

代码:


您正在定义一个
函数
,但您没有返回任何内容,您可以使用
子函数
,或者您需要将其定义为
函数摩擦和(rngInput as Range),例如,只要长度
。此外,您正在传递
rngInput
,但在您的UDF中没有对其进行任何处理?因此公式
=SUM(间接(“'A1&'!Q:Q”)
其中A1是工作表名称,但不起作用?您也没有为strName赋值,Excel应该猜测吗?您正在定义一个
函数
,但您没有返回任何内容,您可以只使用
子函数
,或者您需要将其定义为
函数摩擦和(rngInput as Range),例如,只要
。此外,您正在传递
rngInput
,但在您的UDF中没有对其进行任何处理?因此公式
=SUM(INDIRECT(“'A1&'!Q:Q”)
其中A1是工作表名称,但不起作用?您也没有为strName赋值,Excel应该猜测吗?我最初尝试将SUM与INDIRECT一起使用,但出于这样或那样的原因,它对我不起作用(可能遗漏了一句话)。现在可以了。在UDF中,我没有指定strName的唯一原因是因为我正在进行故障排除。我将FrictionSum分配给rngInput.Value,然后在它正常工作时注释掉它,我只是没有重新分配strName。至于不返回,为什么我的for Each循环中的FrictionSum不能用作返回值呢?对不起,我错过了。应该有。也许这只是一个级联,修复一个错误以创建另一个错误。但这应该更快。我最初尝试使用SUM和INDIRECT,但出于这样或那样的原因,它对我不起作用(可能缺少引用)。现在可以了。在UDF中,我没有指定strName的唯一原因是因为我正在进行故障排除。我将FrictionSum分配给rngInput.Value,然后在它正常工作时注释掉它,我只是没有重新分配strName。至于不返回,为什么我的for Each循环中的FrictionSum不能用作返回值呢?对不起,我错过了。应该有。也许这只是一个级联,修复一个错误以创建另一个错误。但这应该更快。