VBA用户定义函数返回#VALUE当另一个工作簿中的类似床单是开放的

问题描述 投票:2回答:1

我有多个用户定义函数的工作簿,有时给一个#VALUE错误。我已确定,这些UDF得到#VALUE错误时具有类似表名称/标签的颜色另一个工作簿是在相同的时间与UDF的工作簿打开。的UDF的指使用工作簿内标签颜色来计算其值其他工作表。所以我的猜测是,这些UDF都给人一种#VALUE错误,因为它不能区分在不同的打开的工作簿类似的命名/彩色工作表的差异。

例如,两个打开的工作簿具有相同标签颜色给这些UDF一个#VAULE错误。我证实了这一点,只需打开与通用表名称和白色标签颜色的新工作表中,UDF的没有给这个错误。如预期,除了这种情况发生这些UDF否则正常工作。下面就是这样的情况下给这个错误的UDF的一个示例。我试图通过引用“的ThisWorkbook”来修复这个错误,但是这似乎并没有纠正错误。我甚至试过功能移动到“的ThisWorkbook”模块,但显然函数不此模块在Excel填充。我无法弄清楚如何解决这个问题。你的帮助是极大的赞赏!

Function ExpenseActualSum(Month)

Application.Volatile
ColumnNumber = Month.Column - 1
ExpenseMonthSum = 0
Dim WS As Worksheet

For Each WS In ThisWorkbook.Worksheets
    If WS.Tab.Color = 255 Then

        For Each Tbl In WS.ListObjects
            If Tbl.Name Like "Actual*" Then
            TableName = Tbl.Name
            Exit For
            End If
        Next Tbl

    ColumnSum = Application.WorksheetFunction.Sum(Range(TableName & "[[#All],[Column" & ColumnNumber & "]]"))
    ExpenseMonthSum = ExpenseMonthSum + ColumnSum
    End If
Next WS

ExpenseActualSum = ExpenseMonthSum

End Function
excel vba user-defined-functions worksheet
1个回答
4
投票

你已经被隐含的预选赛咬伤。

Range未明确与特定Worksheet对象实例合格,就变成了[_Global]对象的隐式调用成员。

因此不合格Range调用隐含指什么工作是当前活动,在任何工作簿恰好是积极的。

当你的意思是针对特定对象Worksheet工作,像你的情况WS,那么你应该有资格RangeRowsColumnsNamesCells与工作表对象调用。

这就是为什么ColumnSum = Application.WorksheetFunction.Sum(WS.Range(...))修复它。


ThisWorkbook指其中VBA代码被写入特定工作簿时,其可以是或可以不是WS属于工作簿。这就是为什么它没有工作。

© www.soinside.com 2019 - 2024. All rights reserved.