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

Код статьи: 219905 - Список продуктов, к которым относится данная статья.
Развернуть все | Свернуть все

На этой странице

Аннотация

При автоматизации приложения из пакета 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:

http://support.microsoft.com/support/officedev/

Свойства

Код статьи: 219905 - Последнее изменение :: 30 мая 2006 г. - Редакция: 3.1
Информация в данной статье относится к следующим продуктам.
  • Microsoft Office Excel 2003
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Office Professional Edition 2003
  • Microsoft Office Standard Edition 2003
Ключевые слова: 
kbautomation kbhowto KB219905

Отправить отзыв