全局范围变量声明导致自动化错误

时间:2017-09-04 23:18:40

标签: excel excel-vba vba

这个问题是关于Excel的一个奇怪的错误信息"自动化错误 - 灾难性失败"。当我打开一个具有VBA代码的特定Excel文件时会发生这种情况,其中某些范围变量在模块级别声明,在任何子或函数之外。详情如下。

更新:经过进一步的故障排除后,我想我已经解决了这个问题。我可能会发布一个新问题,因为完整的更新可能会让人感到困惑。 END UPDATE

更新2:现在我已经发布了a new question一些额外的说明。

我有一个带有VBA代码的Excel文件,用于跟踪库存。在一张纸上,我有一个带有merchendise项目的表,其中包含多个字段,例如项目编号,项目名称等。我编写了几个用户定义的函数,它们根据项目编号返回各种项目属性。这些UDF基于常规工作表函数INDEXMATCH的组合。

特别是,我有一个名为ITEM_NAME()的函数,如屏幕截图所示(为简单起见,表格最小化):

Function ITEM_NAME illustrated

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)将mrngItemNumbermrngItemName的变量类型从Range更改为其他内容,例如Integer(尽管这显然会破坏函数);或

2)将声明移动到函数ITEM_NAME的范围内。

出现错误消息后,我无法真正检测到文件的任何实际问题,它似乎正常工作。

为了增加混乱,我无法用上面的最小例子复制问题。但问题现在出现了两个不同的文件:我第一次怀疑这是一个兼容性问题,因为原始文件是在Office for Mac 2008上创建的,但是我第二次使用已构建的文件在Windows上的Excel 2016中从头开始。

我在其他地方(StackoverflowMicrosoft Technet)看到了类似的问题,但没有一个具有这种特殊的味道。建议的解决方案包括检查外部引用是否正常,以及后台没有运行任何Excel进程。我已经检查过这两个问题,但它们似乎与我正在经历的事情无关。我还检查过我有Excel的最新更新。 (该文件有一个外部引用(到personal.xlsb),它正常工作。)

我无法弄清楚为什么会收到此错误?

0 个答案:

没有答案