Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5401.pdf
Скачиваний:
5
Добавлен:
13.11.2022
Размер:
1.36 Mб
Скачать

37

Приложение

Проект 1

Модуль 1

Declarations

Процедура 1

Процедура 2

Процедура N

Модуль 2

Модуль N

Проект 2

Проект N

Рис. 6. Структура VBA-программы

Модуль – это часть программы, оформленная в виде, допускающем его независимую трансляцию. Модуль состоит из двух разделов: раздел объявлений Declarations и раздел процедур и функций. В разделе Declarations описываются глобальные объекты. Второй раздел содержит весь программный код исполнимых операторов, оформленный в процедуры и функции.

Событийное управление

Событийное управление – это способ управления выполнением программы, основывающийся на следующей идее. Имеется некоторое предопределенное множество поименованных событий. События связаны с

38

некими объектами явным или неявным образом. События могут возникать. Возникновение события подразумевает, что состояние системы изменилось. С каждым событием связана процедура, которая называется реакцией на событие. При возникновении события автоматически вызывается процедура реакции. В системе программирования VBA предусматривается большое число разнообразных событий, реакции на которые можно использовать в программах. Например, нажатие клавиши на клавиатуре, наведение указателя мыши на определенную область экрана, достижение таймером определенного значения, открытие файла. В программе, управляемой событиями, нет определенного потока управления. Управление происходит в форме вызовов процедур реакции. Такое событийное управление реализуется в виде интерфейса пользователя, в котором события связываются с командами разрабатываемого приложения.

Интерфейс пользователя собирается из готовых компонентов, называемых элементами управления (controls). Элементы управления собраны в библиотеки готовых компонентов системы программирования VBA.

В нашем случае написанные нами подпрограммы (макросы) будут отрабатывать при нажатии пользователем на кнопки команд, связанные с этими подпрограммами.

Объектная модель Word

Программный код VBA открывает неожиданные возможности для создания проектов в текстовом редакторе. Например, используя объект Font, можно создать проект, сокращающий время на форматирование текста, или можно создать проект для синтаксического разбора предложений, где используются формы с элементами управления Кнопка (CommandButton), которые связаны с определенными членами предложения [1 – 6, 15 – 18].

Разберем на примерах несколько важных объектов Word и проиллюстрируем операции с этими объектами, применение важнейших их свойств и методов, которые используются при создании приложений на базе документа Word.

Приложение Word работает в виде запрограммированных операций, которые доступны пользователю как команды из меню или кнопки на панелях инструментов в пользовательском интерфейсе. Поддержку команд, выбираемых из GUI обеспечивает нижележащая архитектура в коде VBA.

Microsoft Word является сегодня одним из самых распространенных в мире программных продуктов. Большинство пользователей Word обходятся без написания кода, хотя Word предоставляет богатую модель объектов

39

(порядка двухсот объектов), к каждому из которых можно обратиться из программы на VBA. Оболочкой всего приложения является объект Application, каждый открытый документ представляется объектом Document, объект Paragraph соответствует одному абзацу и так далее. Манипулировать этими объектами позволяют их многочисленные методы и свойства. Не описывая подробно все члены этой модели, дадим общее представление об объектной модели Word, по отдельным методам и свойствам специфических членов этих объектов рекомендуется пользоваться встроенной справочной системой Word [13, 14].

Объекты Word иерархически упорядочены, на вершине этой иерархии находятся два класса: Application и Document (см. рис. 7). Из рисунка видно, что объектная модель Word весьма запутана. Многие объекты в ее иерархии перекрываются: объекты Document и Selection являются членами объекта Application, а объект Document – член объекта Selection. И Document, и Selection содержат объекты Bookmark и Range.

Application

Document

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bookmark

 

 

Range

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Range

 

 

Bookmark

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Selection

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bookmark

 

 

Range

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Range

 

 

 

Document

 

 

 

 

 

 

 

 

 

 

 

 

 

Bookmark

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Range

 

 

Bookmark

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7. Объекты верхнего уровня и их взаимодействие

Объект Application представляет само приложение Word и является предком всех остальных объектов. Объект Application создается при

40

запуске Word. Объект Application имеет несколько десятков свойств и методов.

Свойство объекта Application ActiveWindow представляет окно, которое находится в фокусе, ActiveDocument– активный документ, Caption хранит текст заголовка окна приложения, свойство CapsLock определяет, включен ли режим CapsLock, DisplayStatusBar отображает или скрывает строку состояния, Path хранит путь приложения, Options представляет параметры диалогового окна Tools Options, Selection содержит выделенный фрагмент, UserName – имя пользователя, свойство Visible управляет отображением или скрытием окна всего Word и т.д.

’пример изменения заголовка приложения

Application.Caption = ”Мой новый заголовок”

Метод объекта Application CheckSpelling проверяет правописание, сами ошибки не исправляет, метод Help отображает окно определенного типа WdHelpType: WdHelp – окно справки по MS Word,

WdHelpAbout – окно О программе, WdHelpSearch – Help с Answer Wizard, метод Move перемещает окно приложения в Left, Top (целые, в точках), метод Resize задает размеры окна приложения Width на Height, метод Quit закрывает приложение Word.

’пример вывода на экран окна О программе

Application.Help(Word.WdHelpType.wdHelpAbout)

Некоторые свойства объекта Application представляют собой коллекции. Коллекция или семейство (от collections – набор объектов) – это упорядоченный набор однородных объектов. Эта структура данных представляет из себя динамический массив записей. В коллекции есть методы нумерации элементов семейства, как в массиве, и методы прямого доступа по ключевому полю, как правило по имени. При удалении элемента из семейства в нем не остается дыр, индексы перенумеровываются, количество элементов (свойство семейства count) уменьшается на единицу. Рассмотрим три коллекции объекта Application: коллекцию стандартных диалоговых окон Dialogs, коллекцию открытых в приложении документов Documents и коллекцию закладок Bookmarks.

Коллекция Dialogs составляет более 200 диалоговых окон Word, используется для приема пользовательского ввода. Тип диалога заказывается

41

через значения перечислимого WdWordDialog. Например, следующий код выводит на экран диалог FileNew.

’создание диалогового окна

Dim dlg As Word.Dialog

’конкретизация диалога на FileNew

Set dlg = Application.Dialogs(wdDialogFileNew)

’отображение на экран окна FileNew dlg.Show

Метод объекта Dialog Show выводит диалоговое окно так, будто пользователь вручную выбрал его из меню, принимает необязательный параметр TimeOut (мс), по истечении которого окно закрывается. Метод Display работает как Show и возвращает переменную типа Integer в зависимости от того, какой кнопкой пользователь закрыл окно. Метод не выполняет операций, за которые ответственен данный диалог. Если пользователь щелкает кнопку Ok, внесенные изменения должны быть программно сохранены, а по кнопке Cancel отменены. Метод Execute применяет изменения, внесенные через диалоговое окно, используется в паре с методом Display. Метод Save сохраняет пользовательские изменения. Метод Update дает возможность программной модификации содержимого диалогового окна.

Коллекция Documents состоит из открытых в приложении документов. При открытии существующего документа или создания нового, создается объект Document, добавляемый в коллекцию Documents. Документ, на который установлен фокус ввода, называется активным, и его представляет свойство ActiveDocument объекта Application Application.ActiveDocument. Для эффективности кода Word поддерживает ссылку на активный документ ThisDocument, чтобы не обращаться часто к нему по индексу. Этот номер конкретного документа в массиве Documents, а также количество открытых документов меняются в зависимости от действий пользователя. В большинстве случаев работа идет с одним документом, для перебора всех документов в коллекции используется цикл For...Each.

’пример получения имени активного документа

Dim str As String

Str = ThisDocument.Name Selection.TypeText Text:=" " + str

42

Объект Document представляет один документ из коллекции всех открытых документов. Объект состоит из символов, упорядоченных в слова, слов – в предложения, а тех – в абзацы, которые, в свою очередь, могут быть упорядочены в разделы (sections). В каждом разделе свои верхние и нижние колонтитулы (headers/footers) и т.д. Объект Document включает следующие коллекции объектов:

Characters;

Words;

Sentences;

Paragraphs;

Sections;

Headers/Footers;

Все операции над документом: создание, открытие и закрытие документа, добавление, поиск и замена текста, печать реализуются методами объекта Document.

Метод Documents.Add создает новый документ, который добавляется в коллекцию открытых документов Documents (поэтому add). В метод необязательным параметром подается имя шаблона, на базе которого создается документ. По умолчанию новый документ создается на основе стандартного шаблона Normal.dot, он устанавливается при инсталляции Word. Это равносильно щелчку по кнопке Создать на Стандартной панели инструментов. Поэтому только что созданный документ может содержать стереотипный текст, стили, код макросов, панели инструментов, горячие клавиши и элементы автотекста, пришедшие в документ из шаблона.

’создание нового документа на базе Normal.dot Application.Documents.Add

Метод Open(”полное имя файла”) открывает существующий документ, имеет необязательные аргументы: пароль и флаг Только для чтения. Метод Save сохраняет документы, его параметр NoPrompt=False, по умолчанию, выводит пользователю запрос на сохранение, при NoPrompt=True сохраняет все открытые документы без участия пользователя. Метод SaveAs(”новое имя файла”) сохраняет документ под другим именем. Метод Close закрывает документ, его можно применять также к коллекции Documents для закрытия всех

43

документов. Его необязательный аргумент SaveChanges может принимать значения WdSaveOptions: wdPromptToSaveChanges, по умолчанию, выводит приглашение пользователю сохранить изменения во всех несохраненных документах, wdDoNotSaveChanges или wdSaveChanges. Закрытие всех открытых документов не приводит к закрытию Word, это делает метод Application.Quit.

’пример сохранения активного документа

ThisDocument.Save

’сохранение всех документов

Application.Documents.Save

Объект Selection представляет текущую выделенную область документа. Для выполнения какой-либо операции в пользовательском интерфейсе Word необходимо предварительно выделить фрагмент текста, а затем применить нужные параметры форматирования, например, полужирное начертание. Для этого в коде используется объект Selection: он определяет выделенный фрагмент, над которым будет производиться операция форматирования, печати или другого манипулирования. Объект Selection всегда присутствует в документе. Если ничего не выделено, он представляет курсор ввода (Insertion Point). Именно этим объектом, не объявляя новых переменных, манипулирует макрорекордер при записи макросов.

Свойство Type объекта Selection хранит тип выделенного фрагмента, который может быть одним из значений перечислимого типа

WdSelectionType:

WdSelectionBlock – фрагмент документа; wdSelectionColumn – колонка Word-таблицы; wdSelectionFrame – рамка; wdSelectionInlineShape – объект в слое текста; wdSelectionIP – курсор ввода (Insertion Point); wdSelectionNormal – нормальный фрагмент текста; wdNoSelection;

wdSelectionRow – строка Word-таблицы; wdSelectionShape – объект в слое рисования.

Следующие методы объекта Selection по навигации и выделению текста реализуют нажатия клавиш на клавиатуре.

HomeKey([Unit], [Extend])

EndKey([Unit], [Extend]) MoveLeft([Unit], [Count], [Extend])

44

MoveRight([Unit], [Count], [Extend]) MoveUp([Unit], [Count], [Extend]) MoveDown([Unit], [Count], [Extend]),

где в аргументе Extend указывается одно из значений перечислимого WdMovementType: WdMove – перемещение курсора ввода или WdExtend – расширение выделенного фрагмента от курсора ввода до конечной позиции (как при нажатом Shift). Аргумент Count определяет, на сколько единиц производить изменения. Unit – в каких единицах производится перемещение, задается одним из значений перечислимого wdUnits. Для методов HomeKey и EndKey: WdLine – начало/конец строки, по умолчанию; WdStory – начало/конец документа; WdColumn и WdRow – начало/конец столбца/строки таблицы. Для методов MoveLeft и MoveRight: wdCharacter – в символах, по умолчанию; WdWord

в словах; wdCell – в ячейках для таблиц; wdSentence – в предложениях. В методах MoveUp и MoveDown: wdLine – в строках, по умолчанию; wdParagraph – в абзацах; wdWindow – в единицах окна; wdScreen

в единицах экрана. Каким получится выделенный фрагмент, зависит от того, где находился курсор ввода и был ли выделен диапазон текста в начале данной операции.

Примеры:

’перемещение курсора в начало документа

Selection.HomeKey Unit:=wdStory, Extend:=wdMove

’выделение текста от курсора до конца документа

Selection.EndKey Unit:=wdStory, Extend:=wdExtend

’перемещение курсора влево на 3 символа

Selection.MoveLeft Unit:=wdCharacter, Count:=3, _ Extend:=wdMove

’выделение 3 слов справа от курсора ввода

Selection.MoveRight Unit:=wdWord, Count:=3, _ Extend:=wdExtend

’перемещение курсора ввода на одну строку вверх

Selection.MoveUp Unit:=wdLine, Count:=1, _ Extend:=wdMove

’выделение следующих 3 абзацев

Selection.MoveDown Unit:=wdParagraph, Count:=3, _ Extend:=wdExtend

Метод TypeText объекта Selection вставляет текст в документ. Поведение TypeText зависит от режима вставки/замены текста.

45

В следующем коде объявляется объектная переменная типа Word.Selection для Selection. Затем сразу, чтобы с гарантией новый текст вставлялся, раздвигая символы вправо, а не перезаписывался вместо старого текста, отключается режим замещения Overtype Option.

Dim sln As Word.Selection Set sln = Selection

’отключение режима забоя

Application.Options.Overtype = False

’вставка текста вызовом TypeText sln.TypeText Text:="вставляемый текст"

’добавление абзаца вызовом метода TypeParagraph sln.TypeParagraph

Объект Range представляет непрерывный диапазон в документе и определяется позициями начального и конечного символов. Объект Range предназначен для операций над текстом и дает больший контроль за вставкой текста и различными операциями над ним, чем. Характеристики объ-

екта Range:

Объект Range, как и объект Selection, может включать только курсор ввода, диапазон текста или весь документ.

Объект Range содержит непечатаемые символы: пробелы, знаки табуляции, знаки конец абзаца и т.п.

В одном документе можно определить несколько объектов Range.

Объект Range может быть областью как соответствующей, так и не соответствующей текущему выделенному фрагменту.

Объект Range является динамическим, то есть существует до тех пор, пока выполняется создавший его код.

Вставка текста в конец диапазона Range автоматически расширяет диапазон так, чтобы новый текст входил в диапазон.

У объектов Selection и Range много общих членов. Разница между этими объектами в том, что Selection ссылается на то, что выделено пользователем в GUI, а Range не отображается, хоть это и возможно вызовом его метода Select. При использовании объекта Selection теряется выделенный пользователем фрагмент. Диапазон Range используется для работы с некоторой частью документа без изменения выделенного пользователем фрагмента.

46

Определить диапазон в документе можно вызовом метода Range объекта Document с передачей начального и конечного значений. Следующий код создает новый объект Range, который включает первые семь символов в активном документе, в том числе непечатные знаки. Далее он обращается к методу Select объекта Range, чтобы выделить подсветкой полученный диапазон. Если опустить эту строку кода, объект Range будет невидим в пользовательском интерфейсе Word, но им все равно можно манипулировать программным способом. Результат показан на рис. 8, в диапазон включены знак конца абзаца и пробел.

Dim rng As Word.Range

Set rng = ThisDocument.Range(0,7) rng.Select

Рис. 8. Объект Range, который включает непечатные символы

Первый символ в документе имеет позицию 0, здесь при открытии документа изначально находится курсор ввода. Позиция последнего символа равна общему числу символов в документе. Определить количество символов в документе можно через свойство Count набора Characters.

’вывод в Message Box количества символов в документе MsgBox"Всего символов в документе " & _

ThisDocument.Characters.Count

’выделение всего документа

Dim rng As Word.Range

Set rng = ThisDocument.Range(0, _ ThisDocument.Characters.Count)

rng.Select

Если необходимо работать со всем содержимым документа, указывать начальную и конечную позиции необязательно. Метод Range без параметров возвращает диапазон, равный всему документу.

47

’более эффективный способ выделения всего документа

Dim rng As Word.Range

Set rng = ThisDocument.Range rng.Select

Для определения диапазона можно использовать методы и свойства объектов Paragraphs, Sentences, Words и Characters. Эти объек-

ты являются массивами, в отличие от коллекции Documents, в которой конкретные элементы выбираются циклом For...Each. Поэтому к элементам этих массивов можно обращаться по индексам, как к любым другим массивам. Например, выделим второе предложение в активном документе, определив диапазон как объект Sentence.

Dim rng As Word.Range

Set rng = ThisDocument.Sentences(2) rng.Select

Расширение диапазона осуществляется методами MoveStart и MoveEnd ответственного за этот диапазон объекта Range. Оба метода принимают два одинаковых аргумента: Unit и Count Аргумент Unit принимает одно из значений перечислимого WdUnits:

WdCharacter,

WdWord,

WdSentence,

WdParagraph,

WdSection,

WdStory,

WdCell,

WdColumn,

WdRow,

WdTable.

Аргумент Count указывает число единиц, на которое надо переместить начало или конец диапазона. В следующем примере определяется диапазон, состоящий из первых семи символов в документе. Затем диапазон выделяется и выводится MessageBox, чтобы сделать паузу перед выполнением следующего блока кода. Затем код вызывает метод

48

MoveStart объекта Range для смещения начальной точки диапазона на семь символов. После этого получается диапазон, состоящий лишь из курсора ввода. Далее код сдвигает конечную позицию диапазона на семь символов вызовом MoveEnd.

’определяем диапазон из 7 символов

Dim rng As Word.Range

Set rng = ThisDocument.Range(0, 7) rng.Select

MsgBox "определили диапазон из семи символов" ’смещаем начальную позицию на 7 символов вправо rng.MoveStart Unit:=wdCharacter, Count:=7 rng.Select

MsgBox "сместили начало диапазона на семь символов" ’смещаем конечную позицию на 7 символов rng.MoveEnd Unit:=wdCharacter, Count:=7

rng.Select

MsgBox "сместили конец диапазона на семь символов"

Операции, выполняемые этим кодом, иллюстрирует рис. 9. В верхней строке показан фрагмент документа с курсором вначале документа, во второй строке – начальный диапазон, в третьей – диапазон после вызова MoveStart, из-за которого он сворачивается в курсор ввода, а в четвертой – символы, выделенные после вызова MoveEnd.

Рис. 9. Применение методов MoveStart и MoveEnd для изменения размера диапазона

Для программного форматирования текста необходимо:

определить форматируемый диапазон через объект Range;

применить параметры форматирования;

при необходимости выделить отформатированный диапазон подсветкой.

49

В следующем примере выделяется первый абзац в документе и изменяется шрифт и размер шрифта, а также тип выравнивания.

’устанавливаем Range на первый абзац

Dim rng As Word.Range

Set rng = ThisDocument.Paragraphs(1).Range

’изменяем параметры форматирования

With rng

.Font.Size = 14

.Font.Name = "Arial"

.ParagraphFormat.Alignment = _ Word.WdParagraphAlignment.wdAlignParagraphCenter End With

rng.Select

Вставка или замена текста в документе осуществляется через свойство Text объекта Range. Следующий фрагмент кода задает диапазон, который представляет собой курсор ввода в начале документа, и вставляет текст ”Новый текст ” в позицию курсора ввода. Затем код выделяет подсветкой диапазон, включающий вставленный текст. Результат выполнения этого кода показан на рис. 10.

Dim str As String str = ”Новый текст ”

Dim rng As Word.Range

Set rng = ThisDocument.Range(0, 0) rng.Text = str

rng.Select

Рис. 10. Вставка нового текста в позицию курсора ввода

Если диапазон является выделенным фрагментом, а не курсором ввода, тогда существующий текст в диапазоне заменяется вставляемым. Следующий код создает объект Range, который состоит из первых 12 символов в документе и заменяет их новой строкой. Результат смотри на рис 11.

50

Dim str As String str = ”Новый текст ”

Dim rng As Word.Range

Set rng = ThisDocument.Range(0, 12) rng.Text = str

rng.Select

Рис. 11. Вставка нового текста поверх существующего

Объект Range на основе абзаца включает все непечатаемые символы абзаца, в том числе знак конца абзаца. В следующем примере показана корректная работа со знаками концов абзацев при вставке текста. В коде объявляются две строковые переменные, и извлекается содержимое первого и второго абзацев активного документа в эти переменные.

’получаем содержимое первого и второго абзацев

Dim str1 As String

str1 = ThisDocument.Paragraphs(1).Range.Text Dim str2 As String

str2 = ThisDocument.Paragraphs(2).Range.Text

Далее создаются две объектные переменные Range для первого и второго абзацев, а затем, используя свойство Text, меняется местами текст. В коде предусмотрены процедурами MsgBox остановки-сообщения перед обменом абзацев, см. рис. 12, во время обмена, см. рис. 13, и после обмена, см. рис. 14.

’определяем два диапазона

Dim rng1 As Word.Range

Set rng1 = ThisDocument.Paragraphs(1).Range Dim rng2 As Word.Range

Set rng2 = ThisDocument.Paragraphs(2).Range

’делаем паузу до обмена абзацев

51

Рис. 12. Исходный текст документа до манипуляций с абзацами

MsgBox ”текст 1-абзаца вставляем в 2-абзац” rng2.Text = str1

MsgBox ”второй абзац готов” + Chr(13)_ + Chr(10) + _

”текст 2-абзаца вставляем в 1-абзац”

Рис. 13. Замена текста второго абзаца

rng1.Text = str2

MsgBox ”первый абзац готов” + Chr(13) + Chr(10) + _ ”поменяли абзацы местами”

52

Рис. 14. Документ после обмена абзацев

Объект Bookmark (закладка) аналогичен объектам Range и Selection в том смысле, что он представляет непрерывную область в документе, заданную начальной и конечной позициями. Объект Bookmark может охватывать фрагмент от только курсора ввода до всего документа. В документе можно определить несколько закладок. Закладки так же, как Range и Selection, используются в качестве контейнера текста, но они к тому же позволяют пометить фрагмент в документе. Закладка – это именованная область документа, которая сохраняется вместе с ним. Следующие характеристики Bookmark отличают его от объекта Range.

Объекту Bookmark можно присваивать имя.

Объект Bookmark сохраняется вместе с документом и не уничтожается по завершении породившего его кода или после закрытия документа.

По умолчанию объект Bookmark скрыт, но его можно сделать видимым, установив свойство View объекта ShowBookmarks в True.

Создание закладки – это добавление ее в коллекцию Bookmarks, которая содержит все закладки в документе. Коллекция Bookmarks является членом объектов Document, Range и Selection. Следующий код иллюстрирует перебор набора Bookmarks и печатает имя каждой закладки в документе и содержимое ее свойства Range.Text прямо в конец этого же документа. На рис. 15 показан результат работы этого кода.

’перемещение курсора в конец документа

53

Selection.EndKey Unit:=wdStory, Extend:=wdMove

’печать заголовка

Selection.TypeParagraph

Selection.TypeText Text:=”Bookmarks and Contents”

Dim bmrk As Word.Bookmark

For Each bmrk In ThisDocument.Bookmarks Selection.TypeParagraph

Selection.TypeText Text:=”Name: ” + bmrk.Name _ + ” Contents: ” + bmrk.Range.Text

Next

MsgBox ”Bookmarks and Contents”

Рис. 15. Перебор коллекции закладок

Мы не рассматриваем программирование таких часто используемых в Word операций, как поиск и замена текста. В типичном варианте для перебора всего документа в поисках нужного текста, параметров форматирования или стиля используется объект Find, для замены каждого найденного элемента применяется метод Execute. А также не входит в наше рас-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]