При автоматизации приложения из пакета 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
(http://support.microsoft.com/kb/282830/RU/
)
Programmatic Access to Office XP VBA Project is Denied
Создание проекта
- Создайте текстовый файл KbTest.bas (без расширения ТХТ). Это программный модуль, который будет вставлен в Excel во время работы.
- Скопируйте в файл следующий программный код.
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
- Сохраните файл в папке C:\KbTest.bas и закройте его.
- Запустите Visual Basic и создайте стандартный проект. По умолчанию создается форма Form1.
- В меню Project выберите пункт References и установите флажок Microsoft Excel 10.0 Object Library (это позволит использовать раннее связывание с Excel). Версия библиотеки типов для Excel 2000 имеет номер 9.0, для Excel 97 — 8.0.
- Добавьте кнопку в форму 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
- В Excel 2002 необходимо разрешить доступ к проекту VBA. Для этого запустите Excel 2002 и последовательно выберите в меню Сервис команды Макрос и Безопасность. В диалоговом окне Безопасность откройте вкладку Надежные источники и установите флажок Доверять доступ к Visual Basic Project.
- Запустите проект.
Для получения дополнительных сведений об автоматизации Office в среде разработки Visual Basic обратитесь на веб-узел Office Development Support:
Код статьи: 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 |