当另一个具有类似工作表的工作簿打开时,VBA 用户定义函数返回 #VALUE

Mit*_*103 3 excel vba worksheet user-defined-functions

我有一个包含多个用户定义函数的工作簿,有时会出现 #VALUE 错误。我已经确定,当另一个具有相似工作表名称/标签颜色的工作簿与带有 UDF 的工作簿同时打开时,这些 UDF 会给出 #VALUE 错误。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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

你已经被隐式限定词咬了。

Range没有用特定Worksheet对象实例显式限定时,它成为[_Global]对象上的隐式成员调用。

Range因此,不合格的调用隐含地指代当前处于活动状态的任何工作表,在任何碰巧处于活动状态的工作簿中。

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

这就是ColumnSum = Application.WorksheetFunction.Sum(WS.Range(...))修复它的原因。


ThisWorkbook是指写入 VBA 代码的特定工作簿,可能是也可能不是该工作簿WS所属的工作簿。这就是它不起作用的原因。