在Access中创建全局VBA代码

时间:2011-03-07 14:04:11

标签: vba access-vba ms-access-2007 add-in

我想在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()。我该怎么做?

2 个答案:

答案 0 :(得分:2)

根据代码的用途,有(至少)两种不同的方法来执行此操作,而无需在VB Extensions级别工作(这是您复制和粘贴代码的地方,至少在VBA中):< / p>

  1. 使代码成为加载项的一部分。然后可以将其加载并保持加载和暴露给任何其他应用程序。

  2. 如果代码仅处理数据,请考虑编写一个链接和取消链接每个需要处理的mdb文件中的表的过程。

  3. #2优于#1(实际上,复制和粘贴代码)的优势在于,您可以调用一次简单例程,而不是数百次。


    编辑:

    有两种方法可以调用加载项,具体取决于谁将调用其功能以及如何调用加载项。

    1. 通过用户界面。当您希望最终用户能够使用它时,请使用此选项,尤其适用于您经常调用的功能。如何: 一个。 Office按钮&gt;访问选项&gt;加载项选项卡 湾如果它是.NET加载项(或任何其他非Access加载项),请从“管理”下拉列表中选择“COM加载项”。如果是Access,请选择Access。点击go C。单击弹出窗体中的“添加”按钮,浏览到加载项。
    2. 您仍需要提供某种UI:命令栏,功能区按钮,表单等。这是一个单独的讨论

      1. 通过代码。如果您只是想将其作为其他VBA过程的一部分来调用,请使用此选项。 一个。 VBE窗口&gt;工具&gt;参考 湾浏览按钮 C。如果您正在设置Access加载项,请更改文件类型的下拉列表。
      2. 然后,您可以直接调用代码行,就好像它是您当前项目的一部分一样。如果您希望更明确,也可以通过库名称调用它:MyAddInName.ChangeLink

答案 1 :(得分:2)

在我看来,您不需要从Access数据库运行此代码 - 您需要做的就是在所有数据库上运行它。

为此,您将使用DAO依次打开每个数据库,删除表,然后创建链接。您必须使用DAO执行这两个步骤(从TableDefs集合中删除并添加到它),而不是使用DoCmd操作(通过DAO不可用)。

当然,如果无法从中心位置访问数据库,则无法执行此操作。但如果是这种情况,您将如何更改代码或调用加载项?

使用库数据库的另一种方法是使用Application.Run:

Application.Run“\ Server \ PathToAddIn \ MyLibrary.FixTables”

这假定:

  1. MyLibrary是MDE / ACCDE。

  2. MyLibrary数据库中的
  3. 是一个名为FixTables的子例程或函数,它运行您要执行的代码。

  4. 实际上,使用该方法,您实际上可以使用DoCmd,因为加载项在Access中以及当前打开的数据库的上下文中运行。

    但是,请注意,有些人似乎很难以这种方式执行加载项(我目前正与另一个论坛中的某个人进行长时间的讨论,而这些人似乎无法让它工作)。我已经多年来一直使用这种方法用于库数据库并且没有任何问题(只要你指定一个完整的路径),所以我很困惑为什么我正在讨论的那些似乎无法制作它有效。