Динамическое добавление и запуск макроса на языке VBA в среде разработки Visual Basic


Аннотация


При автоматизации приложения из пакета Office в среде разработки Visual Basic иногда имеет смысл переместить часть программного кода в модуль Microsoft Visual Basic for Applications, который может выполняться в качестве процесса на сервере. Благодаря этому достигается повышение общей скорости выполнения приложения и упрощается решение проблем в тех случаях, когда сервер осуществляет некоторое действие лишь после вызова процедуры внутри процесса.

Данная статья содержит пример программного кода для динамического добавления в среде разработки Visual Basic модуля Microsoft VВА в работающее приложение из пакета Office и внутрипроцессного вызова макроса для заполнения рабочего листа.

Дополнительная информация


В приведенном примере программный модуль вставляется в Microsoft Excel. Эта методика используется также для Word и PowerPoint, поскольку они включают тот же самый обработчик языка Microsoft Visual Basic for Applications.

Добавляемый к Excel программный модуль представляет собой статический текстовый файл. Кроме того, программный код можно перенести в файл ресурсов, скомпилировать его вместе с приложением, а затем при необходимости извлекать во временный файл в период работы приложения. Такой подход лучше всего использовать, если планируется распространение проекта.

Начиная с Office XP, пользователь должен предоставить доступ к объектной модели VBA, чтобы при автоматизации приложения появилась возможность использования средств языка программирования VBA. Эта функция безопасности впервые использована в пакете Office XP. За дополнительной информацией обратитесь к следующей статье Microsoft Knowledge Base:
282830 Programmatic Access to Office XP VBA Project is Denied

Создание проекта

  1. Создайте текстовый файл KbTest.bas (без расширения ТХТ). Это программный модуль, который будет вставлен в Excel во время работы.
  2. Скопируйте в файл следующий программный код.
       Attribute VB_Name = "KbTest"

    ' Your Microsoft Visual Basic for Applications macro function takes 1
    ' parameter, the sheet object that you are going to fill.

    Public Sub DoKbTest(oSheetToFill As Object)
    Dim i As Integer, j As Integer
    Dim sMsg As String
    For i = 1 To 100
    For j = 1 To 10

    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheetToFill.Cells(i, j).Value = sMsg
    Next j
    Next i
    End Sub
  3. Сохраните файл в папке C:\KbTest.bas и закройте его.
  4. Запустите Visual Basic и создайте стандартный проект. По умолчанию создается форма Form1.
  5. В меню Project выберите пункт References и установите флажок Microsoft Excel 10.0 Object Library (это позволит использовать раннее связывание с Excel). Версия библиотеки типов для Excel 2000 имеет номер 9.0, для Excel 97 — 8.0.
  6. Добавьте кнопку в форму Form1 и поместите следующий код в процедуре обработки события Click для этой кнопки.
       Private Sub Command1_Click()
    Dim oXL As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim i As Integer, j As Integer
    Dim sMsg As String

    ' Create a new instance of Excel and make it visible.
    Set oXL = CreateObject("Excel.Application")
    oXL.Visible = True

    ' Add a new workbook and set a reference to Sheet1.
    Set oBook = oXL.Workbooks.Add
    Set oSheet = oBook.Sheets(1)

    ' Demo standard Automation from out-of-process,
    ' this routine simply fills in values of cells.
    sMsg = "Fill the sheet from out-of-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    For i = 1 To 100
    For j = 1 To 10
    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheet.Cells(i, j).Value = sMsg
    Next j
    Next i

    ' You're done with the first test, now switch sheets
    ' and run the same routine via an inserted Microsoft Visual Basic
    ' for Applications macro.
    MsgBox "Done.", vbMsgBoxSetForeground
    Set oSheet = oBook.Sheets.Add
    oSheet.Activate

    sMsg = "Fill the sheet from in-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    ' The Import method lets you add modules to VBA at
    ' run time. Change the file path to match the location
    ' of the text file you created in step 3.
    oXL.VBE.ActiveVBProject.VBComponents.Import "C:\KbTest.bas"

    ' Now run the macro, passing oSheet as the first parameter
    oXL.Run "DoKbTest", oSheet

    ' You're done with the second test
    MsgBox "Done.", vbMsgBoxSetForeground

    ' Turn instance of Excel over to end user and release
    ' any outstanding object references.
    oXL.UserControl = True
    Set oSheet = Nothing
    Set oBook = Nothing
    Set oXL = Nothing

    End Sub
  7. В Excel 2002 необходимо разрешить доступ к проекту VBA. Для этого запустите Excel 2002 и последовательно выберите в меню Сервис команды Макрос и Безопасность. В диалоговом окне Безопасность откройте вкладку Надежные источники и установите флажок Доверять доступ к Visual Basic Project.
  8. Запустите проект.

Ссылки


Для получения дополнительных сведений об автоматизации Office в среде разработки Visual Basic обратитесь на веб-узел Office Development Support: