我想在Access 2010和Excel 2010中对VBA程序进行一些审核。其中一个主要问题是特定程序所需的库引用。有没有办法以编程方式确定特定程序需要哪些引用?
我在Access中进行了测试。我写了一些代码,需要引用Excel库。我确保我没有引用并编译代码。我没有收到任何错误。我希望我会得到错误,我将能够以编程方式编译并保存缺少Excel引用的相关错误。
我必须实现目标的另一个想法是解析每个模块中的VBA。这似乎是一项非常重要的任务。
答案 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
属性。