Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Представленная далее процедура StartCalculator использует оператор AppActivate для активизации приложения, если оно уже запущено (в данном случае активизируется программа Microsoft Calculator (Калькулятор)). В качестве аргумента оператора AppActivate используется заголовок окна приложения. Если оператор AppActivare возвращает ошибку, то приложение Calculator (Калькулятор) еше не запущено. Если это так, то процедура запускает указанное приложение.

Sub StartCalculator(}

AppFile = "Calc.exe"

On Error Resume Next AppActivate "Calculator" If Err <> 0 Then

Err = 0

CalcTaskID = Shell(AppFile, 1)

If Err <> 0 Then MsgBox "Невозможно запустать" End If

End Sub

Этот примердоступен на Web-уэле издательства.

Запуск аплетов папки Панель управления и мастеров

Windows предоставляет в распоряжение пользователя большое количество системных диалоговых окон и мастеров, многие из которых расположены в окне Панель управления. В приложении Excel может понадобиться отобразить одно или несколько диалоговых окон из этой папки. Например, вы имеете возможность отобразить диалоговое окно Свойства: Дата и время, которое показано нарис. 20.2.

Основным условием для запуска системных диалоговых окон является указание правильного значения аргумента функции Shell. Следующая процедура использует значение аргумента, необходимое для открытия диалогового окна Свойства: Дата и время.

Рис. 20.2. Использование кода VBA для отображения аплета папки Панель управления

Рис.20.3. Эта форма позволяет отображатьсистемныедиалоговыеокна вExcel

Часть V. Совершенные методы программирования

529

Рабочая книга, демонстрирующая использование 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. Взаимодействие с другими приложениями

Соседние файлы в папке 2 семестр