我想在Access 2007中嵌入一个简单的VBA代码。我需要在数百个不同的Access DB上执行此代码,因此我不想手动将代码粘贴到每个数据库中。是否有可能做到这一点?也许通过加载项?
感谢
卡尔
修改
我想执行以下VBA代码:
DoCmd.DeleteObject acTable, "LastNum"
DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=myDB;UID=User1;PWD=123;LANGUAGE=u s_english;" & "DATABASE=LastNumber", acTable, "LastNum", "LastNum"
我如何将其翻译成VB插件?
visual studio VB加载项模板如下所示:
imports Extensibility
imports System.Runtime.InteropServices
<GuidAttribute("B61E2444-F46E-4591-A8BA-3D06A4E5D84C"), ProgIdAttribute("MyAddin1.Connect")> _
Public Class Connect
Implements Extensibility.IDTExtensibility2
Private applicationObject As Object
Private addInInstance As Object
Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub
Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete
End Sub
Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
End Sub
Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
applicationObject = application
addInInstance = addInInst
End Sub
End Class
编辑第2部分:
好的,所以我发现我应该做以下事情:
imports Extensibility
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Core
Imports Access = Microsoft.Office.Interop.Access
<GuidAttribute("B61E2444-F46E-4591-A8BA-3D06A4E5D84C"), ProgIdAttribute("MyAddin1.Connect")> _
Public Class Connect
Implements Extensibility.IDTExtensibility2
Private applicationObject As Access.Application
Private addInInstance As Microsoft.Office.Core.COMAddIn
Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub
Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete
End Sub
Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
End Sub
Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
applicationObject = CType(application, Access.Application)
addInInstance = CType(addInInst, Microsoft.Office.Core.COMAddIn)
' This line enables VBA to call back into this object.
addInInstance.Object = Me
End Sub
Public Sub ChangeLink()
applicationObject.DoCmd.DeleteObject(Access.AcObjectType.acTable, "LastPolNum")
applicationObject.DoCmd.TransferDatabase(Access.AcDataTransferType.acLink, "ODBC Database", "ODBC;DSN=ZACANTDB02;UID=EDIPolicyNumber;PWD=museum123;LANGUAGE=u s_english;" & "DATABASE=EDIPolicyNumber", Access.AcObjectType.acTable, "LastPolnum", "LastPolNum")
End Sub
End Class
现在我想要的是能够从Access执行ChangeLink()。我该怎么做?
答案 0 :(得分:2)
根据代码的用途,有(至少)两种不同的方法来执行此操作,而无需在VB Extensions级别工作(这是您复制和粘贴代码的地方,至少在VBA中):< / p>
使代码成为加载项的一部分。然后可以将其加载并保持加载和暴露给任何其他应用程序。
如果代码仅处理数据,请考虑编写一个链接和取消链接每个需要处理的mdb文件中的表的过程。
#2优于#1(实际上,复制和粘贴代码)的优势在于,您可以调用一次简单例程,而不是数百次。
编辑:
有两种方法可以调用加载项,具体取决于谁将调用其功能以及如何调用加载项。
您仍需要提供某种UI:命令栏,功能区按钮,表单等。这是一个单独的讨论
然后,您可以直接调用代码行,就好像它是您当前项目的一部分一样。如果您希望更明确,也可以通过库名称调用它:MyAddInName.ChangeLink
答案 1 :(得分:2)
在我看来,您不需要从Access数据库运行此代码 - 您需要做的就是在所有数据库上运行它。
为此,您将使用DAO依次打开每个数据库,删除表,然后创建链接。您必须使用DAO执行这两个步骤(从TableDefs集合中删除并添加到它),而不是使用DoCmd操作(通过DAO不可用)。
当然,如果无法从中心位置访问数据库,则无法执行此操作。但如果是这种情况,您将如何更改代码或调用加载项?
使用库数据库的另一种方法是使用Application.Run:
Application.Run“\ Server \ PathToAddIn \ MyLibrary.FixTables”
这假定:
MyLibrary是MDE / ACCDE。
是一个名为FixTables的子例程或函数,它运行您要执行的代码。
实际上,使用该方法,您实际上可以使用DoCmd,因为加载项在Access中以及当前打开的数据库的上下文中运行。
但是,请注意,有些人似乎很难以这种方式执行加载项(我目前正与另一个论坛中的某个人进行长时间的讨论,而这些人似乎无法让它工作)。我已经多年来一直使用这种方法用于库数据库并且没有任何问题(只要你指定一个完整的路径),所以我很困惑为什么我正在讨论的那些似乎无法制作它有效。