VBA获取所需的库引用列表

时间:2014-12-08 05:22:44

标签: vba excel-vba ms-access access-vba excel

我想在Access 2010和Excel 2010中对VBA程序进行一些审核。其中一个主要问题是特定程序所需的库引用。有没有办法以编程方式确定特定程序需要哪些引用?

我在Access中进行了测试。我写了一些代码,需要引用Excel库。我确保我没有引用并编译代码。我没有收到任何错误。我希望我会得到错误,我将能够以编程方式编译并保存缺少Excel引用的相关错误。

我必须实现目标的另一个想法是解析每个模块中的VBA。这似乎是一项非常重要的任务。

2 个答案:

答案 0 :(得分:2)

“有没有办法以编程方式确定特定程序需要哪些引用?”

没有。当Access在VBA代码中发现无法理解的内容时,可能会抛出编译错误。但它无法识别未引用的对象或类型库中是否有可用的内容。

考虑这个例子:

Dim xlApp As Excel.Application

如果您的项目包含对Excel对象库的引用,那么该语句不会抛出编译错误。但是,如果没有引用,Access会在遇到Excel.Application时抱怨“用户定义的类型未定义”。它无法告诉您“包含对Excel对象库的引用以解决此问题。”

当您的代码包含名为常量的Excel时,会发生同样的情况,例如xlEdgeTop。参考没关系。没有引用,Access就没有关于该名称的线索。

顺便提一下,您为测试报告的结果是唯一可能的,因为您的代码模块在其声明中未包含Option Explicit。您应该始终在所有代码模块中包含Option Explicit,以便Access在无法识别某些内容时发出警告。

答案 1 :(得分:1)

在您的情况下,我一次删除一个引用,每次删除后编译。如果这对您不起作用,原因有以下几种:

Option Explicit位于每个模块的顶部非常重要,包括表单,报告,用户表单,工作表等背后的代码。如果没有Option Explicit,许多未定义的符号将无法被捕获在编译时。

使用实际对象类型声明对象变量也很重要,而不是Variant或Object。例如,这段代码编译得很好,但它不会运行:

    Dim RS
    Set RS = CurrentDb.OpenRecordset("MyTable")
    If RS.EndOfFile Then MsgBox "No data"

Dim RS更改为Dim RS As Recordset会导致在编译时检测到不存在的.EndOfFile属性。