Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA用户定义函数,在打开另一个具有类似工作表的工作簿时返回#值_Excel_Vba_User Defined Functions_Worksheet - Fatal编程技术网

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

Excel VBA用户定义函数,在打开另一个具有类似工作表的工作簿时返回#值,excel,vba,user-defined-functions,worksheet,Excel,Vba,User Defined Functions,Worksheet,我有一个包含多个用户定义函数的工作簿,有时会出现#值错误。我已确定,当另一个具有类似工作表名称/选项卡颜色的工作簿与具有自定义项的工作簿同时打开时,这些自定义项会给出一个#值错误。自定义项引用工作簿中使用制表符颜色计算其值的其他工作表。因此,我的猜测是,这些UDF给出了一个#值错误,因为它无法区分不同打开工作簿中类似命名/颜色工作表的差异 例如,具有相同选项卡颜色的两个打开的工作簿会给这些自定义项带来一个#VAULE错误。我打开了一个带有通用工作表名称和白色选项卡颜色的新工作表来确认这一点,UD

我有一个包含多个用户定义函数的工作簿,有时会出现#值错误。我已确定,当另一个具有类似工作表名称/选项卡颜色的工作簿与具有自定义项的工作簿同时打开时,这些自定义项会给出一个#值错误。自定义项引用工作簿中使用制表符颜色计算其值的其他工作表。因此,我的猜测是,这些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

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

范围
没有使用特定的
工作表
对象实例显式限定时,它将成为
[\u Global]
对象上的隐式成员调用

因此,非限定的
Range
调用隐式引用当前处于活动状态的任何工作表,以及恰好处于活动状态的任何工作簿

当您打算针对特定的
工作表
对象工作时,如您的案例中的
WS
,则应使用该工作表对象限定
范围
名称
单元格
调用

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



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

尝试添加
…Sum(WS.Range(…
@MarcoGetrost哇,我简直不敢相信!它起作用了!非常感谢你的帮助!希望你不介意,我有一个到这篇文章的链接-Rubberduck会触发一个“隐式活动工作簿引用”检查结果在这里,警告您不合格的
范围
呼叫(并使查找问题变得非常容易)。非常优雅的回答!