Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问VBA:使用AutoExec宏、work和#x27更新参考库;是accdb格式,但编译时不是?_Ms Access_Vba_Ms Access 2010 - Fatal编程技术网

Ms access 访问VBA:使用AutoExec宏、work和#x27更新参考库;是accdb格式,但编译时不是?

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.

这是我的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.
   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
”的宏,它将在打开数据库时执行该宏,但不会

  • 在未编译的数据库中工作
  • 在编译数据库时将不起作用
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有一些正在进行的工作时。是的,为什么?问问她,这种行为很可能永远不会改变,所以我们只能服从并接受它。只有一个数据库。前端都需要匹配数据库。如果允许不同的前端,则在更新后端时,它们将与后端分离。每个人都需要运行相同的版本。