Ms access 访问VBA:使用AutoExec宏、work和#x27更新参考库;是accdb格式,但编译时不是?
这是我的VBA代码,将在MS Access 2010中执行。为了简单起见,我删除了代码中的错误处理。函数位于具有不同名称的模块中Ms access 访问VBA:使用AutoExec宏、work和#x27更新参考库;是accdb格式,但编译时不是?,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,这是我的VBA代码,将在MS Access 2010中执行。为了简单起见,我删除了代码中的错误处理。函数位于具有不同名称的模块中 Public Function ReAddLibrary() Dim accessProj As Access.Application Dim chkRef As Access.Reference ' Set accessProj = Access.Application ' Check through the selected references.
Public Function ReAddLibrary()
Dim accessProj As Access.Application
Dim chkRef As Access.Reference '
Set accessProj = Access.Application
' Check through the selected references.
For Each chkRef In accessProj.References
' If the reference "MyReference" exists then remove.
If chkRef.Name = "MyReference" Then
accessProj.References.Remove chkRef
Exit For
End If
Next
‘ Add back the reference “MyReference” from specified location.
accessProj.References.AddFromFile "Access Database Path"
End Function
改编自前提
用户,使用Access数据库作为前端,自然会有一系列的数据库。一个共同点是,它们共享对包含共享函数的accde数据库的引用。自然地,这些数据库被编译以阻止用户进入VBA/设计模式。也会编译被引用的数据库。目前正在对其accdb等效项进行处理,每次将其作为accde发布到数据库位置时,都会创建一个未解析的引用。引用路径未更改位置(也不会更改)。所有收件人Accdb数据库都可以正常工作,但当单击按钮链接的子例程时,它们的等效编译版本会抛出一个通用错误 如果我使用上面的代码作为链接到点击事件的子例程,例如对于包含有问题的按钮的表单的“加载”,那么该代码工作得很好,甚至是编译过的。但是,如果我将其转换为函数并将其链接到名为“
AutoExec
”的宏,它将在打开数据库时执行该宏,但不会
- 在未编译的数据库中工作
- 在编译数据库时将不起作用
宏
Action: RunCode
Function Name: ReAddLibrary ()
我的想法 最初,我将后期绑定作为一种解决方案进行了研究,但我发现很难掌握,因为我不是真正用VBA编写代码,我主要用sql编写代码,因此错过了Intellisense和语法突出显示。所有的例子都是excel工作簿,很难联系起来。我和我的所有用户都使用相同的Access 2010,因此没有版本冲突。所以我不知道这是否是答案 我考虑运行一个脚本来重新编译所有用户的数据库。但是,对引用数据库的工作正在逐步进行,将人们从数据库中引导出来将是一件麻烦事
- 为什么,当编译版本仍然保留正确的accde文件时 仅当引用的数据库已被删除时,path不起作用 重新编译
- 是否可以通过编程删除引用(如果存在) 并在Access的编译版本启动时添加一个引用,例如 是否将其链接到名为AutoExec的宏
- 是否有一种不必执行上述代码的替代方法 是否将其添加到所有表单对象的“事件”中?尽可能节省我的时间 将代码集中在一个地方李>
有什么想法吗?简单而悲伤的答案是,每当您的代码和/或引用发生更改时,都必须编译项目
因此,完成后,您必须将项目accde文件及其外部文件(实际上都是更新的文件)分发给用户。虽然我刚刚开始修补您的问题,并将继续查找,但如果知道它是否始终是丢失的同一引用,这将很有帮助。如果将源代码带到另一个工作站并编译它,会发生什么?或者在那台机器上打电话。这样行吗?可能存在“信任问题”?检查此项:在AutoExec中执行“某些事情”可能有问题,但不知道。使用该代码而不是AutoExec打开表单进行测试。我们已经检查了信任设置,它们很好。另一个开发人员已经在他的机器上编译了引用的数据库,但它仍然中断了accde用户端数据库的查找。另外,引用并没有丢失,最终用户数据库的accdb版本发现它很好。我猜,当再次编译源引用数据库时,最终用户编译的数据库一定有一些不匹配的内部引用,如Id或日期时间引用。我做了测试(在最终用户数据库中工作以避免混淆),并将上述代码添加到带有一些vba MSGBOX的“开放式事件”中进行测试。有趣的是,代码可以工作,但后来我意识到我的例程删除了引用,然后又将其添加回来。因此,当我在vba窗口中编译它时,它可以工作,但是,如果我先手动删除GUI中的引用,然后再编译它,它会出错,因为编译时,函数和子例程的引用在技术上是不存在的。在我看来,这就是后期绑定的作用。感谢@wayne G.Dunn,这已经解决了一半的困惑。一篇关于早/晚绑定的相当不错的文章是:当您进行更改时,您是否有任何类型的版本控制来让每个用户的副本保持最新?因此事实上,只需将前端文件部署为完整的“独立”。accd?没有外部VBA代码依赖项的文件。如果部署是使用自动前端更新程序完成的,那么它非常简单。@Gustav抱歉,但为什么?如果我有一个功能强大的数据库,我会重新编译成accde格式(称之为数据库a)。当文件路径相同且所有子/功能保持不变时,为什么引用数据库A的所有其他accde数据库(数据库B-Z)会丢失引用。无论我重新编译数据库A多少次,它们的(B-Z).accdb计数器部件都会自动拾取引用。但是,您是对的,重新编译所有B-Z数据库可以解决此问题。这样做很烦人,尤其是当数据库A有一些正在进行的工作时。是的,为什么?问问她,这种行为很可能永远不会改变,所以我们只能服从并接受它。只有一个数据库。前端都需要匹配数据库。如果允许不同的前端,则在更新后端时,它们将与后端分离。每个人都需要运行相同的版本。