我有一个Access 2003数据库,它将动态加载MDB数据库作为库引用。原因是这个数据库是60多个应用程序数据库的菜单前端。菜单前端不会处理永久引用所有这些数据库,而是动态地引用用户进行选择时所需的内容。我正在努力将此数据库移动到Access 2010并创建自定义功能区。我开始使用here中的技术在功能区加载时捕获全局变量中的功能区对象。然后我遇到了问题,我可以验证代码是否正在运行,并且全局变量被正确地分配了功能区引用,但是在数据库运行它的启动例程之后,该全局变量将被重置为Nothing。
为了验证发生了什么,我创建了一个简单的数据库进行测试。在这个数据库中,我有一个带有全局变量的模块:
Public obj as Object
然后我有了这样的功能:
Public Function SetObj()
Set obj = Application
Debug.Print "IsNothing=" & (obj Is Nothing)
References.AddFromFile "Test.mdb"
Debug.Print "IsNothing=" & (obj Is Nothing)
End Function
显然,在我的代码中,“Test.mdb”指的是实际文件。如果我运行这段代码,Debug.Print会为这两个实例提供“IsNothing = False”,但是在函数完成后如果等待几秒钟,Debug.Print会给我“IsNothing = True”。如果我注释掉References.AddFromFile,无论我等多久,Debug.Print都会给我“IsNothing = False”。
对我来说,因为Access在加载库之后必须重新编译VBA代码才能重置所有全局变量。我已经尝试将全局变量移动到一个类中,但是因为我需要一个类的全局变量,所以类变量然后被重置。我尝试在函数中使用局部变量来保存全局变量的值,但看起来Access在代码完成运行后等待几秒钟才进行重新编译,因此这也不起作用。有没有人有任何其他想法来实现这个目标?
答案 0 :(得分:1)
我真的不知道这是否会解决这种引用的问题,但一般来说,我不使用公共变量来做这种事情,而是在函数中使用STATIC变量。它会是这样的:
Public Function SetObj() As Object
Static obj As Object
If (obj Is Nothing) Then
Set obj = Application
End If
Set SetObj = obj
End Function
然后,您只需使用SetObj作为使用应用程序的对象。在生产应用程序中,您也需要拆卸代码,但我在这里省略了。
我怀疑这会有所帮助,但是你的代码让我感到非常低效和不完整。
答案 1 :(得分:0)
我找到了解决问题的方法,并感谢@ David-W-Fenton,因为你的答案给了我这个想法。我在库数据库中使用您的方法来缓存存储在表中但在初始启动后不会更改的频繁访问的值。每次参考变化时,这些值都不会丢失,那就是灯泡点亮时。
解决方案是将全局变量放在库数据库中。 Access看起来只是重置加载引用的数据库中的全局变量 - 这在思考之后才有意义。因此,由于库数据库不是正在重新编译的数据库,因此它不会使其全局(或私有或静态)变量重置。
我最终做的是在现有的库数据库中创建一个新模块。它有一个私有变量和两个方法 - 一个用于设置变量,一个用于检索变量值。在我的菜单前端数据库中,当功能区加载并调用我的回调函数时,不是将功能区对象保存在前端数据库中,而是将其传递给此模块进行保存。每当新数据库动态添加到库引用时,我现在不再丢失该功能区引用。