2 семестр / vba_2002
.pdfРабочая книга, демонстрирующая использование 50 значений этого аргумента, показана на рис. 20.3 (она содержится на Web-узле издательства).
Автоматизация
Вы можете создать макрос Excel, который будет управлять программой Microsoft Word. Точнее, макрос Excel будет контролировать самый важный компонент Word — так называемый сервер автоматизации. В подобных случаях Excel выступает клиентским, a Word — серверным приложением. Более того, можно создать приложение Visual Basic, которое управляет работой Excel. Процесс управления одного приложения другим часто называется
OLE-автоматизацией, или ActiveX-автомагпизацией (известно, что фирма Microsoft часто меняет его же внедренную терминологию).
Под автоматизацией подразумевается достаточно привлекательная технология. Разработчик, которому необходимо создать диаграмму, может обратиться к другому приложению, получить от него объект C h a r t и использовать свойства и методы этого объекта. Автоматизация в некотором смысле, размывает границы между приложениями. Конечный пользователь может работать с объектом Access и даже об этом не подозревать.
Некоторые приложения (и Excel в том числе) могут выступать как клиентскими, так и серверными программами. Отдельные приложения функционируют только как клиентские или только как серверные программы.
В этом разделе продемонстрированы способы использования VBA для получения доступа и для управления объектами, которые предоставляются другими приложениями. В приведенных примерах используется только программа Microsoft Word, но рассматриваемая концепция в одинаковой степени относится ко всем приложениям, которые предоставляют собственные объекты для автоматизации (с течением времени таких приложений становится все больше).
Работа с внешними объектами
Как известно, в Excel можно использовать команду Вставка^Объект, чтобы встраивать объект (например, документ Word) в рабочий лист. Кроме того, существует возможность создать объект и манипулировать им в VBA. (Это возможно благодаря все той же технологии автоматизации.) При таком подходе программе предоставляется полный доступ к объекту. Разработчикам подобная технология обычно нравится больше, чем встраивание объекта в рабочий лист. Когда объект встроен, пользователь должен точно знать, как пользоваться приложением, которому принадлежит объект. Но если для управления объектом применяется код VBA, можно настроить объект так, что пользователь будет управлять им с помощью таких простых операций, как щелчок на кнопке.
Ранняя и поздняя привязка
Перед началом работы с внешним объектом необходимо создать его экземпляр. Данного результата можно достичь двумя способами: с помощью ранней или поздней привязки. Привязка обозначает установку соответствия между вызовами тех функций, которые создает разработчик, и фактическим кодом, выполняемым при запуске функции.
530 |
Глава 20. Взаимодействие с другими приложениями |
Ранняя привязка
На этапе разработки можно создать ссылку на библиотеку объектов с помощью команды ToolS^References редактора VBE. Выполнение этой команды приведет к отображению диалогового окна, показанного на рис. 20.4.
В Excel 2002 окно Project Explorer содержит список всех ссылок, которые добавлены в проект.
После создания ссылки на библиотеку объектов можно использовать окно Object Browser (показанное на рис. 20.5) для просмотра имен, методов и свойств объектов.
При использовании ранней привязки необходимо создать ссылку на конкретную версию библиотеки объектов. Например, можно указать Microsoft Word 8.0 Object Library, Microsoft Word 9.0 Object Library или Microsoft Word 10.0 Object Library. После этого используется следующий оператор для создания объекта:
Dim WordApp As New Word,Application
Применение ранней привязки для создания объекта с помощью ссылки на библиотеку объектов является более эффективным методом, который обеспечивает большую производительность приложения. Ранняя привязка может использоваться только тогда, когда контролируемый объект имеет отдельный файл библиотеки типов или библиотеки объектов. Кроме того, необходимо удостовериться, что в компьютере пользователя установлена необходимая версия библиотеки объектов.
Рис. 20.4. Добавление ссылки на файл биб- |
Рис, 20.5,. Использование окна Object Browser для полу- |
лиотекиобъектов |
чения информацииобобъектахвбиблиотеке |
Ранняя привязка позволяет применять константы, которые объявлены в библиотеке объектов. Например, Word (как и Excel) содержит ряд предопределенных констант, которые можно использовать в коде VBA. В ранней привязке в создаваемом коде можно вводить эти константы. Если используется поздняя привязка, вам придется обратиться к фактическому значению константы, а не к ее имени. Еще одним преимуществом ранней привязи является возможность использования окна Object Browser и параметра Auto List Members в редакторе VBE для получения простого способа доступа к свойствам и методам объектов. Такая возможность не представлена в поздней привязке, так как тип объекта определяется только на этапе выполнения.
ЧастьV.Совершенныеметодыпрограммирования |
531 |
Поздняя привязка
На этапе выполнения можно использовать или функцию CreateObject для создания объекта, или функцию GetObject для получения сохраненного объекта. Такие объекты объявляются как объекты универсального типа Object. Ссылка на объекты задается на этапе выполнения.
Позднюю привязку можно применить даже тогда, когда неизвестна версия библиотеки объектов, установленной в операционной системе. Например, следующий код, который управляет Word 97 и более поздними версиями, создает объект Word:
Dim WordApp As Object
Set WordApp = CreateObject("Word.Application")
Если в системе установлено несколько версий Word, то можно создать объект определенной версии. Приведенный ниже оператор управляет объектом Word 2000:
Set WordApp = CreateObject("Word.Application.9")
Параметр в реестре Windows для объекта Word Automation, а также ссылка на объект Application в VBA оказались одинаковыми: Word. Application. Но они указывают на разные элементы. Когда объект объявляется с помощью оператора As Word. Application или As New Word. Application, то этот термин обозначает объект Application в библиотеке Word. А если вызвать функцию CreateObject ("Word. Application"), то термин будет ссылаться на параметр, под которым последняя версия Word известна в системном реестре Windows. Данное утверждение не относится ко всем объектам автоматизации, хотя и справедливо для основных компонентов Office XP. Если пользователь заменит Word 2000 на Word 2002, то функция CreateObject ("Word.Application") будет действительной — она ссылается на новое приложение. Но если удалить Word 2002, то функция CreateObject ("Word. Application. 10 "), обращающаяся непосредственно к Word 2002, работать не будет.
Функция CreateObj ect, которая обращается к таким объектам автоматизации, как Word. Application или Excel .Application, всегда возвращает новый экземпляр объекта, т.е. запускается новая копия приложения. Поэтому в случае, когда объект автоматизации уже запущен, запускается новый экземпляр, после чего создается новый объект указанного типа.
Для того чтобы использовать текущий экземпляр или чтобы запустить приложение и заставить его загрузить сохраненный файл, необходимо воспользоваться функцией GetObj ect.
Если необходимо использовать автоматизацию в приложениях Office, то рекомендуется выполнять раннюю привязку к самой ранней версии программного продукта, который установлен в системе. Например, если требуется реализовать автоматизацию с Word 97, Word 2000 и Word 2002, то следует использовать библиотеку типов Word 97, чтобы обеспечить совместимость со всеми тремя версиями. Таким образом гарантируется невозможность использования уникальных функций, предоставляемых более поздними версиями Word.
Функции GetObject и CreateObject
Функции VBA GetObject и createObjed: возвращают ссылки на объект, но работают совершенно по-разному.
Функция CreateObject используется для создания интерфейса нового экземпляра приложения. Эту функцию необходимо использовать, если приложение еще не запущено. Если экземпляр приложения уже существует, то будет создан новый экземпляр. Например, представленный далее оператор загружает Excel и возвращает в переменную XLApp ссылку на созданный объект Excel. Application:
Set XLApp = CreateObject("Excel.Application')
532 |
Глава 20, Взаимодействие сдругими приложениями |
Функция Getobject используется приложением, которое уже запущено, или применяется для загрузки файла в запускаемом приложении, Следующий оператор, например, эапускэет Excel и загружает в него файл M y f i l e . x l s . В переменную хьвоок возвращается ссылка на объект workbook (файл Myfile . xls):
Set XLBook = GetObject("С:\Myfile.xls")
Простой пример
Приведенный пример демонстрирует создание объекта Word с помощью поздней привязки. Рассматриваемая процедура создает объект, отображает номер версии, закрывает приложение Word и уничтожает созданный объект (освобождая используемую память).
Sub GetWordVersionl)
Dim WordApp As Object
Set WordApp tt CreateObject {"Word. Application") MsgBox WordApp.Version
WordApp.Quit
Set WordApp = Nothing End Sub
Созданный объект word остается невидимым. Если необходимо, чтобы в процессе обработки объект word отображался на экране, то установите его свойство V i s i b l e в значение True с помощью следующего оператора:
WordApp.Visible = True
Данный пример можно запрограммировать с помощью ранней привязки. Однако вначале воспользуйтесь командой Toolso References для создания ссылки на библиотеку объектов Word. После этого можно применить приведенный ниже код.
Sub GetWordVersionf)
Dim WordApp As New Word.Application MsgBox WordApp.Version WordApp.Quit
Set WordApp - Nothing End Sub
Управление приложением Word из Excel
Пример, представленный в этом разделе, отображает сеанс автоматизации программы Word в Excel. Процедура MakeMemos создает три заметки в Word, после чего сохраняет их в отдельных файлах. Информация, которая использовалась для создания заметок, показана на рис. 20.6.
Рис.20.6.Wordавтоматическигенерируеттризаметки наосноведанныхприложенияExcel
ЧастьV.Совершенныеметодыпрограммирования |
533 |
Процедура MakeMemos, отображенная и листинге 20.3, начинается с запуска объекта WordApp. После этого просматриваются три строки данных на листе Лист1, затем используются свойства и методы объекта Word для создания каждой заметки и сохранения ее в отдельном файле. Диапазон Message (в ячейке Е6), содержит текст, который применяется для создания записок.
Листинг 20.3. Генерация документов Word на основе данных в Excel
Sub MakeMemos{) |
|
|
||
1 |
Создание заметок в Word с помощью автоматизации (позднее связыва- |
|||
ние) |
|
|
|
|
|
Dim WordApp As |
Object |
||
|
Dim Data As Range, message As String |
|||
|
Dim Records As |
Integer, i As Integer |
||
|
Dim Region As |
String, SalesAmt As String, SalesNum As String |
||
|
Dim SaveAsName |
As String |
||
1 |
Запуск Word и |
создание объекта |
||
|
Set WordApp |
= |
CreateObject("Word.Application") |
|
1 |
Информация |
с рабочего листа |
||
|
Set Data = Sheets("Лист1").Range{"Al") |
|||
|
message |
= Sheets("Лист1").Range("Message") |
||
1 |
Просмотр |
записей в Лист1 |
Records = Application.CountA(Sheets("ЛистГ1) .Range("A:A"))
For i = 1 To Records
1Обновление сообщения в строке состояния Application.StatusBar = "Создание сообщений " & i
' |
Назначение данных переменным |
|
|
|
|
Region = Data.Cells(i, 1).value |
|
|
|
|
SalesNum = Data.Cells(i, 2).Value |
|
||
|
SalesAmt = Format(Data.Cells{i, |
3).Value, "#,000") |
||
1 |
Определение имен файлов |
|
|
|
|
SaveAsName = ThisWorkbook.Path & "\" & Region & ".doc" |
|||
' |
Передача команд в Word |
|
|
|
|
With WordApp |
|
|
|
|
.Documents.Add |
|
|
|
|
With .Selection |
|
|
|
|
.Font.Size = 14 |
|
|
|
|
.Font.Bold = |
True |
|
|
|
.ParagraphFormat.Alignment |
= 1 |
||
|
. T y p e T e x t |
T e x t : = " M |
Е М О Р А Н Д У М " |
|
|
.TypeParagraph |
|
|
|
|
.TypeParagraph |
|
|
|
|
.Font.Size = |
12 |
|
|
|
.ParagraphFormat.Alignment |
= 0 |
||
|
-Font.Bold = |
False |
|
|
|
..TypeText Text : = "Дата: " & vbTab & _ |
|||
|
Format(Date, "mmmm d, |
yyyy") |
||
|
.TypeParagraph |
|
|
|
|
.TypeText Text:="Кому: менеджеру " & vbTab & Region |
|||
534 |
|
Глава 20. Взаимодействие с другими приложениями |
.TypeParagraph
.TypeText Text:="OT:" & vbTab & _ Application.UserName
.TypeParagraph
.TypeParagraph
.TypeText message
.TypeParagraph
.TypeParagraph
.TypeText Text: =" Продано товара:" & vbTab & SalesNuin
.TypeParagraph
.TypeText Text:="На сумму:" & vbTab & _ Format(SalesAmt, "$#,##0 ">
End With
.ActiveDocument.SaveAs FileName:=SaveAaName
End With Next i
1Удаление объекта WordApp.Quit
Set WordApp = Nothing Обновление строки состояния
Application.StatusBar = ""
MsgBox Records & " заметки создано и сохранено в папке " &
ThisWorkbook.Path
End Sub
На рис. 20.7 показандокумент, созданныйс помощью процедурыMakeMemos.
Fwc, 20.7. Этот документ создан с помощью макроса Excel
Создание этого макроса состояло из нескольких этапов. Все началось с записи макроса в Word. Записывались действия по созданию нового документа, добавлению и форматированию текста, а также сохранению файла. Этот макрос Word предоставил необходимую информацию о свойствах и методах объекта Word. После этого макрос был скопирован в модуль кода Excel. Обратите внимание, что использовался оператор with - End with . Перед каждой
ЧастьV.Совершенныеметодыпрограммирования |
535 |
инструкцией между With н End With была добавлена точка. Например, первоначальный макрос Word содержал (среди прочих) приведенный ниже оператор:
Documents.Add
Макрос был модифицирован следующим образом:
With WordApp
.Documen t s.Add
1 другие инструкции End With
Макрос, записанный в Word, использовал несколько встроенных констант. По причине того, что в данном примере используется поздняя привязка, пришлось заменить константы их фактическими значениями. Значения можно узнать в окне Immediate редактора VBE в Word.
Управление Excel из другого приложения
Вы имеете возможность управлять Excel из другого приложения (из программы Visual Basic или из макроса Word) — например, если необходимо провести некоторые расчеты в Excel, а результаты передать обратно в документ Word.
Создайте один из следующих объектов Excel с помощью указанной рядом функции.
•Объект Application — функция CreateObject ("Excel .Application") -
•Объект Workbook — функция CreateObject ("Excel .Sheet").
•Объект Chart — функция CreateObject ("Excel .Chart").
Влистинге 20.4 показана процедура, которая расположена в модуле кода VBA документа Word 2002. Эта процедура создает объект Excel Worksheet (представленный параметром Excel. Sheet) на основе существующей рабочей книги.
Листинг 20.4. Создание рабочего листа Excel из документа Word 2002
Sub MakeExcelChart()
Dim XLSheet As Object
' Создание документа Documents.Add
1Запрос значений
StartVal = lnputBox("Начальное значение")
PctChange = InputBox("Относительное изменение")
1 Создание объекта Sheet
Wbook = ThisDocument.Path & "Nprojections.xls"
Set XLSheet = GetObject(Wbook, "Excel.Sheet").ActiveSheet
1Добавление значений на лист
XLSheet.Range("StartingValue") = StartVal XLSheet.Range{"PctChange") = PctChange XLSheet.Calculate
1Вставка заголовка страницы Selection.Font.Size = 14 Selection.Font.Bold = True
Selection.TypeText "Месячный прирост: " & _
Format(PctChange, -0.0%")
536 |
Глава 20. Взаимодействие с другими приложениями |
Selection.TypeParagraph
Selection.TypeParagraph
' Копирование данных листа и вставка в документ XLSheet.Range("data").Copy
Selection.Paste
1Копирование диаграммы и вставка в документ XLSheet.Chartobjects(l).Copy Selection.PasteSpecial _
Link:=False,
DataType:=wdPasteMetafilePicture, _
Placement:=wd!nLine, DisplayAsIcon:=False
'Удаление объекта
Set XLSheet = Nothing
End Sub
Первоначальная рабочая книга показана на рис. 20.8. Процедура MakeExcelChart запрашивает у пользователя два значения и вставляет их в рабочий лист.
_
Рис.20.8.ПроцедураVBAвWordиспользуетэтотрабочийлист
Пересчет листа приводит к обновлению диаграммы. После этого данные и диаграмма копируются из объекта Excel и вставляются в новый документ. Результат показан на рис. 20.9.
Работа с ADO
ADO (ActiveX Data Object) является объектной моделью, которая позволяет осуществлять доступ к данным, хранящимся в различных форматах. Важно то, что такая методика позволяет использовать единую объектную модель для всех баз данных объектов. Представляемая технология доступа к данным является самой предпочтительной. Однако не путайте ее с DAO (Data Access Objects).
В настоящем разделе приводится простой пример использования ADO для получении данных из базы данных Access.
Программирование с использованием ADO— это сложная и серьезная тема. Если в приложении Excel вы решили получить доступ к внешним данным, то вам потребуются более глубокие знания. Обратитесь к книгам по программированию, которые рассматривают этот вопрос подробнее.
ЧастьV.Совершенныеметодыпрограммирования |
537 |
Рис. 20,9. Процедура VfiA в Wordиспользует Excelдля созданиядокумента
В следующем примере данные будут получены из базы данных Access, которая называется budget .mdb. Эта база данных содержит одну таблицу (которая называется Budget). Таблица состоит из семи полей. В рассматриваемом примере запрашиваются только записи, в которых поле Пункт содержит значение Рента, а поле Подразделение — значение С. Америка. Полученные данные хранятся в объекте Recordset. После получения данные передаются на рабочий лист (рис, 20.10).
Sub ADO_Demo()
1 |
Этот пример требует использования ссылки на |
'библиотеку Microsoft ActiveX Data Objects 2.x
|
Dim DBFullName As |
String |
||
|
Dim Cnct As |
String, Src As String |
||
|
Dim Connection As |
ADODB.Connection |
||
|
Dim Recordset |
As |
ADODB.Recordset |
|
|
Dim Col As |
Integer |
||
|
Cells.Clear |
|
|
|
|
MsgBox "Это приложение извлекает данные из записей _ |
|||
|
Пункт = Рента и Подразделение = С. Америка." |
|||
1 |
Информация |
о |
базе данных |
|
|
DBFullName |
= |
ThisWorkbook.Path & "\budget.mdb" |
|
1 |
Открытие соединения |
|||
|
Set Connection = New ADODB.Connection |
|||
|
Cnct = "Provider=Microsoft.Jet.OLEDB.4.0; " |
|||
538 |
|
|
|
Глава 20. Взаимодействие с другими приложениями |