首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数百个数据库上执行函数

在数百个数据库上执行函数
EN

Stack Overflow用户
提问于 2011-03-07 22:04:11
回答 2查看 826关注 0票数 1

我想在Access 2007中嵌入一段简单的VBA代码。我需要在数百个不同的数据库上执行这段代码,所以我不想手动将代码粘贴到每个数据库中。有可能做到这一点吗?也许可以作为一个附加模块?

谢谢

卡尔

编辑

我想执行以下VBA代码:

代码语言:javascript
复制
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外接程序模板如下所示:

代码语言:javascript
复制
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部分:

好的,所以我想我应该做以下事情:

代码语言:javascript
复制
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()。我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-07 22:14:42

根据代码的用途,有(至少)两种不同的方法可以做到这一点,而不是在VB扩展级别(这是您复制和粘贴代码的地方,至少在VBA中):

  1. 使代码成为外接程序的一部分。然后,它可以被加载,并保持加载和公开给任何其他只处理数据的application.
  2. If,请考虑编写一个过程来链接和取消每个需要处理的mdb文件中的表。

与#1相比,#2的优势在于,您可以一次调用您的简单例程,而不是数百次。

编辑:

有两种方法可以调用外接程序,具体取决于调用外接程序功能的人员和方式。

通过UI执行

  1. 。当您希望最终用户能够使用它时,可以使用它,特别是对于您将经常调用的功能。如何: a.“Office”按钮>“Access选项”>“外接程序”选项卡b.如果是.NET外接程序(或任何其他非Access外接程序),请从“管理”下拉列表中选择“COM外接程序”。如果是Access,请选择Access。单击go c。在弹出的表单中单击Add按钮,浏览到该加载项。

您仍然需要为它提供某种UI :一个命令栏、一个功能区按钮、一个窗体等等。那是一个单独的讨论

通过代码

  1. 。如果您只是想将其作为其他VBA过程的一部分来调用,则可以使用它。a. VBE窗口>工具>引用b.浏览按钮c.如果您正在设置Access插件,请更改文件类型中的下拉列表。

然后,您可以直接调用该行代码,就像它是当前项目的一部分一样。如果您希望更明确,也可以通过库名调用它: MyAddInName.ChangeLink

票数 2
EN

Stack Overflow用户

发布于 2011-03-08 04:50:23

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

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

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

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

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

这里假设:

  1. MyLibrary是MDE/ACCDE。MyLibrary数据库中的
  2. 是一个名为FixTables的子例程或函数,用于运行要执行的代码。

实际上,通过该方法,您实际上可以使用DoCmd,因为外接程序是在Access中运行的,并且是在当前打开的数据库的上下文中运行的。

然而,请注意,有些人似乎很难以这种方式执行插件(我目前正在与另一个论坛中的某个人进行长时间的讨论,他似乎不能让它工作)。我已经在图书馆数据库中使用这种方法很多年了,并且没有遇到任何问题(只要你指定了一个完整的路径),所以我不明白为什么我正在讨论它的那些人似乎不能使它工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5220613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档