【问题标题】:VBA User Defined Function returning #VALUE when another Workbook with similar Sheets is open当另一个具有类似工作表的工作簿打开时,VBA 用户定义函数返回 #VALUE
【发布时间】:2018-09-14 05:51:21
【问题描述】:

我有一个包含多个用户定义函数的工作簿,这些函数有时会出现 #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

【问题讨论】:

  • 尝试添加...Sum(WS.Range(...
  • @MarcoGetrost 哇,我不敢相信!有效!非常感谢您的帮助!
  • 希望你不介意,我已经 tweeted 链接到这篇文章 - Rubberduck 会在这里触发“隐式 ActiveWorkbook 引用”检查结果,警告你关于不合格的 Range 调用(并且很容易找到问题)。

标签: excel vba user-defined-functions worksheet


【解决方案1】:

你被隐含的限定词咬了。

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

因此,不合格的Range 调用隐含地引用了当前处于活动状态的任何工作表,无论工作簿恰好处于活动状态。

当您打算针对特定的 Worksheet 对象工作时,例如您的情况下的 WS,那么您应该使用那个工作表对象。

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


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

【讨论】:

  • 非常优雅的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多