访问 VBA:使用 AutoExec 宏更新参考库,工作在 accdb 格式但在编译时不是?
Access VBA: Update Reference Library with AutoExec macro, work's in accdb format but not when compiled?
这是我要在 MS Access 2010 中执行的 VBA 代码。为简单起见,我删除了这段代码中的错误处理。函数驻留在具有不同名称的模块中。
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
改编自
https://msdn.microsoft.com/en-us/library/aa221567(v=office.11).aspx
前提
用户,用Access数据库做前端,自然有数组。一个共同点是它们共享对包含共享函数的 accde 数据库的引用。自然地,编译这些数据库是为了阻止用户进入 VBA/Design 模式。被引用的数据库也被编译。目前正在对其 accdb 等效项进行工作,每次将其作为数据库位置的 accde 发布时,都会创建一个未解析的引用。参考路径没有改变位置(也不会)。所有收件人 Accdb 数据库都工作正常,但是当单击 linked-subroutine 按钮时,它们等效的编译版本会抛出一般错误。
如果我将上面的代码用作子例程 linked 到单击事件,例如包含有问题按钮的表单的“On Load”,则此代码可以完美运行,甚至可以编译。但是,如果我将其转换为函数并将其 link 转换为名为“AutoExec
”的宏,它将在打开数据库时执行该宏,但会。
- 在未编译的数据库中工作
- 编译数据库时将不起作用
AutoExec 宏路由是因为我只想将这段代码粘贴一次,并在用户打开数据库时执行一次,所以引用是重新创建的,而不是被破坏。
宏
Action: RunCode
Function Name: ReAddLibrary ()
我的想法
最初,我研究了后期绑定作为一种解决方案,但我发现它很难掌握,因为我并没有真正在 VBA 中编写代码,我主要在 sql 中编写代码并且因此错过了 Intellisense 和语法突出显示。所有示例都针对 excel 工作簿,因此很难关联。我和我的所有用户都使用相同的 Access 2010,因此没有版本冲突。所以不知道这个是不是答案
http://www.granite.ab.ca/access/latebinding.htm
我考虑过 运行ning 一个脚本来重新编译所有用户的数据库。但是,对引用数据库的工作是逐步进行的,让人们离开会很麻烦。
- 为什么,当编译版本仍然保留正确的accde文件
路径不起作用,当简单地引用数据库时
重新编译了吗?
- 是否可以通过编程方式删除引用(如果存在)
并添加一个引用,当 Access 的编译版本启动时,例如
link将其转为名为 AutoExec?
的宏
- 是否有替代方法 运行 上述代码而无需
将它添加到所有表单对象的“事件”中?尽可能节省我的时间
将代码集中在一个地方。
有什么想法吗?
简单而悲伤的答案是,每当您的代码 and/or 引用发生更改时,都必须编译项目。
因此,完成后,您必须将项目 accde 文件及其外部文件(那些已更新的文件,实际上是全部文件)分发给用户。
这是我要在 MS Access 2010 中执行的 VBA 代码。为简单起见,我删除了这段代码中的错误处理。函数驻留在具有不同名称的模块中。
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
改编自
https://msdn.microsoft.com/en-us/library/aa221567(v=office.11).aspx
前提
用户,用Access数据库做前端,自然有数组。一个共同点是它们共享对包含共享函数的 accde 数据库的引用。自然地,编译这些数据库是为了阻止用户进入 VBA/Design 模式。被引用的数据库也被编译。目前正在对其 accdb 等效项进行工作,每次将其作为数据库位置的 accde 发布时,都会创建一个未解析的引用。参考路径没有改变位置(也不会)。所有收件人 Accdb 数据库都工作正常,但是当单击 linked-subroutine 按钮时,它们等效的编译版本会抛出一般错误。
如果我将上面的代码用作子例程 linked 到单击事件,例如包含有问题按钮的表单的“On Load”,则此代码可以完美运行,甚至可以编译。但是,如果我将其转换为函数并将其 link 转换为名为“AutoExec
”的宏,它将在打开数据库时执行该宏,但会。
- 在未编译的数据库中工作
- 编译数据库时将不起作用
AutoExec 宏路由是因为我只想将这段代码粘贴一次,并在用户打开数据库时执行一次,所以引用是重新创建的,而不是被破坏。
宏
Action: RunCode
Function Name: ReAddLibrary ()
我的想法
最初,我研究了后期绑定作为一种解决方案,但我发现它很难掌握,因为我并没有真正在 VBA 中编写代码,我主要在 sql 中编写代码并且因此错过了 Intellisense 和语法突出显示。所有示例都针对 excel 工作簿,因此很难关联。我和我的所有用户都使用相同的 Access 2010,因此没有版本冲突。所以不知道这个是不是答案
http://www.granite.ab.ca/access/latebinding.htm
我考虑过 运行ning 一个脚本来重新编译所有用户的数据库。但是,对引用数据库的工作是逐步进行的,让人们离开会很麻烦。
- 为什么,当编译版本仍然保留正确的accde文件 路径不起作用,当简单地引用数据库时 重新编译了吗?
- 是否可以通过编程方式删除引用(如果存在) 并添加一个引用,当 Access 的编译版本启动时,例如 link将其转为名为 AutoExec? 的宏
- 是否有替代方法 运行 上述代码而无需 将它添加到所有表单对象的“事件”中?尽可能节省我的时间 将代码集中在一个地方。
有什么想法吗?
简单而悲伤的答案是,每当您的代码 and/or 引用发生更改时,都必须编译项目。
因此,完成后,您必须将项目 accde 文件及其外部文件(那些已更新的文件,实际上是全部文件)分发给用户。