这个问题是关于Excel的一个奇怪的错误信息"自动化错误 - 灾难性失败"。当我打开一个具有VBA代码的特定Excel文件时会发生这种情况,其中某些范围变量在模块级别声明,在任何子或函数之外。详情如下。
更新:经过进一步的故障排除后,我想我已经解决了这个问题。我可能会发布一个新问题,因为完整的更新可能会让人感到困惑。 END UPDATE
更新2:现在我已经发布了a new question一些额外的说明。
我有一个带有VBA代码的Excel文件,用于跟踪库存。在一张纸上,我有一个带有merchendise项目的表,其中包含多个字段,例如项目编号,项目名称等。我编写了几个用户定义的函数,它们根据项目编号返回各种项目属性。这些UDF基于常规工作表函数INDEX
和MATCH
的组合。
特别是,我有一个名为ITEM_NAME()
的函数,如屏幕截图所示(为简单起见,表格最小化):
ITEM_NAME()
的代码如下;请注意,两个 Range 变量在函数范围之外声明(ITEM_NUMBER_EXISTS
调用的函数ITEM_NAME
基本上检查提供的参数的有效性,但代码不是在这里显示):
Option Explicit
Dim mrngItemNumber As Range
Dim mrngItemName As Range
Public Function ITEM_NAME(varItemNumber As Variant) As String
' Returns Item Name as a function of Item Number.
' Return value error if argument is invalid:
If Not ITEM_NUMBER_EXISTS(varItemNumber) Then
ITEM_NAME = CVErr(xlErrNA)
Exit Function
End If
' The rest is executed only if the argument is a valid item number.
Set mrngItemNumber = Range("A4:A6")
Set mrngItemName = Range("B4:B6")
ITEM_NAME = Application.WorksheetFunction.Index(mrngItemName, _
Application.WorksheetFunction.Match(varItemNumber, mrngItemNumber))
End Function
由于我在同一个模块中有很多函数(这里没有显示),我更喜欢在代码的开头将所有范围变量声明为模块变量,如上例所示,然后分配它们各个函数中的Set
关键字(并避免在每个函数中单独声明它们)。
现在,使用本示例中编写的代码,打开文件时会收到恼人的错误消息。但如果我执行以下任何操作,错误就会消失:
1)将mrngItemNumber
和mrngItemName
的变量类型从Range
更改为其他内容,例如Integer
(尽管这显然会破坏函数);或
2)将声明移动到函数ITEM_NAME
的范围内。
出现错误消息后,我无法真正检测到文件的任何实际问题,它似乎正常工作。
为了增加混乱,我无法用上面的最小例子复制问题。但问题现在出现了两个不同的文件:我第一次怀疑这是一个兼容性问题,因为原始文件是在Office for Mac 2008上创建的,但是我第二次使用已构建的文件在Windows上的Excel 2016中从头开始。
我在其他地方(Stackoverflow和Microsoft Technet)看到了类似的问题,但没有一个具有这种特殊的味道。建议的解决方案包括检查外部引用是否正常,以及后台没有运行任何Excel进程。我已经检查过这两个问题,但它们似乎与我正在经历的事情无关。我还检查过我有Excel的最新更新。 (该文件有一个外部引用(到personal.xlsb
),它正常工作。)
我无法弄清楚为什么会收到此错误?