Создание глобального кода VBA в Access - PullRequest
1 голос
/ 07 марта 2011

Я хочу встроить простой кусок кода VBA в Access 2007. Мне нужно выполнить этот код на сотнях разных БД Access, поэтому я не хочу вручную вставлять код в каждую БД. Можно ли сделать это? Может быть, с помощью надстройки?

Спасибо
Karl

EDIT

Я хочу выполнить следующий код 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 addin?

Шаблон надстройки 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

Теперь я хочу иметь возможность выполнять ChangeLink () из Access. Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Мне кажется, что вам не нужно запускать этот код из баз данных Access - все, что вам нужно сделать, это запустить его на всех базах данных.

Чтобы сделать это, вы должны использовать DAOчтобы открыть каждую базу данных по очереди, удалите таблицу, затем создайте ссылку.Вы должны будете выполнить оба эти шага с DAO (удаление из коллекции TableDefs и добавление к ней), а не с операциями DoCmd (которые недоступны через DAO).

Конечно, если базы данныхнет доступа из центрального места, вы не можете сделать это.Но если это так, как бы вы изменили код или вызвали надстройку?

Другой способ использовать библиотечную базу данных - это использовать Application.Run:

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

Это предполагает:

  1. MyLibrary является MDE / ACCDE.

  2. в MyLibraryбаза данных - это подпрограмма или функция с именем FixTables, которая выполняет код, который вы хотите выполнить.

Действительно, с этим методом вы можете фактически использовать DoCmd, так как надстройка выполняется в Accessи в контексте открытой в настоящее время базы данных.

Тем не менее, обратите внимание, что некоторые люди, похоже, испытывают трудности с выполнением надстроек подобным образом (в настоящее время я в длительной дискуссии с кем-то на другом форуме, который может 'кажется, заставить его работать).Я использовал этот метод для библиотечных баз данных годами и у меня не было проблем (если вы укажете полный путь), поэтому я озадачен, почему те, с которыми я его обсуждаю, не могут сделатьэто работает.

2 голосов
/ 07 марта 2011

В зависимости от того, для чего предназначен код, есть (по крайней мере) два разных способа сделать это, не работая на уровне расширений VB (где вы должны копировать и вставлять код, по крайней мере, в VBA):

  1. Сделать часть кода надстройки. Затем он может быть загружен и оставаться загруженным и доступным для любого другого приложения.

  2. Если код работает только с данными, попробуйте написать процедуру, которая связывает и отменяет связь таблиц в каждом файле MDB, который требует обработки.

Преимущество # 2 перед # 1 (и, действительно, над копированием и вставкой кода) состоит в том, что вы можете вызывать свою простую процедуру один раз, а не сотни раз.


EDIT:

Существует два способа вызвать надстройку, в зависимости от того, кто и как должен вызывать ее функциональность.

  1. через пользовательский интерфейс. Используйте это, когда вы хотите, чтобы конечный пользователь мог использовать его, особенно для функциональности, которую вы будете часто вызывать. Как: а. Кнопка «Office»> «Параметры доступа»> вкладка «Надстройки» б. Если это надстройка .NET (или любая другая надстройка без прав доступа), выберите «Надстройка COM» в раскрывающемся списке «Управление». Если это Access, выберите Access. Нажмите идти с. Нажмите кнопку «Добавить» в появившейся форме, перейдите к надстройке.

Вам все равно нужно будет предоставить ему какой-то интерфейс: панель команд, кнопку ленты, форму, что-то еще. Это отдельное обсуждение

  1. Через код. Используйте это, если вы просто хотите вызвать его как часть какой-то другой процедуры VBA. а. Окно VBE> Инструменты> Ссылки б. Кнопка просмотра с. Измените раскрывающийся список в файле типа, если вы настраиваете надстройку Access.

Затем вы можете напрямую вызвать строку кода, как если бы она была частью вашего текущего проекта. Если вы хотите быть более явным, вы также можете вызвать его по имени библиотеки: MyAddInName.ChangeLink

...