Основы офисного программирования и документы Word

         

Автокоррекция (AutoCorrect)


Объект AutoCorrect поддерживает работу по автоматической коррекции набираемых текстов. Я широко использую возможности автокоррекции в своей работе. Чтобы не переключаться с русского на английский при печатании различных терминов, я ввел таблицу соответствующих замен. Теперь я печатаю "Ап", а получаю Application, печатаю "Во", а получаю Word и так далее. Возможности объекта AutoCorrect во многом совпадают с возможностями команды AutoCorrect (Автозамена) меню Tools. В следующем примере включаются все флажки, регулирующие процесс замены, и в коллекцию Entries, вложенную в объект, добавляются два элемента. Каждый элемент задается парой строк, первая из которых задает исходную строку, а вторая строку, заменяющую ее при автокоррекции печатаемого текста:

Public Sub WorkWithAutoCorrect() 'Работа с объектом AutoCorrect 'Включаются все флажки With AutoCorrect .CorrectInitialCaps = True .CorrectSentenceCaps = True .CorrectDays = True .CorrectCapsLock = True .ReplaceText = True .ReplaceTextFromSpellingChecker = True .CorrectKeyboardSetting = True

'В коллекцию Entries, задающую замены при автокоррекции, 'добавляются два элемента. .Entries.AddName:="ДЕ", Value:="Диаграмма Excel" .Entries.AddName:="ГЕ", Value:="График Excel"

End With End Sub

Листинг 1.9.

(html, txt)



Автомакросы


Автомакросы (Auto Macros) - это макросы со специально фиксированными именами. Они вызываются при возникновении ряда событий и являются альтернативным способом их обработки. Можно задействовать как обработчики событий, так и макросы, или оба механизма вместе. Вот макросы, автоматически запускаемые при возникновении соответствующего события в Word:

AutoExec - при запуске приложения Word;AutoNew - при создании нового документа;AutoOpen - при открытии существующего документаAutoClose - при закрытии документа;AutoExit - при выходе из приложения

Как и обработчики, макросы можно поместить непосредственно в документ или шаблон, на основе которого документ создается. Макрос будет выполняться, если он находится в активном документе, или в шаблоне Normal или в шаблоне, на основе которого открыт активный документ.

Давайте напишем макрос AutoOpen и поместим его в наш документ. Макрос будет выполнять действия процедуры OnEvents, связывая объект App1 класса EventsOfApp с текущим приложением, что позволит реагировать на события объекту Application. Текст его прост:

Sub AutoOpen() 'Связывание объекта Application с событиями Set App1.AppEv = Application End Sub

Листинг 1.70.

(html, txt)

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



Автозаголовки (AutoCaptions)


Коллекция объектов AutoCaptions (AutoCaption) представляет заголовки, которые могут быть автоматически добавлены при вставке в документ OLE-объектов. В эту коллекцию, конечно же, ни добавлять, ни удалять элементы не разрешается, но можно включить или отключить автоматическое добавление заголовка при вставке того или иного OLE-объекта. Работа вручную идет в уже упомянутом диалоговом окне, открываемом по команде Caption. Программно это можно делать так:

Public Sub >WorkWithAutoLabels() 'Работа с коллекцией автозаголовков Dim Item As AutoCaption



Debug.Print AutoCaptions.Count For Each Item In AutoCaptions 'Включение автоматической вставки заголовка item.AutoInsert = True Debug.Print Item .Name Next Item

End Sub

Листинг 1.7.

(html, txt)

Процедура WorkWithAutoLabels включает все автозаголовки и распечатывает их имена. Приведем первую семерку имен OLE-объектов из 28 объектов, которые можно добавить в текущий момент у меня на компьютере:

Листинг 1.8.

(html, txt)



Диалоги с пользователем. Коллекция Dialogs


Коллекция объектов Dialogs задает совокупность диалоговых окон, встроенных в Word. Добавлять новые или удалять элементы этой коллекции программным путем нельзя. Но соответствующие окна можно открыть и показать на экране дисплея и тем самым организовать диалог с пользователем по теме, заданной соответствующим окном. Коллекция Dialogs и объекты Dialog не принадлежат к общим объектам Office 2000. Вместе с тем в каждом из приложений Office 2000 есть свои объекты Dialogs и Dialog. В совокупности они составляют семейство схожих объектов, имея много общего в своем поведении и некоторую специфику, зависящую от приложения. Есть смысл хотя бы в одном приложении подробно разобраться с этими объектами, тогда в других приложениях можно будет ссылаться на знакомое поведение этих объектов.

Коллекция Dialogs устроена совсем просто. У нее стандартный для коллекций набор свойств - Count, Application, Creator, Parent и всего лишь один метод Item . Простота устройства коллекции понятна, поскольку ни добавить, ни убавить ничего нельзя, - все элементы встроены. Но, учтите, элементов у этой коллекции, то есть встроенных диалоговых окон достаточно много - более 200. К каждому из элементов коллекции можно добраться, зная его тип, задаваемый соответствующей константой, входящей в перечисление wdWordDialog.

Объект Dialog устроен более сложно. У него есть шесть свойств - Application, Creator, Parent, CommandName, Type, DefaultTab и четыре метода - Display, Execute, Show и Update. На четырех первых свойствах особо останавливаться не буду, - первые три стандартны, а четвертое, возвращающее имя процедуры, отображающей диалоговое окно, применяется разве что из любопытства. Свойство Type, имеющее статус "только для чтения", возвращает тип окна, - соответствующую константу из перечисления wdWordDialog. Более важным является свойство DefaultTab. Дело в том, что многие из открываемых окон устроены сложно и имеют различные вкладки. Если, используя это свойство, перед открытием окна установить нужную вкладку, то перед пользователем окно откроется на этой вкладке, что облегчит нелегкую жизнь пользователя. Каждая из возможных вкладок задается соответствующей константой, принадлежащей перечислению wdWordDialogTab.

Поговорим теперь о четырех методах объекта Dialog:

Show- открывает диалоговое окно, заданное объектом Dialog, после чего прерывает свою работу, давая возможность пользователю задать нужные установки в диалоговом окне и выполнить некоторые действия, для чего ему достаточно нажать ту или иную кнопку в диалоговом окне. Действия, предписанные пользователем, выполняются, и метод Show заканчивает свою работу, возвращая в качестве результата номер кнопки, нажатой пользователем. Значение - 2 соответствует кнопке Close, -1 - OK, 0 - Cancel, N>0 - командной кнопке с номером N. Вместо стандартных кнопок OK, Close, Cancel могут применяться эквивалентные по сути кнопки с другими названиями, например, "Открыть" вместо кнопки OK. Update - обновляет установки, принятые по умолчанию для диалогового окна. Чаще всего вызывается в самом начале работы с диалоговым окном, перед тем как задаются новые значения установок. Display - альтернатива методу Show. Также как и метод Show, открывает диалоговое окно и позволяет пользователю задать нужные установки и нажать кнопку. Однако не выполняет действия, предписанные пользователем, возвращая, по-прежнему, в качестве результата номер нажатой кнопки. После чего программа может проанализировать действия пользователя и принять окончательное решение, например, принять установки, вызвав метод Execute.Execute - применяет текущие установки диалогового окна.


Шесть свойств и 4 метода объекта Dialog - это лишь видимая часть айсберга, каковым является объект Dialog. Нужно понимать, что каждое диалоговое окно, то есть конкретный объект Dialog имеет множество дополнительных параметров (свойств), определяющих специфику этого объекта. Основные сложности работы с этим объектом связаны с пониманием сути параметров и установкой корректных их значений. Реально здесь могут возникать различные проблемы, о которых поговорим чуть позже при рассмотрении одного из примеров. Хочу еще несколько слов сказать об использовании этих объектов. Работа с ними предполагает, что в какой-то момент программа начинает диалог с пользователем на стандартную тему, для которой в системе Office 2000 заготовлено соответствующее окно. Часто, разумно при первом открытии окна дать возможность пользователю сделать свой выбор и установить подходящие значения параметров окна. Затем установки пользователя могут быть сохранены в объекте Dialog. При повторном открытии окна используется этот объект, и окно открывается с установками, повторяющими предыдущий выбор пользователя. К сожалению, сохранение всех установок не всегда возможно.

Давайте перейдем теперь к примерам и начнем с простой и классической задачи - открытия файла. Вот пример работы с одним из наиболее употребительных диалоговых окон - окном открытия файла:

Public Sub WindowOpenFile() 'Предоставление пользователю возможности открыть любой файл. 'Открывается каталог, хранящий активный документ, с показом всех файлов. Dim Act As Long With Dialogs (wdDialogFileOpen) .Name = ActiveDocument.Path & "\*.*" Act = . Show Debug.Print Act If Act = -1 Then 'Файл успешно открыт и можно получить путь к нему и его имя Debug.Print Documents(1).Path & "\" & Documents(1).Name End If End With

End Sub

Листинг 1.11.

(html, txt)

Заметьте, открывающееся перед пользователем стандартное окно открытия файла предварительно настроено, так что пользователь сможет увидеть все файлы каталога, хранящего активный документ. Для этой настройки использовалось свойство (параметр) Name, которым обладает данный конкретный объект FileOpen коллекции Dialogs . Замечу, что у этого объекта более 10 различных параметров, с их помощью можно задавать пароли, статус открытия и другие свойства, связанные с открытием файла. В справочной системе в разделе "Built-in Dialog box argument lists" для каждого диалогового окна указан список его возможных параметров. К сожалению, нельзя найти ни описания сути этих параметров, ни их возможных значений. Обо всем приходится догадываться, зная имя параметра и анализируя работу руками в диалоговом окне. Заметьте, контекстные справки к элементам интерфейса диалоговых окон также не всегда существуют.

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

Давайте рассмотрим еще один, более сложный пример, в котором возникают некоторые проблемы. Рассказывая об общих объектах, я рассмотрел объект Filesearch, используемый для поиска файлов. Теперь рассмотрим, решение этой задачи с использованием соответствующего объекта Dialog. Я напомню, что для поиска файлов в Office 2000 следует открывать не специальное окно поиска файлов, а обычное окно открытия файлов, - то есть выполнить команду "Open". Из этого окна по нажатию кнопки "Сервис" можно перейти в окно поиска и там уже можно сформировать достаточно сложное логическое выражение, задающее условие поиска. Условия поиска могут включать размер файла, дату его создания и внесения изменений, полное или частично заданное имя файла и множество других критериев, включая, в том числе, и полно текстовый поиск. Программная работа с объектом Filesearch позволяет выполнить аналогичные операции. При работе с объектом Dialog большая часть работы возлагается на пользователя, который должен сформировать критерии поиска в момент открытия окна. Программно можно предварительно сформировать лишь некоторые критерии поиска.

У диалогового объекта Dialog FileFind большое число разнообразных параметров. Не поленюсь и приведу список всех параметров этого объекта, разделив их на две группы. В первую группу входят параметры:SearchPath,Name,SubDir,Title, Author, KeyWords, Subject, MatchCase, Text, PatternMatch, DateSavedFrom, DateSavedTo, SavedBy, DateCreatedFrom, DateCreatedTo. К этой группе я отнес параметры, смысл и значения которых мне понятны, - они служат для формирования соответствующих критериев поиска. Заметьте, что среди них нет многих параметров, доступных при формировании критериев поиска вручную, например, нельзя задать ограничение на размер отыскиваемого файла. Во вторую группу я отнес параметры, смысл или множество возможных значений которых мне не совсем понятны. Вот эти параметры: SearchName, Options, View, SortBy, ListBy, SelectedFile, Add, Delete, ShowFolders, MatchByte.

От сетований давайте перейдем к примеру работы с этим диалоговым окном:



Листинг 1.12.

(html, txt)

Обратите внимание, перед тем как открыть диалоговое окно методом Show, я программно формирую ряд критериев поиска:

Свойство SearchName позволяет указать (я так предполагаю), что поиск ведется среди документов Word.СвойствоName говорит о том, что ищется файл, в имени которого есть сочетание "Ch6".СвойствоSearchPath задает каталог поиска.СвойстваSubDir и MatchCase включают флажки, указывающие, что поиск должен вестись в глубину с просмотром подкаталогов, а при полно текстовом поиске следует проверять словоформы.Свойство DateCreatedFrom указывает, что разыскиваются файлы, созданные не ранее 20 мая 2000 года.Свойство Author задает автора документов.Свойство Text задает слово, чьи словоформы будут искаться в файлах.

Выполнение метода Execute непосредственно перед открытием окна позволяет передать в окно эти установки и когда окно будет открыто, то в нем будут отображаться результаты поиска, не требуя никаких действий от пользователя. Вот как выглядит диалоговое окно в момент его открытия методом Show:


увеличить изображение
Рис. 1.5.  Диалоговое окно поиска файлов в момент открытия

Как видите, пользователю, в данном случае мне самому, не пришлось предпринимать никаких усилий, чтобы получить список найденных файлов. Заметьте, критерии поиска сформированы на основании программных установок. Их можно увидеть, для чего достаточно нажать кнопку "Сервис" и перейти в окно формирования критериев поиска:


Рис. 1.6.  Окно формирования критериев поиска

Правда, не все параметры, заданные в программе, были успешно переданы в окно. Это касается первых двух параметров - SearchName и Name. Что касается первого из них, то при открытии диалогового окна поиск возможен только среди всех типов файлов, и эту установку нельзя изменить даже вручную. То, что не передается имя файла в окно, связано, скорее всего, с очередной недоработкой. Замечу, что в обратную сторону передать имя файла, установленное пользователем, объекту Dialog возможно.

Конечно же, пользователь может остаться неудовлетворенным полученными результатами и иметь желание скорректировать критерии поиска. Я, например, так и сделал. Мои корректировки можно увидеть на следующем рисунке:


Рис. 1.7.  Корректировка критериев поиска

Усложнив условие поиска, я сократил список найденных файлов, удовлетворяющих условию поиска до трех файлов:


увеличить изображение
Рис. 1.8.  Новые результаты поиска файлов

Отмечу сразу еще одну досадную недоработку, связанную с этим диалоговым окном. Если пользователь выберет из представленного списка один из файлов и захочет его открыть, нажав имеющуюся тут же кнопку "Открыть", то файл не откроется, хотя и выполняется метод Show, обязанный исполнять действия пользователя. Квалифицированный пользователь, правда, сможет справиться с этой трудностью, если щелкнет правой кнопкой по выбранному им файлу и выберет из появившегося контекстного меню пункт "Быстрый просмотр", но не "Открыть файл".

Но давайте продолжим рассмотрение нашей программы. После того как пользователь, так или иначе, завершит работу в диалоговом окне, завершит свою работу и метод Show, и программа продолжит свое нормальное выполнение. Рассмотрим, что происходит, когда создается объект HisDialog класса Dialog. Будут ли ему переданы установки, заданные пользователем во время последнего сеанса работы? Ответ половинчатый, - часть параметров передается объекту HisDialog, часть нет. Вот результаты моих экспериментов в окне отладки после формирования объекта HisDialog:



Type - 99 Вызываемая процедура - FileFind -1 ?HisDialog.SearchName

?HisDialog.Name Ch ?HisDialog.SearchPath E:\O2000\DS2000 ?HisDialog.SubDir 1 ?HisDialog.MatchCase 1 ?HisDialog. DateCreatedFrom

?HisDialog.Author

?HisDialog.Text Execute

Листинг 1.13.

(html, txt)

Как видите, дата, автор и, очевидно, свойства, подобные им, не передаются созданному объекту. Вместе с тем ряд важных свойств сохраняются. Так что для данного диалогового окна лишь частично можно сохранить выбор установок, сделанных пользователем в ходе работы с диалоговым окном.

На этом я закончу описание работы с диалоговыми окнами в приложении Word. В заключение еще раз скажу, что это важный класс объектов, с которыми часто приходится сталкиваться разработчику решений на базе Office 2000. Нужно быть готовым к преодолению трудностей, возникающих при работе с ними.

Документ и его части


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



Документ Word и его проекты


Объекты, задающие программный проект, являются общими для всех документов Office 2000, в том числе и документа Word. Этой важной теме - программной работе с такими объектами посвящена лекция 4



Гипертекстовый документ. Закладки и гиперссылки


Гипертекстом называется текст, содержащий ссылки. Конечно, настоящим гипертекстовым документом может быть только документ в электронной форме, поскольку в этом случае становится возможным непосредственный переход по ссылкам. Гипертекстовый документ перестает быть линейным текстом, читаемым от начала до конца. Порядок его чтения (работы с документом) определяется в момент просмотра документа и зависит от выбора гиперссылок лицом, работающим с документом. Когда я говорю о гипертекстовом документе, то применительно к документам Office 2000 это не отражает в полной мере истинную картину. В Office 2000 следует говорить о системе гипертекстовых документов, связанных ссылками. Действительно ссылки в документе Word могут задавать переход к:

элементу того же документа, заданного с помощью закладки или стиля Heading,элементу другого документа Word,элементу, расположенному на Web-странице,именованному элементу рабочей книги Excel, именованному слайду Power Point,другому документу, файлу или Web-странице.

Гиперссылки и закладки это два основных инструмента, используемых при создании гипертекстовых документов. Закладка создается в точке, в которую производится переход, точке назначения, а гиперссылка - в точке, из которой производится переход, точке отправки.

Гипертекстовые документы являются одним из широко используемых типов документов. Так строятся сегодня практически все справочные системы. Пожалуй, для всех учебных пособий, особенно в электронной форме, гипертекстовая форма представления материала является наиболее подходящей, поскольку позволяет самому ученику определять оптимальный путь изучения учебного материала. Замечу, что, несмотря на всю полезность гиперссылок, злоупотреблять этим средством не стоит. Изобилие ссылок также плохо, как и линейный текст.

Давайте рассмотрим теперь пример, в котором два документа Word и один документ Excel будут связаны между собой взаимными гиперссылками. Я покажу, как программно устанавливаются закладки и гиперссылки. В документе Excel роль закладок играют имена элементов. Вот процедура, устанавливающая закладки:


Public Sub CreateBookmarks() 'Создание закладок 'Создадим закладку в документе DocOne и свяжем ее с рисунком Dim MyPath As String Documents("DocOne").Activate With ActiveDocument MyPath = .Path .InlineShapes(1).Select 'рисунок мышки .Bookmarks.Add "PictureOfMouse", Selection.Range End With 'Создадим закладку в документе ExampleOfTable и свяжем ее с таблицей Documents.Open (MyPath & "\ExampleOfTable") Documents("ExampleOfTable").Activate With ActiveDocument .Tables(1).Select 'таблица Менделеева .Bookmarks.Add "ТаблицаМенделеева", Selection.Range End With End Sub

Листинг 1.40.

(html, txt)

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

Рассмотрим теперь создание гиперссылок, некоторые из них будут ссылаться на только что созданные закладки:

Листинг 1.41.

(html, txt)

Обратите внимание, метод Add при создании гиперссылок имеет больше параметров, чем при создании закладок. При создании закладки достаточно указать имя закладки и область, с ней связанную. При создании гиперссылки указывается область, связанная с гиперссылкой, точка отправления и точка назначения, заданная двумя параметрами. Параметр Address указывает имя документа, к которому будет осуществлен переход, а параметр SubAddress указывает имя элемента внутри этого документа. Если поле адреса не указано, то переход осуществляется внутри того же документа, где находится точка отправления. Может быть опущено поле, задающее имя элемента, тогда осуществляется переход к самому документу. Одно из этих полей должно быть задано. Именем элемента в документах Word чаще всего выступает имя закладки. В документах Excel, как уже говорилось, в качестве имени элемента может выступать имя, содержащееся в коллекции именNames данного документа, как показано в нашем примере. Заметьте, для двух первых точек отправления, определяющих положение гиперссылки, я выбрал текст, расположенный достаточно глубоко внутри группового объекта TableOfFigures. Сделано это специально, чтобы продемонстрировать некоторые особенности коллекции Hyperlinks документов Word. Взгляните, как выглядит эта часть документа, после установления гиперссылок:


увеличить изображение
Рис. 1.13.  Документ с закладками

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



Public Sub RemoveBookmarks() ' Удаляет по запросу закладки активного документа Dim MyBM As Bookmark Dim Answer As String With ActiveDocument For Each MyBM In .Bookmarks Answer = InputBox(Prompt:="Удалить закладку? " & vbCrLf _ & "Имя закладки - " & MyBM.Name, _ Title:="Удаление закладок", Default:="Да") If Answer = "Да" Then MyBM.Delete

Next MyBM End With End Sub

Листинг 1.42.

(html, txt)

Все делается достаточно естественно, свойствоName позволяет в диалоге указать имя закладки, а метод Delete удалить ее, если получено согласие пользователя. Аналогичная процедура просмотра и удаления гиперссылок выглядит немного сложнее:

Листинг 1.43.

(html, txt)

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

В следующем примере показано применение метода Follow, позволяющего осуществить переход по ссылке. Процедура позволяет перейти по ссылке в результате диалога с пользователем. Вот ее текст:

Листинг 1.44.

(html, txt)

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

До сих пор в этом параграфе я много говорил о гипертекстовых документах и переходах по гиперссылке. Но хочу напомнить, что переходы внутри документа могут быть организованы и другими средствами. В частности в этой лекции я рассматривал работу с объектом Browser, который позволяет организовать переходы от элемента к элементу уже рассмотренных нами коллекций таблицам, комментариям, страницам, разделам, элементам других коллекций, среди которых есть, конечно же, и закладки. Говоря о роли закладок, следует отметить, что они используются не только для организации гипертекстовых документов. Их роль велика и в документах типа справочников, где приходится осуществлять частый поиск внутри документа. Закладки позволяют создать систему индексов, ускоряя поиск. Всем хорошо знаком этот прием при работе с обычным словарем, когда делаются закладки на каждой из букв алфавита. Я не буду приводить сейчас примера реализации этой идеи.



Public Sub CreateBookmarks() 'Создание закладок 'Создадим закладку в документе DocOne и свяжем ее с рисунком Dim MyPath As String Documents("DocOne").Activate With ActiveDocument MyPath = .Path .InlineShapes(1).Select 'рисунок мышки .Bookmarks.Add "PictureOfMouse", Selection.Range End With 'Создадим закладку в документе ExampleOfTable и свяжем ее с таблицей Documents.Open (MyPath & "\ExampleOfTable") Documents("ExampleOfTable").Activate With ActiveDocument .Tables(1).Select 'таблица Менделеева .Bookmarks.Add "ТаблицаМенделеева", Selection.Range End With End Sub

Листинг 1.40.

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

Рассмотрим теперь создание гиперссылок, некоторые из них будут ссылаться на только что созданные закладки:

Public Sub CreateHyperLinks() 'Создание гиперссылок 'Создадим три гиперссылки в документе DocOne Dim MyPath As String Documents("DocOne").Activate

With ActiveDocument MyPath = .Path 'гиперссылка- элемент группового объекта TableOfFigures 'свяжем ее с закладкой этого же документа .shapes(2).GroupItems(6).TextFrame.TextRange.Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:="", SubAddress:="PictureOfMouse"

'гиперссылка- элемент группового объекта TableOfFigures 'свяжем ее с закладкой другого документа .shapes(2).GroupItems(7).TextFrame.TextRange.Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\ExampleOfTable.doc", _ SubAddress:="ТаблицаМенделеева", _ ScreenTip:="Переход к документу," _ & " содержащему таблицу Менделеева" 'гиперссылка- объект TableOfFigures 'свяжем ее с URL .shapes(1).Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:="http://www.microsoft.ru/offext/", _ SubAddress:="", _ ScreenTip:="Переход к Web- странице" _ & " программы Office Extensions" End With 'Создадим гиперсссылку в документе ExampleOfTable 'и свяжем ее с закладкой документа DocOne Documents("ExampleOfTable").Activate With ActiveDocument 'Установка гиперссылки возврата в документ Word DocOne .Tables(1).Select 'таблица Менделеева Selection.MoveDown Selection.Expand .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\DocOne.doc", _ SubAddress:="PictureOfMouse", _ ScreenTip:="Возврат к документу DocOne" 'Установка гиперссылки перехода 'к именованному элементу документа Excel - BookOne Selection.MoveDown Selection.Expand .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\BookOne.xls", _ SubAddress:="ТаблицаПродаж", _ ScreenTip:="Переход к элементу" _ & " c именем ТаблицаПродаж документа Excel - BookOne"



End With End Sub

Листинг 1.41.

Обратите внимание, метод Add при создании гиперссылок имеет больше параметров, чем при создании закладок. При создании закладки достаточно указать имя закладки и область, с ней связанную. При создании гиперссылки указывается область, связанная с гиперссылкой, точка отправления и точка назначения, заданная двумя параметрами. Параметр Address указывает имя документа, к которому будет осуществлен переход, а параметр SubAddress указывает имя элемента внутри этого документа. Если поле адреса не указано, то переход осуществляется внутри того же документа, где находится точка отправления. Может быть опущено поле, задающее имя элемента, тогда осуществляется переход к самому документу. Одно из этих полей должно быть задано. Именем элемента в документах Word чаще всего выступает имя закладки. В документах Excel, как уже говорилось, в качестве имени элемента может выступать имя, содержащееся в коллекции именNames данного документа, как показано в нашем примере. Заметьте, для двух первых точек отправления, определяющих положение гиперссылки, я выбрал текст, расположенный достаточно глубоко внутри группового объекта TableOfFigures. Сделано это специально, чтобы продемонстрировать некоторые особенности коллекции Hyperlinks документов Word. Взгляните, как выглядит эта часть документа, после установления гиперссылок:


увеличить изображение
Рис. 1.13.  Документ с закладками

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

Public Sub RemoveBookmarks() ' Удаляет по запросу закладки активного документа Dim MyBM As Bookmark Dim Answer As String With ActiveDocument For Each MyBM In .Bookmarks Answer = InputBox(Prompt:="Удалить закладку? " & vbCrLf _ & "Имя закладки - " & MyBM.Name, _ Title:="Удаление закладок", Default:="Да") If Answer = "Да" Then MyBM.Delete



Next MyBM End With End Sub

Листинг 1.42.

Все делается достаточно естественно, свойствоName позволяет в диалоге указать имя закладки, а метод Delete удалить ее, если получено согласие пользователя. Аналогичная процедура просмотра и удаления гиперссылок выглядит немного сложнее:

Public Sub RemoveHyperlinks() ' Удаляет по запросу гиперссылки активного документа Dim MyHL As Hyperlink Dim Answer As String,NameHL As String With ActiveDocument Debug.Print .Hyperlinks.Count For Each MyHL In .Hyperlinks 'определение объекта, с которым связана гиперссылка If MyHL.Type = msoHyperlinkRange Then NameHL = MyHL.Range.Text Else:NameHL = MyHL.Shape.Name End If Answer = InputBox(Prompt:="Удалить гиперссылку? " & vbCrLf _ & "связана с объектом - " &NameHL & vbCrLf _ & "Имя целевого документа - " & MyHL.Address & vbCrLf _ & "Имя целевого элемента - " & MyHL.SubAddress, _ Title:="Удаление гиперссылок", Default:="Да") If Answer = "Да" Then MyHL.Delete

Next MyHL End With End Sub

Листинг 1.43.

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

В следующем примере показано применение метода Follow, позволяющего осуществить переход по ссылке. Процедура позволяет перейти по ссылке в результате диалога с пользователем. Вот ее текст:

Public Sub FollowHyperlinks() ' Переход по запросу,следуя гиперссылке активного документа Dim MyHL As Hyperlink Dim Answer As String,NameHL As String With ActiveDocument For Each MyHL In .Hyperlinks 'определение объекта, с которым связана гиперссылка If MyHL.Type = msoHyperlinkRange Then NameHL = MyHL.Range.Text Else:NameHL = MyHL.Shape.Name End If Answer = InputBox(Prompt:="Перейти, следуя гиперссылке? " ;amp; vbCrLf _ & "связана с объектом - " &NameHL & vbCrLf _ & "Имя целевого документа - " & MyHL.Address & vbCrLf _ & "Имя целевого элемента - " & MyHL.SubAddress, _ Title:="Переход по гиперссылке", Default:="Да") If Answer = "Да" Then MyHL.Follow MsgBox ("Продолжаем работать!") Exit For End If



Next MyHL End With End Sub

Листинг 1.44.

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

До сих пор в этом параграфе я много говорил о гипертекстовых документах и переходах по гиперссылке. Но хочу напомнить, что переходы внутри документа могут быть организованы и другими средствами. В частности в этой лекции я рассматривал работу с объектом Browser, который позволяет организовать переходы от элемента к элементу уже рассмотренных нами коллекций таблицам, комментариям, страницам, разделам, элементам других коллекций, среди которых есть, конечно же, и закладки. Говоря о роли закладок, следует отметить, что они используются не только для организации гипертекстовых документов. Их роль велика и в документах типа справочников, где приходится осуществлять частый поиск внутри документа. Закладки позволяют создать систему индексов, ускоряя поиск. Всем хорошо знаком этот прием при работе с обычным словарем, когда делаются закладки на каждой из букв алфавита. Я не буду приводить сейчас примера реализации этой идеи.


Характеристики


Объект FontNames отвечает за список всех доступных шрифтов. Аналогичные возможности предоставляет команда Font меню Format.

Объект RecentFiles позволяет работать со списком файлов наиболее позднего использования.

Объект System ведает информацией о характеристиках компьютера и операционной системы. Приведем пример работы с этим объектом, в котором определяются некоторые рабочие характеристики моего компьютера и окружения:

Public Sub WorkWithSystem() 'Получение характеристик компьютера и окружения Dim env As System Set env = Application.System 'Debug.Print "Тип компьютера - ", env.ComputerType Debug.Print "Тип процессора - ", env.ProcessorType Debug.Print "Операционная система - ", env.OperatingSystem Debug.Print "Язык - ", env.LanguageDesignation Debug.Print "Свободного дискового пространства - ", env.FreeDiskSpace Debug.Print "Курсор - ", env.Cursor

End Sub

Листинг 1.22.

(html, txt)

Вот результаты работы этой процедуры:

Листинг 1.23.

(html, txt)

Заметьте, на этой платформе не удается получить тип компьютера.



Электронные письма


Объект MailMessage представляет активное EMail-сообщение. Для работы с методами этого объекта помимо активности сообщения требуется дополнительно, чтобы Word использовался, как редактор этого сообщения.

Несмотря на то, что я выполнил условия, необходимые для работы с этим объектом, ни один из его методов мне вызвать не удалось. Лишь свойство Application этого объекта вызывалось корректно, как показано в следующем примере:

Public Sub WorkWithMailMessage() Dim mes As MailMessage Documents("test").Activate Set mes = Application.MailMessage If Not (mes Is Nothing) Then Debug.Print mes.Application.Name 'mes. DisplaySelectNamesDialog 'mes.CheckName 'mes.GoToNext 'mes. DisplayMoveDialog End If End Sub

Листинг 1.17.

(html, txt)

Новый появившийся в Office 2000 объект EmailOptions позволяет устанавливать некоторые общие опции, в частности, автоматически добавляемую подпись. В нашем следующем примере добавляемая подпись выбирается в зависимости от выбранного языка. На самом деле выбирается не сама подпись, а ее имя из списка уже подготовленных подписей. Сами подписи должны быть созданы вручную на вкладке Email Options меню Tools|General.

Public Sub WorkEmail()

With Application.EmailOptions.EmailSignature

If Selection.LanguageID = wdRussian Then .NewMessageSignature = "Подпись" .ReplyMessageSignature = "Подпись" Else .NewMessageSignature = "sign1" .ReplyMessageSignature = "sign1" End If Debug.Print .NewMessageSignature

End With

End Sub

Листинг 1.18.

(html, txt)



Каркас документа Word


Каркас документа строится автоматически в момент его создания. Из общей совокупности библиотек объектов, составляющих Office 2000, в каркас документа входят те библиотеки, чьи объекты необходимы для построения документа данного типа. Часть из библиотек содержат общие объекты и входят в каркасы документов всех типов, создаваемых в Office 2000. Часть библиотек каркаса определяют специфику документа. Взгляните на каркас по умолчанию документа Word:


увеличить изображение
Рис. 1.1.  Каркас по умолчанию документа Word

Как можно видеть, в каркас входят кроме библиотеки Word еще три библиотеки и два проекта:

Word - библиотека, задающая основу документов Word. Здесь хранится класс, задающий корневой объект Word.Application, и все классы объектов, вложенных в корневой объект. Office - библиотека объектов, общих для всех приложений Office 2000. Здесь находятся классы, определяющие инструментальные панели - CommandBar и классы других общих объектов. Здесь же находятся классы, задающие Помощника (объект Assistant и все классы, связанные с ним). В частности, появился новый объект, которого не было в предыдущей версии - Мастер Ответов (Answer Wizard).Stdole - библиотека классов, позволяющая работать с OLE - объектами и реализовать Автоматизацию.VBA - библиотека классов, связанных с языком VBA. Здесь хранятся все стандартные функции и константы, встроенные в язык, классы Collection и ErrObject .Project - проект по умолчанию, связанный с документом. Классы, которые могут программистом создаваться в этом проекте, методы, свойства, - все это доступно для просмотра, так же, как и объекты классов, встроенных в стандартные библиотеки.Normal - проект, доступный для всех документов Word. Здесь могут храниться функции и классы, используемые всеми документами.

До сих пор речь шла о каркасе, создаваемом по умолчанию. Но при работе с документом этот каркас можно существенно изменить, добавив в документ новые классы, а значит и новые свойства. Для этого достаточно включить в состав каркаса другие библиотеки классов из той совокупности, что входит в Office 2000. Заметим, набор дополнительно поставляемых библиотек в Office 2000 существенно вырос по сравнению с предыдущей версией.

А теперь о том, как это делается. Прежде всего, заметим, что расширение каркаса делается обычно руками, но можно делать это и программно. Для того чтобы вручную добавить в документ новые возможности, необходимо вначале войти в режим редактора программного проекта, для чего достаточно в меню Tools | Macro выбрать пункт Visual Basic Editor или нажать комбинацию клавиш Alt + F11. Затем уже в Редакторе из меню Tools следует выбрать пункт References и в появившемся списке возможных библиотек включить те, которые отвечают Вашим потребностям. На рис. 1.2 показан процесс подключения к документу Word новых библиотек.


Рис. 1.2.  Расширение возможностей каркаса документа

В данном примере я подключил библиотеки объектов трех приложений - Outlook, Access и Excel, библиотеку с WEB - классами и загрузчик объявлений, необходимых для вызова API - функций. В результате каркас документа существенно обновился, и документ теперь обладает потенциально большими возможностями, чем документ, создаваемый по умолчанию. В этом документе можно организовать совместную работу четырех приложений Office 2000, работать с WEB - компонентами. Конечно, каркас обеспечивает только потенциальную возможность, чтобы все заработало, нужно многое сделать, наполняя каркас плотью. Например, необходимо описать и создать соответствующие объекты Application для каждого из совместно работающих приложений, прежде чем начать с ними работать.

На рис. 1.2 можно увидеть лишь небольшую часть всей совокупности библиотек (их несколько десятков), доступных в Office 2000. Завершая разговор о каркасе документа, нам остается сделать два важных замечания. Во-первых, заметим, что включение ссылок на новые библиотеки и соответствующее расширение каркаса документа немедленно отражается при просмотре объектов документа. Взгляните на рис. 1.3, где показано, что теперь все объекты, потенциально включенные в состав документа, стали доступными для просмотра и получения справки:


Рис. 1.3.  Окно просмотра объектов каркаса документа

Во-вторых, обратим Ваше внимание на то, что технология работы в Office 2000 рекомендует создавать документы на основе некоторого шаблона. Поэтому, однажды создав документ с требуемым набором возможностей и сохранив его в качестве шаблона, в последующем можно открывать новые документы на основе этого шаблона, не задумываясь уже о том, как и какие библиотеки следует подключать.



Классы, задающие структуризацию текста документа


Текст - это основа большинства документов. Его можно структурировать, оперируя различными единицами при решении тех или иных задач преобразования текста. Минимальной единицей текста является символ. Другие естественные единицы - это слова, предложения, абзацы. Более крупными частями текста являются страницы, параграфы и главы. Важно уметь оперировать с последовательностями таких единиц. Какие же классы объектов предоставляет Word для этой цели?

Классы Characters, Words, Statements, Paragraphs позволяют работать с последовательностями (коллекциями) символов, слов, предложений, абзацев. Может показаться удивительным, но классов, соответствующих таким элементам, как символ, слово или предложение, нет. Элементом коллекций Characters, Words и Statements является объект класса Range. Это один из самых важных объектов, необходимых для понимания работы с текстами. Объект Range позволяет работать как с одним символом, так и с последовательностью символов. Документы, поддокументы, абзацы, разделы - все они имеют метод или свойство Range, возвращающее объект Range, представляющий область, связанную с объектом, вызвавшим метод (свойство) Range. Эту область можно рассматривать как интервал, задаваемый первым и последним символом текста данной области. Поэтому работа с текстом, так или иначе, ведется через методы и свойства объекта Range.

Чуть позже мы продолжим знакомство с классами Characters, Words, Statements, Paragraphs и Range.



Коллекции объекта Document


Рассмотрим список коллекций, входящих в состав объекта Document:

BookmarksCharacters (Range)CommandBarsCommentsDocumentPropertiesEndnotesFieldsFootnotesFormFieldsFramesHyperlinksIndexesInlineShapes HorizontalLineFormat

ListParagraphsLists ListParagraphsRange

ListTemplates ListLevelsFont

ParagraphsProofreadingErrors (Range) RevisionsReadabilityStatisticsScriptsSectionsSentences (Range)ShapesStoryRanges (RangeStylesSubdocumentsTablesTablesOfAuthoritiesCategories (TableOfAuthoritiesCategory)TablesOfAuthorities (TableOfAuthorities)TablesOfContents (TableOfContents)TablesOfFigures (TableOfFigures)VariablesVersionsWindowsWords (Range)

Среди объектов, вложенных в объект Document на первом уровне иерархии, коллекции составляют явное большинство - их 36. Каждая коллекция содержит элементы одного класса. Как правило, имя класса коллекции строится как множественное число (по правилам английского языка) от имени класса элемента коллекции. Например, коллекция Documents содержит объекты класса Document, а коллекция Paragraphs содержит объекты класса Paragraph. В тех случаях, когда это правило не выполняется, в скобках указано имя класса для объектов, входящих в коллекцию. Заметьте, например, что коллекции предложений, слов и символов документа Word состоят из объектов класса Range.

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



Конверторы


Word позволяет работать с документами, подготовленными не только в более ранних его версиях, но и в других текстовых редакторах. Для этого используются конверторы файлов. Коллекция объектов FileConverters позволяет выбрать тот или конвертор. У коллекции нет методов Add и Delete, поэтому добавлять новые конверторы или удалять ненужные конверторы программно нельзя. Это делается в процессе инсталляции Office 2000. В следующем примере печатаются имена конверторов, доступных на моей машине и анализируются некоторые их свойства:

Public Sub ConvertDoc() 'Работа с конвертором Dim conv As FileConverter Debug.Print Application.FileConverters.Count For Each conv In Application.FileConverters Debug.Print conv.Name, conv.FormatName, conv.ClassName If conv.CanOpen And conv.CanSave Then Debug.Print "Конвертор может открывать и сохранять файлы" End If Next conv End Sub

Листинг 1.20.

(html, txt)

Приведем результаты работы этой процедуры. Нет смысла приводить полный список всех 26 доступных конверторов, поэтому мы ограничимся несколькими строчками:

26 Text with Layout Text with Layout Конвертор может открывать и сохранять файлы MS-DOS Text with Layout MS-DOS Text with Layout Конвертор может открывать и сохранять файлы WordPerfect 5.x for Windows WrdPrfctWin WordPerfect 5.1 for DOS WrdPrfctDOS51

Листинг 1.21.

(html, txt)



Методы объекта Application


Казалось бы, объекты Application не должны иметь много методов, а среди имеющихся методов большая часть должна быть общей для приложений разных типов. Ведь специфика приложений должна проявляться на более низком уровне иерархии, когда начинается работа, например, с документами Word или рабочими книгами Excel. Но это не так. Реально методов много, а общих из них - мало. Более того, даже методы Activate, Run, Quit, имеющиеся у всех приложений, совпадающие по именам и предназначенные для решения стандартных задач (активизации приложения, запуска макроса, выхода из приложения), организованы по-разному.

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

Таблица 1.3. Методы объекта Application

СинтаксисОписание аргументовНазначение
Sub Activate()НетАктивизирует приложение
Sub AddAddress(TagID() As String, Value() As String)Первый массив задает имена компонент адреса, второй их значения. Имена компонент фиксированы и задаются специальными константами, например, pr_given_name, pr_surname.Добавляет новый адрес в адресную книгу
Sub AutomaticChange()НетВыполняет автоформатирование, когда есть изменения, предлагаемые Помощником (Office Assistant).
Function BuildKeyCode(Arg1 As WdKey, [Arg2], [Arg3], [Arg4]) As LongАргументы задают комбинацию клавишей, обычно, это пара клавиш, например ALT и F1. Клавиши задаются константами перечисления WdKey.Возвращает уникальный код каждой комбинации "горячих" клавиш.
Sub ChangeFileOpenDirectory(Path As String)Путь к каталогу.Устанавливает каталог по умолчанию, открываемый в приложении Word при выполнении команды Open.
Function CheckGrammar(String As String) As BooleanПроверяемая строка.Выполняет проверку грамматической корректности строки, указанной в аргументе. Заметьте, аналогичный метод у объектов на нижнем уровне иерархии проверяет корректность текста этих объектов.
Function CheckSpelling(Word As String, [CustomDictionary], [IgnoreUppercase], [MainDictionary], [CustomDictionary2], … [CustomDictionary10]) As BooleanПервый обязательный аргумент задает проверяемую строку. Остальные необязательные аргументы задают словари и условия проверки.Выполняет проверку орфографии строки, заданной первым аргументом.
Function CleanString(String As String) As StringСтрока преобразованияУдаляет или преобразовывает непечатаемые и специальные символы строки, заданной своим аргументом.
Function DefaultWebOptions() As DefaultWebOptionsНетВозвращает соответствующий объект, содержащий глобальные параметры уровня приложения, используемые Word всякий раз при сохранении или открытии документа как Web-страницы.
Function GetAddress([Name], [AddressProperties], [UseAutoText], [ DisplaySelectDialog], [SelectDialog], [CheckNamesDialog], [RecentAddressesChoice], [UpdateRecentAddresses]) As StringПервый возможный аргумент указывает имя адресата, остальные определяют специфику поиска адреса.Ищет адрес в адресной книге. Аргументы определяют специфику выполнения этой операции.
Function GetDefaultTheme(DocumentType As WdDocumentMedium) As StringТип, заданный константой из перечисления WdDocumentMediumВозвращает имя темы (фонового узора) по умолчанию, принятого в Word для новых документов, или сообщений Email или Web-страниц.
Sub GoBack(), Sub GoForward()НетВ активном документе передвигает вперед и назад точку вставки между тремя последними точками редактирования.
Sub Help(HelpType)Константа, заданная перечислением WdHelpTypeВ зависимости от значения константы отображает то или иное окно справочной системы. Чаще всего, открывает окно Office Assistant со списком тем справочной системы.
Sub HelpTool()НетИзменяет указатель мыши со стрелки на знак вопроса, что будет указывать на получение контекстно-чувствительной справки при подведении указателя к некоторому элементу активного документа. Нажатие Esc возвращает прежний вид указателя.
Function Keyboard([LangId As Long]) As LongЕсли аргумент опущен, то возвращается значение, представляющее комбинацию чисел, определяющих язык и раскладку клавиатуры. Для установки языка и раскладки необходимо задать нужную комбинацию значений. Устанавливает или возвращает язык и раскладку клавиатуры.
Function KeyString(KeyCode As Long, [KeyCode2]) As StringПервый обязательный аргумент задает код, определяющий комбинацию горячих клавиш. Возвращает по коду строку, задающую комбинацию горячих клавиш. Функция, обратная по своему действию функции BuildKeyCode.
Sub ListCommands(ListAllCommands As Boolean)Если аргумент имеет значение true, то выводится весь список команд Word, в противном случае - команд, прошедших настройку в приложении. Создает новый документ, содержащий таблицу со списком команд Word. Полный список содержит 1175 команд. Для каждой команды указывается комбинация горячих клавиш и инструментальная панель меню.
Sub LookupNameProperties(Name As String)Задает имя в адресной книгеОткрывает диалоговое окно свойств для адресата, имя которого указано в аргументе метода.
Sub Move(Left As Long, Top As Long)Координаты окнаПередвигает окно активного документа в позицию, указанную аргументами.
Function NewWindow() As WindowНетСоздает новое окно - копию активного окна активного документа.
Sub OnTime(When,Name As String, [Tolerance])Первый аргумент задает время, второй - имя макроса.Включает будильник и запускает макрос в заданное время.
Sub OrganizerCopy(Source As String, Destination As String,Name As String, Object As WdOrganizerObject)Source - имя файла - источника, Destination - имя файла-назначения,Name - имя копируемого элемента, Object - тип копируемого элемента, задается константой.Копирует элемент, заданный аргументомName из документа или шаблона в документ или шаблон. Копируемый элемент может быть входом AutoText, инструментальной панелью, стилем или макросом, что определяется аргументом Object.
Sub OrganizerDelete(Source As String,Name As String, Object As WdOrganizerObject)Смотри описание аргументов предыдущего метода Copy.Выполняет операцию удаления элемента.
Sub OrganizerRename(Source As String,Name As String, NewName As String, Object As WdOrganizerObject)Смотри описание аргументов метода Copy.Выполняет операцию переименования элемента.
Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [FileName], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])Аргументы соответствуют опциям в диалоговом окне Print меню File.Печатает все части документа.
Function ProductCode() As StringНет.Возвращает глобальный идентификатор - GUID приложения Word.
Sub Quit([SaveChanges], [OriginalFormat], [RouteDocument])Задают опции в момент закрытия приложения.Закрывает все открытые документы с их возможным сохранением и пересылкой всем участникам, совместно работающим над документами.
Function Repeat([Times]) As BooleanЧисло повторений последней команды редактированияВыполняет заданное число раз последнюю команду редактирования, возвращает истину в случае успеха.
Sub Resize(Width As Long, Height As Long)Размеры окна приложения Word. Изменяет размеры окна приложения Word.
Function Run(MacroName As String, [varg1], … [varg30])Имя макроса и до 30 передаваемых ему аргументов.Запускает макрос VBA.
Sub ScreenRefresh()Нет.Запускает Fax Wizard.
Sub SetDefaultTheme(Name As String, DocumentType As WdDocumentMedium)Name задает имя темы и параметры форматирования. Формат этого параметра "имя_темы nnn". Второй аргумент задает тип документа Устанавливает для заданного типа документа тему ( фоновый узор) и способ форматирования. Смотри также описание метода GetDefaultTheme.
Группа DDE-методов: Sub DDEExecute(Channel As Long, Command As String) и другие методы этой группы.Обеспечивает динамический обмен данными между приложениями.
Группа методов преобразования линейных мер: Function CentimetersToPoints(Centimeters As Single) As Single Function PointsToCentimeters(Points As Single) As Single И другие методы этой группы.Мера длины в указанных единицах.Задает взаимное преобразование между точками и другими мерами длины. Возвращает значение меры, заданной аргументом, в других единицах.


Группа методов преобразования линейных мер: Function CentimetersToPoints(Centimeters As Single) As Single Function PointsToCentimeters(Points As Single) As Single И другие методы этой группы. Мера длины в указанных единицах. Задает взаимное преобразование между точками и другими мерами длины. Возвращает значение меры, заданной аргументом, в других единицах. Как видите, набор методов объекта Application разнообразен. Некоторые из них вполне естественны для этого объекта, как, например, методы работы с окном приложения, другие, на мой взгляд, довольно экзотичны, - например, методы работы со строкой текста, проверяющие ее корректность. Если попытаться классифицировать эти методы, то условно их можно разбить на следующие группы, каждая из которых позволяет работать с таким объектом, как:

Окно приложения.Адресная книга.Каталоги, используемые приложением по умолчанию.Форматирование, в том числе темы, используемые в Web-страницах.Редактирование.Справочная система.Строки.Средства запуска макросов, в том числе в заданное время.Организатор (Organizer).Динамический обмен данными.

Настройка


С помощью объекта Options можно программным путем установить различные опции приложения и документа аналогично тому, как если бы Вы выбрали команду Options (Параметры) в меню Tools (Сервис). При работе вручную это один из наиболее часто выбираемых пунктов меню. В открывающемся окне десяток флажков, вкладок и плюс к этому пара командных кнопок. Понятно, что и соответствующий объект Options имеет десятки свойств, задавая значения которых можно программно настроить приложение нужным образом. Методов этот объект фактически не имеет. Для демонстрации я выбрал некоторое множество опций. Заметьте, что в большинстве случаев включение или отключение того или иного свойства приложения Word, распространяется на все его документы:

Public Sub WorkWithOptions() 'работа с объектом Options Options.AutoFormatAsYouTypeReplaceFractions = True Options.AllowDragAndDrop = True Options.CheckGrammarWithSpelling = True Options.EnableSound = False Options.MonthNames = wdMonthNamesEnglish Options.PrintComments = True End Sub

Листинг 1.19.

(html, txt)



Объект Word.Application


Каркас любого документа Word, как уже говорилось, составляют объекты разных классов, объединенные в библиотеки. Для документов Word основной библиотекой, конечно же, является библиотека классов Word9. Центральным объектом каркаса документа является объект этой библиотеки Application, определяющий само приложение. Поскольку в основе построения объектов Office лежит встраивание, то объекты Office 2000 являются, как правило, "толстыми" объектами, в каждый из которых встроены другие объекты.

Объект Application это один из самых "толстых" объектов, в него встроены объекты, задающие различные компоненты приложения Word. В программном проекте любого из открытых документов Word доступен корневой объект Application, определяющий само приложение. Одновременно становятся доступными и все встроенные в него объекты. В частности, становится доступной коллекция Documents всех открытых документов Word, а тем самым, и объект, задающий наш, например, только что открытый документ.

В приложении Word на разных уровнях иерархии определено около 200 объектов, совокупность которых и определяет мир объектов Word, его возможности, свойства и поведение. Сам корневой объект Word.Application имеет более сотни элементов: свойств, методов и событий. Объекты Application различных приложений Office 2000 - Word.Application, Excel.Application и другие составляют семейство схожих объектов.

Объект Application, задающий приложение, естественно, определяет свойства и поведение приложения в целом. Как я уже говорил, он содержит коллекцию документов данного приложения - документы в приложении Word, рабочие книги в Excel, презентации - в Power Point. В этот же объект непосредственно вложены общие объекты Office 2000 - Assistant, CommandBars, VBE, AddIns, ComAddIns и другие. Сюда же вложены и многие объекты, схожие для приложений Office 2000, - Windows, Dialogs и другие.

Рассмотрим теперь более подробно и вначале чисто формально состав объекта Word.Application. Такое алфавитное перечисление и "шапочное" знакомство тоже полезно. Позже мы познакомимся со многими из этих элементов уже по существу. Начнем наше рассмотрение с коллекций объектов, встроенных в объект Application:

Таблица 1.1. Коллекции объектов, встроенных в корневой объект Word Application

КоллекцияСвойстваМетодыНовые коллекции Office 2000 СвойстваМетоды
AddIns (AddIn),Application, Count, Creator, ParentAdd, Item, UnLoad
AutoCaptions (AutoCaption),Application, Count, Creator, ParentItem, CancelAutoInsert
CaptionLabels (CaptionLabel),Application, Count, Creator, ParentAdd, Item
CommandBars (CommandBar),Application, Count, Creator, Parent (+ 6 дополнительных свойств)Add, Item, FindControl, ReleaseFocus
Dialogs (Dialog),Application, Count, Creator, ParentItem
Dialogs (Dialog),Application, Count, Creator, ParentItem
Dictionaries (Dictionary),Application, Count, Creator, Parent, ActiveCustomDictionary, MaximumAdd, Item, ClearAll
Documents (Document)Application, Count, Creator, ParentAdd, Open, Item, Close, Save
FileConverters (FileConverter),Application, Count, Creator, Parent, ConvertMacWordChevronsItem
KeysBoundTo (KeyBinding),Application, Count, Creator, Parent, Command, CommandParametr, Context, KeyCategoryItem, Key
KeyBindings (KeyBinding),Application, Count, Creator, Parent, ContextAdd, Item, Key, ClearAll
Languges (Language),Application, Count, Creator, Parent, ContextItem
ListGalleries (ListGallery),Application, Count, Creator, Parent, ContextItem
RecentFiles (RecentFileApplication, Count, Creator, Parent, MaximumAdd, Item
SpellingSuggestions (SpellingSuggestion),Application, Count, Creator, Parent, SpellingErrorTypeItem
Tasks (Task),Application, Count, Creator, ParentItem, Exists, ExitWindow
Templates (Template),Application, Count, Creator, ParentItem
Windows(Window).Application, Count, Creator, ParentAdd, Item, Arrange
COMAddInsApplication, Count, Creator, ParentItem, Update
DefaultWebOptionsBrowserLevel, Encoding, OrganizeInFolder и другие, всего 19 свойств нет
HangulHanjaConversionDictionariesActiveCustomDictionary, Application, BuiltinDictionary, Count, Creator, Maximum, ParentAdd, ClearAll, Item
<
Большинство из коллекций содержит типичные для коллекций свойства и методы: Add - для добавления нового элемента в коллекцию, Item для выбора элемента из коллекции по ключу или индексу, свойство Count возвращает число элементов в коллекции, Parent - родительский объект. У некоторых из коллекций имеются дополнительные свойства и/или методы. Не менее важно то, что в некоторых коллекциях нет того или иного типичного для коллекций метода, например метода Add. Так, у коллекции SpellingSuggestions нет методов для удаления и добавления элементов, так как пользователь не имеет возможности добавлять собственные предположения или удалять имеющиеся. У коллекции Templates, также не имеющей этих методов, ситуация другая - ее элементы добавляются и удаляются при работе с коллекцией Documents, элементами которой являются как документы, так и шаблоны.

В Office 2000 появились три новые коллекции. Первая из них содержит COMAddIn - объекты, расширяющие функциональные возможности приложений Office 2000. Вторая коллекция - DefaultWebOptions содержит свойства, устанавливаемые по умолчанию при работе в Интернет. Третья коллекция нас может интересовать лишь в малой степени, так как она предполагает работу с восточно- азиатскими языками (корейским, японским, китайским).

Взгляните на вложенные в объект Application простые объекты, не являющиеся коллекциями:

Таблица 1.2. Объекты, встроенные в Word ApplicationОбъектСвойстваМетодыНовые объекты в Office 2000СвойстваМетоды
AssistantApplication, Creator, Parent + 21 свойствоActivateWizard, StartWizard, EndWizard, Help, ResetTips, Move
AutoCorrectApplication, Creator, Parent + 3 свойстваМетодов нет
BrowserApplication, Creator, Parent, TargetNext, Previous
FileSearchApplication, Creator + 10 свойствExecute, NewSearch
FontNamesApplication, Creator, Parent, CountItem
MailingLabelApplication, Creator, Parent + 4 свойстваCreateNewDocument, PrintOut
MailMessageApplication, Creator, ParentDelete, Reply, Forward, GotoNext, GotoPrevious + 6 методов
Options100 различных свойствSetWPHelpOptions
SetWPHelpOptionsБолее 50 свойствБолее 70 методов
SystemApplication, Creator, Parent + 15 свойствConnect, MSInfo
SynonymInfoApplication, Creator,Parent + 9 свойствМетодов нет
VBE18 свойств Quit
AnswerWizardApplication, Creator, Files, ParentClearFileList, ResetFileList
EmailOptionsEmailSignature, ReplyStyle и другие, всего 10 свойствнет
LanguageSettingsApplication, Creator, LanguageId, LanguagePrefferedForEditingнет


В Office 2000 объект Application немножко "растолстел", и у него появились три новых объекта. Объект AnswerWizard позволяет организовать выдачу собственных подсказок при обращении пользователя к справочной системе. Его основное свойство Files возвращает коллекцию файлов AnswerWizardFiles, метод Add которой позволяет добавлять новые файлы с подсказками. Объекты EmailOptions и LanguageSettings позволяют устанавливать и анализировать значения опций при работе с почтой и языками, используемыми в документах.

Приведенный список коллекций и объектов далеко не полностью отражает всю объектную структуру приложения Word. Это лишь видимая часть айсберга. Многие из вложенных объектов, например Document, не менее сложны по своей внутренней структуре. Возникает естественный вопрос, как же во всем этом разобраться и как это все можно запомнить? Разобраться во всем этом стоит, а вот запоминать не обязательно. Объектная природа построения приложения позволяет успешно работать только с нужными в конкретной ситуации объектами, используя только часть их свойств и методов и, возможно, не зная о существовании других объектов. Более важно знание инструментальных средств Office 2000, к которым часто приходится обращаться при работе с объектами. Интеллектуальная система поддержки работы с объектами, - то, что называется IntelliSense, окно просмотра или браузер объектов, Помощник и справочная система, все эти средства позволяют избежать запоминания деталей.

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

Переменные, которые живут долго


У переменных век не долог. Локальные переменные, как правило, заканчивают существование в момент окончания работы процедуры, в которой они описаны. Глобальные переменные живут дольше, некоторые из них могут быть доступными в разных программных проектах системы документов в процессе работы с этими документами.

Однако и локальные и глобальные переменные "умирают" по окончании сеанса работы. Для того чтобы сохранять данные между сеансами работы, необходимо использовать файлы, базы данных и другие внешние источники даных. Замечу, что, конечно, есть еще возможность хранить данные, как часть самого документа, например, в таблицах Word или Excel. Но сейчас мы поговорим еще об одной интересной возможности, предоставляемой при работе с офисными документами. С каждым из документов можно связать коллекцию переменных типа Variant коллекцию Variables(Variable). Эта коллекция для программистов важна - ведь время жизни входящих в нее переменных совпадает со временем жизни документа. По существу речь идет о некотором специальном файле переменных, жестко связанном с самим документом и хранящимся вместе с ним. Тем самым появляется возможность сохранять информацию о работе документе между сеансами. Применения этого полезного средства могут быть самыми разными. Можно сохранять предпочтения, сделанные пользователем при первом сеансе работы с документом, различные настройки документа и так далее. Другое применение связано с предоставлением документа во временное владение с ограничением числа возможных запусков. Например, можно иметь счетчики, подсчитывающие количество вызовов некоторой процедуры и в зависимости от значения счетчика по-разному определять дальнейшую работу с данным документом. Переменные, входящие в коллекцию Variables, создаются не так, как обычные переменные, нет необходимости в их описании в разделе объявлений какого либо модуля. Они имеют фиксированный тип Variant и создаются методом Add, типичным для создания элементов коллекций. Этот метод имеет достаточно прозрачный синтаксис:


Листинг 1.52.

(html, txt)

В момент создания задается имя переменной и, возможно, инициализирующее ее значение. Тип, как я уже говорил, установлен по умолчанию.

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

Public Sub CreateVar() 'Создание переменных - хранителей информации With ActiveDocument.Variables If Not ExistVar("Counter") Then 'Добавляем переменную .AddName:="Counter", Value:=0 End If End With

End Sub

Public Function ExistVar(Name As String) As Boolean 'Определяет наличие переменнойName в коллекции Variables Dim MyVar As Variable ExistVar = False For Each MyVar In ActiveDocument.Variables If MyVar.Name =Name Then ExistVar = True: Exit For End If Next MyVar End Function

Листинг 1.53.

(html, txt)

При попытке повторного добавления одной и той же переменной в коллекцию Variables возникает ошибка. В тоже время процедура, в которой происходит добавление, может выполняться многократно. Поэтому я предусматриваю соответствующую проверку на существование переменной с заданным именем в коллекции Variables. Может возникнуть вопрос, куда поместить процедуру CreateVar, создающую переменную. Я поместил ее в процедуру, обрабатывающую событие "Open" документа, но можно упрятать этот вызов и более глубоко. Рассмотрим теперь, как происходит работа с переменной Counter:

Public Sub CheckCounter() Const Limit = 10 'Счетчик Counter может быть использован в любой процедуре, 'позволяя следить за числом ее выполнения With ActiveDocument If .Variables("Counter") > Limit Then 'Исчерпан лимит нормальной работы демо-версии Call MsgBox("Исчерпан лимит работы демо-версии", _ vbCritical, "Конец работы!") Else ' продолжаем нормальную работу Dim myLocal As Integer 'Локальные переменные могут работать с глобальным счетчиком myLocal = .Variables("Counter") Debug.Print "Счетчик = "; myLocal



' В конце работы увеличиваем значение счетчика myLocal = myLocal + 1 .Variables("Counter") = myLocal End If End With End Sub

Листинг 1.54.

(html, txt)

Экспериментируя с тестовым документом, я открывал и закрывал его многократно, время от времени, вызывая процедуру CheckVar. После 11 ее запусков нормальное выполнение было прервано и выдалось предупреждающее сообщение:


увеличить изображение
Рис. 1.17.  Документ в момент выдачи предупреждающего сообщения.

Перемещение по тексту. Объект Browser


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

Листинг 1.10.

(html, txt)

on_load_lecture()

Дальше »

  Если Вы заметили ошибку - сообщите нам.  
Страницы:

« |

1

|

2

|

3

|

4

|

5

|

6

|

7

|

8

|

9

|

10

|

11

|

12

|

вопросы | »

|

для печати и PDA

Курсы | Учебные программы | Учебники | Новости | Форум | Помощь



Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru

© 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование



Письма


Существует несколько объектов, которые могут быть полезны при работе с почтой. Объект MailingLabel позволяет работать с конвертами и адресами. Он позволяет распечатать адрес на конверте или создать страницу с адресами, которую можно затем распечатать и использовать адреса как наклейки. Его возможности во многом совпадают с тем, что можно делать вручную при выборе пункта Envelopes and Labels (Конверты и наклейки) меню Tools (Сервис). Приведем пример работы с этим объектом. В этом примере один адрес печатается непосредственно на конверте, а для другого, отмеченного специальной закладкой с именем EnvelopeAddress, создается документ с наклейками:

Public Sub WorkWithMail() 'Работа с почтовыми сообщениями Dim MyAddr As String, MyName As String Dim MailLab As CustomLabel MyName = Application.MailingLabel.DefaultLabelName Debug.Print MyName

Set MailLab = Application.MailingLabel.CustomLabels _ .Add(Name:="My Friend", DotMatrix:=True) MyAddr = "Россия" & vbCrLf & "Мой город" & vbCr & "Моя улица, 41, 7" & vbCr _ & "Моему другу" 'MailLab.PageSize = wdCustomLabelLetter If Documents("DocOne").Bookmarks.Exists("EnvelopeAddress") Then Application.MailingLabel.PrintOut _ Name:=MyName, ExtractAddress:=True, SingleLabel:=True End If

Application.MailingLabel.CreateNewDocument _ Name:="My Friend", Address:=MyAddr

End Sub

Листинг 1.16.

(html, txt)

Мне не удалось установить размер страницы у объекта MailLab класса CustomLabel. Полагаю, что это небольшой "жучок", не имеющий, впрочем, принципиального значения.



Поиск файлов


Объект Filesearch позволяет найти нужный файл. Это общий объект, и о нем подробно рассказывается в лекции 5



Выключаю опции Application. DisplayStatusBar


Public Sub WorkWithTerm() 'Работа с терминальными свойствами ' Выключаю опции Application. DisplayStatusBar = False Application. DisplayRecentFiles = False
End Sub
Листинг 1.1.
Закрыть окно

В этом примере используется свойство


Public Sub IsObjectProp() ' В этом примере используется свойство IsObjectValid Dim MyPath As String Dim SecondDoc As Document MyPath = ActiveDocument.Path 'Определяем объект Set SecondDoc = Documents.Open(MyPath & "\DocTwo.doc") 'Удаляем объект, возможно, по ошибке Documents(1).Close 'Теперь нам объект понадобился If Not IsObjectValid(SecondDoc) Then 'Добавляем элемент в коллекцию Set SecondDoc = Documents.Open(MyPath & "\DocTwo.doc") End If 'Работа с документом DocTwo Debug.Print SecondDoc.Name
End Sub
Листинг 1.2.
Закрыть окно

Dim Item As CaptionLabel With


Public Sub AddCaptions() 'Работа с коллекцией заголовков
Dim Item As CaptionLabel With CaptionLabels Debug.Print .Count 'Добавление трех заголовков .Add "Мой Рисунок" .Add "Диаграмма Excel" .Add "Мой Пример" Debug.Print .Count For Each Item In CaptionLabels Debug.Print Item .Name Next Item 'Удаление последнего заголовка .item(.Count).Delete
End With End Sub
Листинг 1.3.
Закрыть окно

Figure Table Equation Мой


3 6 Figure Table Equation Мой Рисунок Диаграмма Excel Мой Пример
Листинг 1.4.
Закрыть окно

Вставка заголовков With ActiveDocument


Public Sub InsertLabelInDoc() 'Вставка заголовка в текст документа ' Вставка заголовков With ActiveDocument .Paragraphs.Add .Paragraphs.Last.Range.Select Selection.InsertCaption Label:="Диаграмма Excel" .Paragraphs.Add .Paragraphs.Last.Range.Select Selection.InsertCaption Label:=CaptionLabels(CaptionLabels.Count) End With End Sub
Листинг 1.5.
Закрыть окно

Диаграмма Excel


Диаграмма Excel 1 Диаграмма Excel 2
Листинг 1.6.
Закрыть окно

с коллекцией автозаголовков Dim Item


Public Sub >WorkWithAutoLabels() 'Работа с коллекцией автозаголовков Dim Item As AutoCaption
Debug.Print AutoCaptions.Count For Each Item In AutoCaptions 'Включение автоматической вставки заголовка item.AutoInsert = True Debug.Print Item .Name Next Item
End Sub
Листинг 1.7.
Закрыть окно

Microsoft Word Table Adobe


28 Microsoft Word Table Adobe Acrobat Document Видеоклип Microsoft Chat Room Диаграмма Microsoft Excel Лист Microsoft Excel MIDI-файл
Листинг 1.8.
Закрыть окно

Включаются все флажки With AutoCorrect


Public Sub WorkWithAutoCorrect() 'Работа с объектом AutoCorrect ' Включаются все флажки With AutoCorrect .CorrectInitialCaps = True .CorrectSentenceCaps = True .CorrectDays = True .CorrectCapsLock = True .ReplaceText = True .ReplaceTextFromSpellingChecker = True .CorrectKeyboardSetting = True
'В коллекцию Entries, задающую замены при автокоррекции, 'добавляются два элемента. .Entries.AddName:="ДЕ", Value:="Диаграмма Excel" .Entries.AddName:="ГЕ", Value:="График Excel"
End With End Sub
Листинг 1.9.
Закрыть окно

с объектом Browser Dim myrprev


Public Sub WorkWithBrowser() 'Работа с объектом Browser Dim myrprev As Range, myrnext As Range, Answer As String 'Поиск нужного заголовка в диалоге с пользователем 'Установить заголовок в качестве цели поиска Application.Browser.Target = wdBrowseHeading With ActiveDocument 'Встать в начало документа .Paragraphs.First.Range.Select Set myrnext = Selection.Range Do Answer = InputBox("Это искомый заголовок? (Да/Нет)", "Заголовки", "Нет") If Answer = "Да" Then Exit Do 'Передвинуться к следующему заголовку Application.Browser.Next Set myrprev = myrnext Selection.MoveEnd (wdParagraph) Set myrnext = Selection.Range Loop Until (myrprev = myrnext)
If Answer = "Нет" Then MsgBox ("В данном документе нет других заголовков стиля Heading") End If End With End Sub
Листинг 1.10.
Закрыть окно

Предоставление пользователю возможности открыть любой


Public Sub WindowOpenFile() ' Предоставление пользователю возможности открыть любой файл. 'Открывается каталог, хранящий активный документ, с показом всех файлов. Dim Act As Long With Dialogs (wdDialogFileOpen) .Name = ActiveDocument.Path & "\*.*" Act = . Show Debug.Print Act If Act = -1 Then 'Файл успешно открыт и можно получить путь к нему и его имя Debug.Print Documents(1).Path & "\" & Documents(1).Name End If End With
End Sub
Листинг 1.11.
Закрыть окно

Dim Act As Long Dim


Public Sub DialogFileFind() 'Предоставление пользователю возможности найти файл.
Dim Act As Long Dim HisDialog As Dialog
With Dialogs (wdDialogFileFind) Debug.Print "Type - ", .Type, "Вызываемая процедура - ", .CommandName 'Метод Update задает установки по умолчанию для ряда параметров. 'Некоторые параметры сохраняют установки предыдущего вызова FileFind .Update
'Предварительное задание параметров перед открытием диалогового окна. 'Не все из заданных значений передаются в окно. .SearchName = "*.doc" .Name = "Ch6" .SearchPath = "e:\O2000\DS2000" .SubDir = 1 .MatchCase = 1 . DateCreatedFrom = "20.05.2000" .Author = "Vladimir Billig" .Text = "файлов" .Execute Act = . Show If Act = -1 Then MsgBox (Documents(1).Name) Debug.Print Act End With Set HisDialog = Dialogs (wdDialogFileFind) With HisDialog .Execute Act = . Show End With End Sub
Листинг 1.12.
Закрыть окно

Вызываемая процедура


Type - 99 Вызываемая процедура - FileFind -1 ?HisDialog.SearchName
?HisDialog.Name Ch ?HisDialog.SearchPath E:\O2000\DS2000 ?HisDialog.SubDir 1 ?HisDialog.MatchCase 1 ?HisDialog. DateCreatedFrom
?HisDialog.Author
?HisDialog.Text Execute
Листинг 1.13.
Закрыть окно

Dim Lang As Language, Dict


Public Sub WorkLang() Dim Lang As Language, Dict As Dictionary Dim AppLang As Long, InterfaceLang As Long, HelpLang As Long
'Орфографический словарь Set Lang = Languages(wdRussian) Set Dict = Lang.ActiveSpellingDictionary Debug.Print Lang.Name If Not (Dict Is Nothing) Then Debug.Print Dict.Path & Application.PathSeparator & Dict.Name End If 'Установки языка общения AppLang = Application. LanguageSettings.LanguageID(msoLanguageIDInstall) InterfaceLang = Application. LanguageSettings.LanguageID(msoLanguageIDUI) HelpLang = Application. LanguageSettings.LanguageID(msoLanguageIDHelp) If AppLang = (InterfaceLang) And (AppLang = HelpLang) _ And (AppLang = wdRussian) Then Debug.Print "Установлен русский язык" _ & " в качестве языка инсталляции, интерфейса и справки" ElseIf AppLang = (InterfaceLang) And (AppLang = HelpLang) _ And (AppLang = wdEnglishUS) Then Debug.Print "Установлен английский язык" _ & " в качестве языка инсталляции, интерфейса и справки" End If
If Application. LanguageSettings. _ LanguagePreferredForEditing(msoLanguageIDRussian) Then Debug.Print "Русский язык является" _ & " одним из предпочтительных языков редактирования" End If End Sub
Листинг 1.14.
Закрыть окно

LEX Русский Установлен английский язык


'C:\Program Files\Common Files\Microsoft Shared\Proof\MSSP_RU. LEX Русский Установлен английский язык в качестве языка инсталляции, интерфейса и справки Русский язык является одним из предпочтительных языков редактирования.
Листинг 1.15.
Закрыть окно

с почтовыми сообщениями Dim MyAddr


Public Sub WorkWithMail() 'Работа с почтовыми сообщениями Dim MyAddr As String, MyName As String Dim MailLab As CustomLabel MyName = Application.MailingLabel.DefaultLabelName Debug.Print MyName
Set MailLab = Application.MailingLabel.CustomLabels _ .Add(Name:="My Friend", DotMatrix:=True) MyAddr = "Россия" & vbCrLf & "Мой город" & vbCr & "Моя улица, 41, 7" & vbCr _ & "Моему другу" 'MailLab.PageSize = wdCustomLabelLetter If Documents("DocOne").Bookmarks.Exists("EnvelopeAddress") Then Application.MailingLabel.PrintOut _ Name:=MyName, ExtractAddress:=True, SingleLabel:=True End If
Application.MailingLabel.CreateNewDocument _ Name:="My Friend", Address:=MyAddr
End Sub
Листинг 1.16.
Закрыть окно

Dim mes As MailMessage


Public Sub WorkWithMailMessage() Dim mes As MailMessage Documents("test").Activate Set mes = Application.MailMessage If Not (mes Is Nothing) Then Debug.Print mes.Application.Name 'mes. DisplaySelectNamesDialog 'mes.CheckName 'mes.GoToNext 'mes. DisplayMoveDialog End If End Sub
Листинг 1.17.
Закрыть окно

Public Sub


Public Sub WorkEmail()
With Application.EmailOptions.EmailSignature
If Selection.LanguageID = wdRussian Then .NewMessageSignature = "Подпись" .ReplyMessageSignature = "Подпись" Else .NewMessageSignature = "sign1" .ReplyMessageSignature = "sign1" End If Debug.Print .NewMessageSignature
End With
End Sub
Листинг 1.18.
Закрыть окно

с объектом Options


Public Sub WorkWithOptions() 'работа с объектом Options Options.AutoFormatAsYouTypeReplaceFractions = True Options.AllowDragAndDrop = True Options.CheckGrammarWithSpelling = True Options.EnableSound = False Options.MonthNames = wdMonthNamesEnglish Options.PrintComments = True End Sub
Листинг 1.19.
Закрыть окно

с конвертором Dim conv As


Public Sub ConvertDoc() 'Работа с конвертором Dim conv As FileConverter Debug.Print Application.FileConverters.Count For Each conv In Application.FileConverters Debug.Print conv.Name, conv.FormatName, conv.ClassName If conv.CanOpen And conv.CanSave Then Debug.Print "Конвертор может открывать и сохранять файлы" End If Next conv End Sub
Листинг 1.20.
Закрыть окно

Text with Layout Text


26 Text with Layout Text with Layout Конвертор может открывать и сохранять файлы MS-DOS Text with Layout MS-DOS Text with Layout Конвертор может открывать и сохранять файлы WordPerfect 5.x for Windows WrdPrfctWin WordPerfect 5.1 for DOS WrdPrfctDOS51
Листинг 1.21.
Закрыть окно

и окружения Dim env As


Public Sub WorkWithSystem() 'Получение характеристик компьютера и окружения Dim env As System Set env = Application.System 'Debug.Print "Тип компьютера - ", env.ComputerType Debug.Print "Тип процессора - ", env.ProcessorType Debug.Print "Операционная система - ", env.OperatingSystem Debug.Print "Язык - ", env.LanguageDesignation Debug.Print "Свободного дискового пространства - ", env.FreeDiskSpace Debug.Print "Курсор - ", env.Cursor
End Sub
Листинг 1.22.
Закрыть окно

Pentium Операционная система


Тип процессора - Pentium Операционная система - Windows NT Язык - Russian (Russia) Свободного дискового пространства - 807567360 Курсор - 2
Листинг 1.23.
Закрыть окно

с задачами Dim Tsk As


Public Sub WorkWithTasks() 'Работа с задачами Dim Tsk As Task Debug.Print Application.Tasks.Count For Each Tsk In Application.Tasks Debug.Print Tsk.Name Next Tsk
End Sub
Листинг 1.24.
Закрыть окно

Microsoft Agent Microsoft Office


65 Microsoft Agent Microsoft Office Shortcut Bar Menu Parent Window NetDDE Agent Edit Microsoft Visual Basic - DocOne [running] - [Examples (Code)] Ch1 - Microsoft Word Run Sub/UserForm View DocOne - Microsoft Word Edit
Transmission window MarshalingWindow OLEChannelWnd MarshalingWindow Microsoft Outlook Program Manager
Листинг 1.25.
Закрыть окно

Метод Display ведет диалог, не


Public Sub WorkWithDialogs() Dim dlg As Dialog 'Открытие документа в диалоге с пользователем 'Метод Show ведет диалог и открывает документ Dialogs(wdDialogFileOpen). Show
' Метод Display ведет диалог, не открывая документа, 'но позволяя получить имя файла. Set dlg = Dialogs (wdDialogFileOpen) If dlg. Display = -1 Then 'нажата кнопка Open Documents.Open FileName:=dlg.Name End If End Sub
Листинг 1.26.
Закрыть окно

В документе DocThree создаются разделы


Public Sub WorkWithSections() ' В документе DocThree создаются разделы документа 'Вначале документ не имеет разделов Dim sect As Section Dim myr As Range Documents("Docthree").Activate With ActiveDocument Debug.Print "В документе разделов - ", .Sections.Count 'Выделение последнего раздела .Sections(.Sections.Count).Range.Select Debug.Print "Абзацев в разделе - ", Selection.Paragraphs.Count Debug.Print "Предложений в разделе - ", Selection.Sentences.Count Debug.Print "Слов в разделе - ", Selection.Words.Count Debug.Print "Символов в разделе - ", Selection.Characters.Count
'Добавление разделов Set myr = .Paragraphs(11).Range myr.Select myr.InsertBreak wdSectionBreakNextPage
Set myr = .Paragraphs(18).Range .Sections.Add myr, wdSectionEvenPage
Set myr = .Paragraphs(29).Range .Sections.Add myr
.Sections.Add 'Повторная печать после создания новых разделов Debug.Print "В документе разделов - ", .Sections.Count 'Выделение первого раздела Set sect = .Sections(1) Debug.Print "Абзацев в разделе - ", sect.Range.Paragraphs.Count Debug.Print "Предложений в разделе - ", sect.Range.Sentences.Count Debug.Print "Слов в разделе - ", sect.Range.Words.Count Debug.Print "Символов в разделе - ", sect.Range.Characters.Count End With End Sub
Листинг 1.27.
Закрыть окно

с поддокументами Dim DocPath As


Public Sub WorkWithSubDoc() 'Работа с поддокументами Dim DocPath As String Dim myr As Range 'Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthree").Activate With ActiveDocument Debug.Print "Число поддокументов =", .Subdocuments.Count If .Subdocuments.Count = 0 Then If .Sections.Count = 1 Then 'Выделение разделов WorkWithSections End If 'Выделение поддокумента, начиная с третьего раздела и до последнего Set myr = .Range(Start:=.Sections(3).Range.Start, _ End:=.Sections(.Sections.Count).Range.End) .Subdocuments.AddFromRange myr Debug.Print "Теперь число поддокументов =", .Subdocuments.Count End If End With
End Sub
Листинг 1.28.
Закрыть окно

с таблицами Dim DocPath As


Public Sub WorkWithTables() 'Работа с таблицами Dim DocPath As String Dim myr As Range Dim ToF As TableOfFigures Dim MyTable As Table Dim i As Integer, j As Integer
'Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthree").Activate
With ActiveDocument 'Создание оглавления - Table of Contents .TablesOfContents.Add .Range(Start:=0, End:=0)
'Создание обычной таблицы myTable в конце документа Set MyTable = .Tables.Add(Range:=.Paragraphs.Last.Range, _ NumRows:=2, NumColumns:=3) 'Заполнение таблицы For i = 1 To MyTable.Rows.Count For j = 1 To MyTable.Columns.Count MyTable.Cell(i, j).Range.InsertAfter i + j Next j Next i End With 'Вызов процедуры работы с таблицами ссылок WorkWithTablesOfFigures End Sub
Листинг 1.29.
Закрыть окно

В этой процедуре демонстрируется работа


Sub WorkWithDrawingTable() ' В этой процедуре демонстрируется работа 'с рисованной таблицей Менделеева Documents("ExampleOfTable").Activate Dim DrawTable As Table Set DrawTable = ActiveDocument.Tables(1) With DrawTable Debug.Print "Столбцов - ", .Columns.Count Debug.Print "Строк - ", .Rows.Count Debug.Print .Cell(5, 1).Range.Text 'Усложняем конфигурацию .Cell(4, 5).Split 2, 3 End With End Sub
Листинг 1.30.
Закрыть окно

с таблицами ссылок на иллюстрации


Public Sub WorkWithTablesOfFigures() 'Работа с таблицами ссылок на иллюстрации документа Dim DocPath As String Dim myr As Range Dim ToF As TableOfFigures Dim capt As CaptionLabel 'Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthree").Activate
With ActiveDocument
Set myr = Selection.Range myr.Select 'Создаем таблицы ссылок на графики и таблицы 'Оба заголовка должны быть элементами коллекции CaptionLabels .TablesOfFigures.Add Range:=myr, Caption:="График" .TablesOfFigures.Add Range:=myr, Caption:="Table"
For Each ToF In .TablesOfFigures Debug.Print ToF.Caption Next ToF For Each capt In Application.CaptionLabels Debug.Print capt.Name Next capt End With End Sub
Листинг 1.31.
Закрыть окно

и InlineShapes Dim Item As


Public Sub AddTwoShapes() 'добавляются рисунки в коллекцию TableOfFiguress и InlineShapes Dim Item As AutoCaption Dim MyPath As String Documents("DocOne").Activate MyPath = ActiveDocument.Path 'Отключим вставку автозаголовока для рисунков Set Item = Word.Application.AutoCaptions("Microsoft Word Picture") item.AutoInsert = False
With ActiveDocument 'Рисунок добавляется в коллекцию TableOfFiguress .Shapes.AddPicture FileName:=MyPath & "\cat.gif"
'Рисунок добавляется в коллекцию InlineShapes 'привязывается к первому параграфу документа. .InlineShapes.AddPicture FileName:=MyPath & "\mouse.bmp", _ Range:=.Paragraphs.First.Range End With End Sub
Листинг 1.32.
Закрыть окно

Создание группы объектов TableOfFigures разных


Sub GroupOfShapes() ' Создание группы объектов TableOfFigures разных типов 'Создание объекта (коллекции) TableOfFiguresRange 'Группирование объектов Dim SR As TableOfFiguresRange, SH As TableOfFigures
With ActiveDocument.shapes 'Добавляем текстовое окно. Координаты Left-Top-Width-Height относительно якоря .AddTextbox(msoTextOrientationHorizontal, 220, _ 40, 120, 30).Select Selection.ShapeRange.Name = "Parts" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Части документа" Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter 'Добавляем стрелку .AddLine(280, 70, 280, 100).Select Selection.ShapeRange.Name = "Ar1" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем линию .AddLine(120, 100, 440, 100).Select Selection.ShapeRange.Name = "Lin1" 'Добавляем стрелку .AddLine(120, 100, 120, 130).Select Selection.ShapeRange.Name = "Ar2" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем стрелку .AddLine(440, 100, 440, 130).Select Selection.ShapeRange.Name = "Ar3" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 80, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part1" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Рисунки" 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 400, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part2" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Таблицы"
'Группирование объектов Set SR = .Range(Array("Parts", "Ar1", "Lin1", _ "Ar2", "Ar3", "Part1", "Part2")) SR.Select HowManyShapes Set SH = SR.Group SH.Name = "Fig.1" SH.Select HowManyShapes End With
End Sub
Листинг 1.33.
Закрыть окно

Dim SR As TableOfFiguresRange Dim


Public Sub HowManyShapes() Dim SR As TableOfFiguresRange Dim SH As TableOfFigures Set SR = Selection.ShapeRange For Each SH In SR Debug.Print SH.Name Next SH Debug.Print Selection.ShapeRange.Count End Sub
Листинг 1.34.
Закрыть окно

Parts Ar1 Lin1 Ar2 Ar3


Parts Ar1 Lin1 Ar2 Ar3 Part1 Part2 7 Fig.1 1
Листинг 1.35.
Закрыть окно

Открываем документ DocTwo Dim MyPath


Public Sub WorkWithLists() 'работа со списками ' Открываем документ DocTwo Dim MyPath As String Dim myRange As Range MyPath = Documents("DocOne").Path 'должен быть открыт Documents.Open MyPath & "\DocTwo.doc" Documents("DocTwo").Activate With ActiveDocument Debug.Print "Списков в документе - ", .Lists.Count Debug.Print "Они занимают -", .ListParagraphs.Count, " абзацев" 'Создаем новый список Set myRange = .Range(Start:=.Paragraphs(3).Range.Start, _ End:=.Paragraphs(6).Range.End) myRange. ListFormat.ApplyBulletDefault Debug.Print "Теперь списков -", .Lists.Count Debug.Print "Они занимают - ", .ListParagraphs.Count, "абзацев" 'Повторное применение отменяет форматирование myRange. ListFormat.ApplyBulletDefault Debug.Print "Теперь списков -", .Lists.Count Debug.Print "Они занимают - ", .ListParagraphs.Count, "абзацев"
End With End Sub
Листинг 1.36.
Закрыть окно

абзацев Теперь списков


Списков в документе - 1 Они занимают - 3 абзацев Теперь списков - 2 Они занимают - 7 абзацев Теперь списков - 1 Они занимают - 3 абзацев
Листинг 1.37.
Закрыть окно

Открываем документ DocTwo Dim MyPath


Public Sub WorkWithComments() 'работа с комментариями, сносками ' Открываем документ DocTwo Dim MyPath As String Dim myRange As Range Dim Fnote As Footnote, Enote As Endnote MyPath = Documents("DocOne").Path 'DocOne должен быть открыт Documents.Open MyPath & "\DocTwo.doc" Documents("DocTwo").Activate With ActiveDocument Set myRange = .Sections(2).Range.Paragraphs(2).Range .Comments.Add myRange, "Программный проект этого документа" _ & vbCrLf & " содержит примеры главы 1" .Comments(1).Author = "Владимир Биллиг" 'Показ комментария ActiveWindow.View.SplitSpecial = wdPaneComments .Comments. ShowBy = "Владимир Биллиг"
'Передвигается объект Range и устанавливаются сноски: 'подстраничная и конечная myRange.Move Unit:=wdParagraph, Count:=1 .Footnotes.Add Range:=myRange, _ Text:="документ DocTwo используется для экспериментов." myRange.Move Unit:=wdParagraph, Count:=1 'нумерация конечных сносок с начала страницы '.Endnotes.NumberingRule = wdRestartPage .Endnotes.Add Range:=myRange, _ Text:="документ DocThree используется для экспериментов." 'Печать сносок For Each Fnote In .Footnotes Debug.Print Fnote.Range Next Fnote For Each Enote In .Endnotes Debug.Print Enote.Range Next Enote
End With End Sub
Листинг 1.38.
Закрыть окно

Открываем документ DocTwo Dim MyPath


Public Sub WorkWith Revisions() 'работа с исправлениями ' Открываем документ DocTwo Dim MyPath As String Dim MyRange As Range Dim Revis As Revision 'DocOne должен быть открыт MyPath = Documents("DocOne").Path Documents.Open MyPath & "\DocTwo.doc" Documents("DocTwo").Activate With ActiveDocument 'Работа с исправлениями . Show Revisions = True 'Удаляем все имеющиеся исправления . Revisions.RejectAll
'Добавляем новый абзац .Paragraphs.Add .Paragraphs.Last.Range.Text = "В книгах для программистов" _ & " тексты программ играют важную роль" .Paragraphs.Last.Range.Select 'Вводим исправления в последний абзац (автор Fooler) .Track Revisions = True Application.UserName = "Fooler" Selection.Range.Text = "В книгах для программистов" _ & " тексты программ не играют особой роли," _ & " а лишь усложняют понимание" 'Добавляем новый абзац .Track Revisions = False .Paragraphs.Add .Paragraphs.Last.Range.Text = "В книгах для программистов" _ & " тексты программ играют важную роль." .Paragraphs.Last.Range.Select 'Вводим исправления в последний абзац (автор Thinker) .Track Revisions = True Application.UserName = "Thinker" Selection.Range.Text = "В книгах для программистов" _ & " тексты программ весьма полезны," _ & " если только это хорошие программы."
For Each Revis In . Revisions Debug.Print Revis.Author, Revis.Date, Revis.Range.Text If Revis.Author = "Fooler" Then Revis.Reject ElseIf Revis.Author = "Thinker" Then Revis.Accept End If Next Revis Debug.Print . Revisions.Count .Track Revisions = False . Show Revisions = False Application.UserName = "Vladimir Billig" End With
End Sub
Листинг 1.39.
Закрыть окно

с рисунком Dim MyPath As


Public Sub CreateBookmarks() 'Создание закладок 'Создадим закладку в документе DocOne и свяжем ее с рисунком Dim MyPath As String Documents("DocOne").Activate With ActiveDocument MyPath = .Path .InlineShapes(1).Select 'рисунок мышки .Bookmarks.Add "PictureOfMouse", Selection.Range End With 'Создадим закладку в документе ExampleOfTable и свяжем ее с таблицей Documents.Open (MyPath & "\ExampleOfTable") Documents("ExampleOfTable").Activate With ActiveDocument .Tables(1).Select 'таблица Менделеева .Bookmarks.Add "ТаблицаМенделеева", Selection.Range End With End Sub
Листинг 1.40.
Закрыть окно

в документе DocOne Dim MyPath


Public Sub CreateHyperLinks() 'Создание гиперссылок 'Создадим три гиперссылки в документе DocOne Dim MyPath As String Documents("DocOne").Activate
With ActiveDocument MyPath = .Path 'гиперссылка- элемент группового объекта TableOfFigures 'свяжем ее с закладкой этого же документа .shapes(2).GroupItems(6).TextFrame.TextRange.Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:="", SubAddress:="PictureOfMouse"
'гиперссылка- элемент группового объекта TableOfFigures 'свяжем ее с закладкой другого документа .shapes(2).GroupItems(7).TextFrame.TextRange.Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\ExampleOfTable.doc", _ SubAddress:="ТаблицаМенделеева", _ ScreenTip:="Переход к документу," _ & " содержащему таблицу Менделеева" 'гиперссылка- объект TableOfFigures 'свяжем ее с URL .shapes(1).Select .Hyperlinks.Add Anchor:=Selection.Range, _ Address:="http://www.microsoft.ru/offext/", _ SubAddress:="", _ ScreenTip:="Переход к Web- странице" _ & " программы Office Extensions" End With 'Создадим гиперсссылку в документе ExampleOfTable 'и свяжем ее с закладкой документа DocOne Documents("ExampleOfTable").Activate With ActiveDocument 'Установка гиперссылки возврата в документ Word DocOne .Tables(1).Select 'таблица Менделеева Selection.MoveDown Selection.Expand .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\DocOne.doc", _ SubAddress:="PictureOfMouse", _ ScreenTip:="Возврат к документу DocOne" 'Установка гиперссылки перехода 'к именованному элементу документа Excel - BookOne Selection.MoveDown Selection.Expand .Hyperlinks.Add Anchor:=Selection.Range, _ Address:=MyPath & "\BookOne.xls", _ SubAddress:="ТаблицаПродаж", _ ScreenTip:="Переход к элементу" _ & " c именем ТаблицаПродаж документа Excel - BookOne"
End With End Sub
Листинг 1.41.
Закрыть окно

Удаляет по запросу закладки активного


Public Sub RemoveBookmarks() ' Удаляет по запросу закладки активного документа Dim MyBM As Bookmark Dim Answer As String With ActiveDocument For Each MyBM In .Bookmarks Answer = InputBox(Prompt:="Удалить закладку? " & vbCrLf _ & "Имя закладки - " & MyBM.Name, _ Title:="Удаление закладок", Default:="Да") If Answer = "Да" Then MyBM.Delete
Next MyBM End With End Sub
Листинг 1.42.
Закрыть окно

Удаляет по запросу гиперссылки активного


Public Sub RemoveHyperlinks() ' Удаляет по запросу гиперссылки активного документа Dim MyHL As Hyperlink Dim Answer As String,NameHL As String With ActiveDocument Debug.Print .Hyperlinks.Count For Each MyHL In .Hyperlinks 'определение объекта, с которым связана гиперссылка If MyHL.Type = msoHyperlinkRange Then NameHL = MyHL.Range.Text Else:NameHL = MyHL.Shape.Name End If Answer = InputBox(Prompt:="Удалить гиперссылку? " & vbCrLf _ & "связана с объектом - " &NameHL & vbCrLf _ & "Имя целевого документа - " & MyHL.Address & vbCrLf _ & "Имя целевого элемента - " & MyHL.SubAddress, _ Title:="Удаление гиперссылок", Default:="Да") If Answer = "Да" Then MyHL.Delete
Next MyHL End With End Sub
Листинг 1.43.
Закрыть окно

следуя гиперссылке активного документа Dim


Public Sub FollowHyperlinks() ' Переход по запросу, следуя гиперссылке активного документа Dim MyHL As Hyperlink Dim Answer As String,NameHL As String With ActiveDocument For Each MyHL In .Hyperlinks 'определение объекта, с которым связана гиперссылка If MyHL.Type = msoHyperlinkRange Then NameHL = MyHL.Range.Text Else:NameHL = MyHL.Shape.Name End If Answer = InputBox(Prompt:="Перейти, следуя гиперссылке? " ;amp; vbCrLf _ & "связана с объектом - " &NameHL & vbCrLf _ & "Имя целевого документа - " & MyHL.Address & vbCrLf _ & "Имя целевого элемента - " & MyHL.SubAddress, _ Title:="Переход по гиперссылке", Default:="Да") If Answer = "Да" Then MyHL.Follow MsgBox ("Продолжаем работать!") Exit For End If
Next MyHL End With End Sub
Листинг 1.44.
Закрыть окно

Анализирует характеристики полей активного документа


Public Sub FieldsAnalise() ' Анализирует характеристики полей активного документа Dim MyField As Field With ActiveDocument Debug.Print "Число полей - ", .Fields.Count For Each MyField In .Fields With MyField Debug.Print "Код поля - ", .Code, _ "Вид поля - ", .Kind, _ "Тип поля - ", .Type, _ "Результат поля - ", .Result End With Next MyField End With End Sub
Листинг 1.45.
Закрыть окно

Близкие тебе люди" Вид поля


Число полей - 12 Код поля - DATE \* MERGEFORMAT Вид поля - 2 Тип поля - 31 Результат поля - 13.12.99 Код поля - MERGEFIELD Country Вид поля - 2 Тип поля - 59 Результат поля - "Country" Код поля - MERGEFIELD City Вид поля - 2 Тип поля - 59 Результат поля - "City" Код поля - MERGEFIELD Address Вид поля - 2 Тип поля - 59 Результат поля - "Address" Код поля - MERGEFIELD FirstName Вид поля - 2 Тип поля - 59 Результат поля - "FirstName" Код поля - MERGEFIELD LastName Вид поля - 2 Тип поля - 59 Результат поля - "LastName" Код поля - MERGEFIELD HomePhone Вид поля - 2 Тип поля - 59 Результат поля - "HomePhone" Код поля - MERGEFIELD FirstName Вид поля - 2 Тип поля - 59 Результат поля - "FirstName" Код поля - FILLIN "Введите имя (имена) близких!" \d " Близкие тебе люди" Вид поля - 2 Тип поля - 39 Результат поля - Близкие тебе люди Код поля - ASK Vremya "Сколько лет не виделись?" \d "1" Вид поля - 2 Тип поля - 38 Результат поля - 2 Код поля - Ref Vremya Вид поля - 2 Тип поля - 3 Результат поля - 2 Код поля - = Vremya *365*24*60 Вид поля - 2 Тип поля - 34 Результат поля - 1051200
Листинг 1.46.
Закрыть окно

Range, Type, Text, PreserveFormatting)


Add( Range, Type, Text, PreserveFormatting)
Листинг 1.47.
Закрыть окно

в начало документа Dim myRange


Public Sub CreateFields() 'Работа с полями With ActiveDocument 'Добавление полей разного типа в начало документа Dim myRange As Range 'Установить автора документа ' .Name = "Vladimir Billig" Set myRange = .Range(Start:=0, End:=0) .Paragraphs.Add myRange .Paragraphs.Add myRange .Paragraphs.Add myRange myRange.Move Unit:=wdParagraph, Count:=-3 .Fields.Add Range:=myRange, Type:=wdFieldAuthor myRange.Move Unit:=wdParagraph, Count:=1 .Fields.Add Range:=myRange, Type:=wdFieldDate myRange.Move Unit:=wdParagraph, Count:=1 .Fields.Add Range:=myRange, Type:=wdFieldTime
'Еще один способ добавления полей на примере 'добавления поля автора с одновременным изменением автора документа myRange.Move Unit:=wdParagraph, Count:=1 myRange.Select .Fields.Add Range:=myRange, Type:=wdFieldEmpty, _ PreserveFormatting:=False Selection.TypeText Text:="Author ""Fooler"""
'Печать полей FieldsAnalyse 'Обновление полей .Fields.Update FieldsAnalyse End With End Sub
Листинг 1.48.
Закрыть окно

Vladimir Billig Код поля


Число полей - 4 Код поля - Author \* MERGEFORMAT Вид поля - 2 Тип поля - 17 Результат поля - Vladimir Billig Код поля - DATE \* MERGEFORMAT Вид поля - 2 Тип поля - 31 Результат поля 14.12.99 Код поля - TIME \* MERGEFORMAT Вид поля - 2 Тип поля - 32 Результат поля - 12:28 Код поля - Author "Fooler" Вид поля - 0 Тип поля --1 Результат поля - Число полей - 4 Код поля - Author \* MERGEFORMAT Вид поля - 2 Тип поля - 17 Результат поля - Vladimir Billig Код поля - DATE \* MERGEFORMAT Вид поля - 2 Тип поля - 31 Результат поля - 14.12.99 Код поля - TIME \* MERGEFORMAT Вид поля - 2 Тип поля - 32 Результат поля - 12:28 Код поля - Author "Fooler" Вид поля - 2 Тип поля - 17 Результат поля - Fooler
Листинг 1.49.
Закрыть окно

Анализ возможных типов фрагментов акивного


Public Sub WorkWithStory() 'Работа с фрагментами (story) ' Анализ возможных типов фрагментов акивного докуммента Dim curstory As Range With ActiveDocument For Each curstory In .StoryRanges Select Case curstory.StoryType Case wdMainTextStory Debug.Print "Начало текста:", curstory.Paragraphs(1).Range.Text Case wdCommentsStory Debug.Print "Комментарии:", curstory.Text Case wdEndnotesStory Debug.Print "Концевые ссылки:", curstory.Text Case wdFootnotesStory Debug.Print "Подстраничные ссылки:", curstory.Text Case Else Debug.Print "Фрагмент другого типа:", curstory.Text End Select Next curstory End With End Sub
Листинг 1.50.
Закрыть окно

Начало текста: Vladimir Billig Подстраничные


Начало текста: Vladimir Billig Подстраничные ссылки: документ DocTwo используется для экспериментов. Концевые ссылки: документ DocThree используется для экспериментов. Комментарии: Page: 2 Программный проект этого документа содержит примеры главы 1
Листинг 1.51.
Закрыть окно

Name As String,


Function Add( Name As String, [Value]) As Variable
Листинг 1.52.
Закрыть окно

Name As String) As Boolean


Public Sub CreateVar() 'Создание переменных - хранителей информации With ActiveDocument.Variables If Not ExistVar("Counter") Then 'Добавляем переменную .AddName:="Counter", Value:=0 End If End With
End Sub
Public Function ExistVar( Name As String) As Boolean 'Определяет наличие переменнойName в коллекции Variables Dim MyVar As Variable ExistVar = False For Each MyVar In ActiveDocument.Variables If MyVar.Name =Name Then ExistVar = True: Exit For End If Next MyVar End Function
Листинг 1.53.
Закрыть окно

Счетчик Counter может быть использован


Public Sub CheckCounter() Const Limit = 10 ' Счетчик Counter может быть использован в любой процедуре, 'позволяя следить за числом ее выполнения With ActiveDocument If .Variables("Counter") > Limit Then 'Исчерпан лимит нормальной работы демо-версии Call MsgBox("Исчерпан лимит работы демо-версии", _ vbCritical, "Конец работы!") Else ' продолжаем нормальную работу Dim myLocal As Integer 'Локальные переменные могут работать с глобальным счетчиком myLocal = .Variables("Counter") Debug.Print "Счетчик = "; myLocal
'В конце работы увеличиваем значение счетчика myLocal = myLocal + 1 .Variables("Counter") = myLocal End If End With End Sub
Листинг 1.54.
Закрыть окно

Пример ActiveDocument.Range.Sections(1)


ActiveDocument.Range.Sections(1).Range.Paragraphs(1).Range.Sentences(1).Words(1).Characters(1)
Листинг 1.55.
Закрыть окно

Пример Selection.Sections(1)


Selection.Sections(1).Range.Select Selection.Paragraphs(1).Range.Select Selection.Sentences(1).Select Selection.Words(1).Select
Листинг 1.56.
Закрыть окно

Dim myRange As Range, myRange1


Dim myRange As Range, myRange1 As Range With ActiveDocument Set myRange = .Range(Start:=.Sections(2).Range.Paragraphs(3).Range.Start, _ End:=.Sections(3).Range.Paragraphs(5).Range.End) Set myRange1 = .Sections(3).Range.Paragraphs(1).Range End With
Листинг 1.57.
Закрыть окно

Пример myRange.Start = myRange.End


myRange.Start = myRange.End
Листинг 1.58.
Закрыть окно

Set myRange


Set myRange = ActiveDocument.Paragraphs(1).Range myRange.Collapse Direction:=wdCollapseEnd myRange.MoveEnd Unit:=wdCharacter, Count:=-1
Листинг 1.59.
Закрыть окно

Пример ctiveDocument.Paragraphs(1).Range.Move


ActiveDocument.Paragraphs(1).Range.Move
Листинг 1.60.
Закрыть окно

Удаляются первые три слова из


'Удаляется текст в области объекта myRange myRange.Delete ' Удаляются первые три слова из области myRange1 myRange1.Delete Unit:= wdWord, Count :=3 'Область стягивается в точку myRange1.Collapse Direction := wdCollapseStart 'Удаляются три первых слова из области, предшествующей myRange1 myRange1.Delete Unit:= wdWord, Count :=-3
Листинг 1.61.
Закрыть окно

Dim myRange As Range Set


Dim myRange As Range Set myRange = ActiveDocument.Range(Start:=0, End:=0) myRange.Text = "дорогой " myRange.InsertBefore "Мой " myRange.InsertAfter "друг! " myRange.InsertParagraphAfter
Листинг 1.62.
Закрыть окно

Set myRange


Set myRange = ActiveDocument.Range myRange.InsertParagraph
Листинг 1.63.
Закрыть окно

Dim myRange As Range Dim


Public Sub test1() Dim myRange As Range Dim myPath As String
With ActiveDocument myPath = .Path Set myRange = .Range(Start:=0, End:=0) myRange.InsertFile myPath & "\DocTwo.doc" End With End Sub
Листинг 1.64.
Закрыть окно

Dim myRange As Range Set


.Public Sub test1() Dim myRange As Range Set myRange = ActiveDocument.Paragraphs(5).Range myRange.Select 'Добавляем новый абзац myRange.InsertAfter "New Text" myRange.InsertParagraphAfter 'Выделяем и затем вырезаем добавленный абзац и помещаем его в буфер myRange.MoveStart Unit:=wdParagraph myRange.Select Selection.Cut 'Добавляем новый абзац Selection.InsertAfter "Новый текст!" Selection.InsertParagraphAfter 'Добавляем абзац из буфера Selection.Collapse Direction:=wdCollapseEnd Selection.Paste End Sub
Листинг 1.65.
Закрыть окно

Копирование рисунка через буфер Dim


Public Sub CopyImage() ' Копирование рисунка через буфер Dim MyRange As Range Set MyRange = Documents("DocOne").Paragraphs(1).Range With MyRange 'Первый абзац этого документа содержит рисунок ' - элемент коллекции TableOfFiguress.Выделяем рисунок .MoveEnd Unit:=wdCharacter, Count:=-7 .Select .Copy End With Set MyRange = ActiveDocument.Paragraphs(6).Range MyRange.Select Selection.Collapse Direction:=wdCollapseEnd Selection.Paste
End Sub
Листинг 1.66.
Закрыть окно

Класс EventsOfApp Public WithEvents AppEv


Option Explicit ' Класс EventsOfApp Public WithEvents AppEv As Word.Application
Листинг 1.67.
Закрыть окно

ByVal Doc As Document) MsgBox


Private Sub AppEv_DocumentOpen( ByVal Doc As Document) MsgBox ("Hi " & Doc.Name) End Sub
Private Sub AppEv_DocumentChange() Const Msg1 = "Вы переключились на работу с новым документом!" Call MsgBox(Msg1 & vbCrLf & ActiveDocument.Name, vbInformation, "Окно информации!") End Sub
Private Sub AppEv_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean) MsgBox ("Вы закрываете документ " & Doc.Name) DocQuit End Sub
Листинг 1.68.
Закрыть окно

Public App1 As New EventsOfApp


Public App1 As New EventsOfApp Public Sub OnEvents() 'Определение объекта Word.Application with Events 'Связывание Set App1.AppEv = Word.Application 'Теперь начинают работать обработчики событий у Word.Application End Sub Public Sub DocQuit() With ActiveDocument If ExistVar("CounterDoc") Then MsgBox "Число открытий документа " & .Name & vbCrLf & _ .Variables("CounterDoc"), VBE xclamation, "Число открытий документа!" Else MsgBox "У документа " & .Name _ & " нет счетчика числа открытий", VBE xclamation, "Число открытий документа!" End If End With End Sub
Листинг 1.69.
Закрыть окно

Связывание объекта Application


Sub AutoOpen() ' Связывание объекта Application с событиями Set App1.AppEv = Application End Sub
Листинг 1.70.
Закрыть окно

Простые объекты, вложенные в объект Document


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

Email EmailAuthorEnvelopeFramesetHTMLProjectLetterContentMailMergeMailMergeDataSourceMailMergeFieldsPageSetupLineNumberingTextColumnsRangeRoutingSlipVBProjectWebOptions

В Office 2000 у объекта Document появились три новых объекта в сравнении с предыдущей версией. Это объекты: Email, Frameset и WebOptions.

Итак, только на верхнем уровне в объект Document встроено около 50 объектов, определяющих его свойства. Большинство из этих объектов устроены достаточно сложно, - почти все содержат коллекции внутри себя. Попробуем упорядочить эту "тьму" объектов.



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


Три объекта, связанные с проверкой грамматики и орфографии: Languages, Dictionaries, SpellingSuggestions, позволяют установить нужный язык, выбрать словарь, в том числе пользовательские словари, а также работать со списком слов, предлагаемых для исправления при обнаружении ошибки правописания. Команды SpellingAndGrammar и Language меню Tools предоставляют аналогичные возможности при работе с документом вручную. Новый объект LanguageSettings позволяет получить установки языкового предпочтения на разных этапах работы с приложением. Взгляните на пример, в котором показана работа с этими объектами:

Листинг 1.14.

(html, txt)

Приведем результаты работы этой процедуры, определяющие мои текущие языковые установки:

'C:\Program Files\Common Files\Microsoft Shared\Proof\MSSP_RU.LEX Русский Установлен английский язык в качестве языка инсталляции, интерфейса и справки Русский язык является одним из предпочтительных языков редактирования.

Листинг 1.15.

(html, txt)



Работа с документами и класс Document


Вспомним, что мы уже знаем о документах Word. Когда открывается приложение, создается коллекция документов Documents, содержащая открытые документы. Если приложение Word создается в момент открытия документа Word, (заметим, что объект Word.Application может быть создан и в программном проекте другого приложения, например, Excel), то в начальный момент коллекция содержит минимум один новый или ранее существовавший документ. Программно новый документ добавляется в коллекцию методом Add, а уже существующий - методом Open объекта Documents. Чтобы добраться до нужного документа в коллекции, достаточно указать его индекс - имя файла, хранящего документ, - или его порядковый номер в коллекции. Для той же цели можно использовать и метод Item, но обычно он опускается. Метод Save позволяет сохранить документ, а метод Close, сохраняя документ в файле, закрывает его и удаляет из коллекции.

При применении метода Open обязательно указывать имя, а точнее путь к открываемому файлу. Однако задание конкретного пути всегда чревато неприятностями, поскольку при любом переносе системы местоположение файла может измениться. В одной из предыдущих процедур этой лекции WorkWithSearch я демонстрировал возможность использования свойства Path для нахождения пути к документу. Часто предпочтительнее предоставить пользователю возможность выбирать открываемый файл, хранящий документ. Для этого, конечно, можно использовать объект Dialog, при вызове методов которого открывается соответствующее диалоговое окно.

Вот еще один пример использования уже знакомого нам объекта Dialog FileOpen:

Public Sub WorkWithDialogs() Dim dlg As Dialog 'Открытие документа в диалоге с пользователем 'Метод Show ведет диалог и открывает документ Dialogs(wdDialogFileOpen). Show

'Метод Display ведет диалог, не открывая документа, 'но позволяя получить имя файла. Set dlg = Dialogs (wdDialogFileOpen) If dlg. Display = -1 Then 'нажата кнопка Open Documents.Open FileName:=dlg.Name End If End Sub

Листинг 1.26.

(html, txt)

Теперь подробнее рассмотрим свойства и методы документа - объекта класса Document. Это основной объект, свойства, события и методы которого следует знать основательно. Объект Document не менее сложен, чем объект Application.



Работа с фрагментами


StoryRanges(Range) - эта коллекция представляет совокупность частей документа, называемых фрагментами (Story). Количество различных фрагментов документа фиксировано. Нельзя добавлять элементы в эту коллекцию обычным способом, используя метод Add. Фрагменты появляются в коллекции, когда создается соответствующая часть документа. В этот момент определяется и тип фрагмента. Фрагменты имеют тип, задаваемый константами из перечисления wdStoryType. Главный фрагмент, конечно, - текст документа, тип которого задается константой wdMainTextStory. Фрагментами других типов являются комментарии, ссылки, колонтитулы. Заметьте: сам фрагмент является объектом Range. Так что благодаря фрагментам можно, например, работать с коллекцией комментариев, как с единой областью.

Приведем пример, где анализируются типы фрагментов активного документа:

Листинг 1.50.

(html, txt)

Тестовый документ состоит из фрагментов четырех типов, так как он, кроме текста, содержит комментарии и два типа ссылок. Вот результаты отладочной печати:

Начало текста: Vladimir Billig Подстраничные ссылки: документ DocTwo используется для экспериментов. Концевые ссылки: документ DocThree используется для экспериментов. Комментарии: Page: 2 Программный проект этого документа содержит примеры главы 1

Листинг 1.51.

(html, txt)



Работа с полями документа


Поля (коллекция Fields) используются в документах Word достаточно широко и играют множество самых разных ролей. Поэтому стоит поговорить о них подробнее. В зависимости от назначения поля оно относится к одной из 9 возможных категорий. Нет смысла и возможности заниматься полным анализом этих категорий, но некоторые основные роли, которые играют поля, я перечислю:

Поля могут хранить в документе некоторую обновляемую информацию. Такими полями являются поля Date и Time из категории Date and Time, хранящие текущую дату и текущее время. В полях Author, FileName, KeyWords, NumPages и других полях из категории Document Information содержится подробная информация о документе авторе документа, файле, в котором он находится, числе занимаемых страниц. В полях UserName и UserAddress из категории User Information хранится информация о фамилии и адресе владельца компьютера, используемая по умолчанию для создания поля Author документа, для создания обратного адреса по умолчанию при работе с конвертами. Эта роль полей достаточно понятна. Ясно, как программно и вручную можно работать с такими полями. Заметим, что значения некоторых из упомянутых полей меняются автоматически, например, время, дата, число страниц документа (число страниц документа - 57, число символов - 149609, дата - 01.07.2006, время - 9:27 )

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

Поля играют важную роль при создании документов с помощью слияния. Зачастую возникает необходимость создания группы однотипных документов, отличающихся лишь небольшими деталями. Типичным примером такого рода является группа рассылаемых писем, отличающихся адресом, названием компании и другими деталями. В этом случае создается главный документ, содержащий шаблон письма с полями и документ, хранящий источник данных. Поля главного документа задают переменную часть письма адрес, название компании и другие данные. Значения этих данных хранятся в источнике данных, который может быть таблицей Word, Access или Excel. Слияние главного документа с одной записью источника данных (строкой таблицы) приводит к появлению нового документа (письма). В слиянии могут участвовать как все записи источника данных, так и только часть из них, выбранная по запросу. В результате возникает необходимая совокупность писем. Имена полей в этом случае могут быть произвольными и представляют имена столбцов в таблице, задающей источник данных. Помимо этих полей в главном документе могут встречаться и поля Word из тех 9 категорий, о которых я уже говорил. В ситуациях слияния часто используются такие поля как Ask и Fill-In, позволяя в момент слияния запросить и добавить в документ индивидуальную информацию, не хранящуюся в записях источника данных. Поле Fill-In позволяет запросить данные при создании документа и сделать полученный ответ значением этого поля. Поле Ask работает аналогичным образом, за тем исключением, что ответ не становится значением поля, а связывается с некоторой создаваемой в этот момент закладкой. Затем эту закладку можно использовать в документе различными способами, принятыми для закладок. На деталях работы вручную останавливаться не буду, но пример такого главного документа приведу:



Рис. 1.14.  Главный документ с полями разных типов

Заметьте, поля в главном документе подсвечены и среди них есть как поля, заданные источником данных, так и общие для Word поля, Ask, Fill-In, Formula, Date. Вот как выглядит источник данных, с которым я проводил эксперименты:


увеличить изображение
Рис. 1.15.  Источник данных для слияния документов

Чтобы картина была полной, взгляните на один из документов, полученных в результате слияния главного документа и источника данных:


Рис. 1.16.  Документ, полученный слиянием главного документа и источника данных

Еще одним видом документа Word, использующим поля, является электронная форма. Необходимость в таких документах возникает, например, при пересылке анкет по электронной почте. Получатель формы заполняет поля анкеты, которые могут быть элементами управления: обычными текстовыми окнами ввода, флажками или выпадающими списками. Как поля они имеют имена: FormTextBox, FormCheckBox, FormDropDown. Говоря о полях, нельзя не упомянуть о таком важном и интересном поле, как поле Formula, позволяющее организовывать вычисления в документах Word. Эти вычисления, чаще всего, организуются в ячейках таблиц Word, но могут быть вставлены и в произвольное место документа. Пример такого поля приведен в главном документе. Строятся формулы аналогично формулам Excel и могут работать как с закладками, используемыми в качестве имен переменных, так и с ячейками таблиц Word. При вычислениях можно использовать некоторые из встроенных функций, допустимых в Excel. Тема вычислений в документах Word , его таблицах заслуживает, конечно, более подробного освещения, чем эти несколько строчек. Но обо всем сказать, нам не дано. Есть и другие случаи применения полей в документах Word. Например, поля автоматически создаются при создании таблиц ссылок, о которых я рассказывал ранее.

Я постарался кратко описать достаточно сложную тему работы с полями в документах Word. Конечно, обычно работа с полями выполняется вручную. Вряд ли, например, есть смысл создавать документ слияния программным путем. Поэтому, говоря о программировании работы с полями, я ограничусь достаточно простыми примерами. В основе программной работы с полями лежит работа с коллекцией полей Fields(Field). В следующем примере анализируются (печатаются) основные свойства объекта Field:



Public Sub FieldsAnalise() ' Анализирует характеристики полей активного документа Dim MyField As Field With ActiveDocument Debug.Print "Число полей - ", .Fields.Count For Each MyField In .Fields With MyField Debug.Print "Код поля - ", .Code, _ "Вид поля - ", .Kind, _ "Тип поля - ", .Type, _ "Результат поля - ", .Result End With Next MyField End With End Sub

Листинг 1.45.

(html, txt)

Приведем результаты отладочной печати для главного документа, имеющего обширную коллекцию полей разного типа:

Листинг 1.46.

(html, txt)

Большинство полей в этом документе это поля слияния (MergeField), значения которых берутся из источника данных в момент слияния главного документа с записями источника данных. Обратите внимание, ситуация с полями напоминает ситуацию с ячейками Excel, с одной стороны в ячейке содержится формула (в поле код поля), с другой стороны вычисленное по формуле значение (результат поля). По желанию всегда можно включить просмотр в полях либо кода поля, либо результата. По умолчанию, также как и для ячеек Excel, показывается результат поля. Свойство Kind, которое для всех полей нашего документа имеет одинаковое значение, указывает на то, как происходит автоматическое обновление значения поля, имеет ли поле результат.

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

Листинг 1.47.

(html, txt)

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

Рассмотрим теперь пример программного добавления полей в документ. Я ограничусь достаточно простой ситуацией. Добавим в начало документа три поля, задающие автора документа, дату и время:

Листинг 1.48.

(html, txt)

В этой процедуре добавляются три пустых абзаца в начало документа, а затем добавляются три поля. Затем демонстрируется еще один способ работы с полями, когда вначале задается пустое поле, а потом в нем печатается текст, определяющий это поле. Конечно, это должен быть разумный текст, определяющий тип поля и его характеристики. Так, зачастую, работают с полями вручную. Заметьте, необходимо обновить это поле, чтобы поле отражало значение результата. Печать результатов до обновления и после обновления позволяет проследить за изменениями значений полей. Приведем результаты отладки:

Листинг 1.49.

(html, txt)



Add(Range, Type, Text, PreserveFormatting)

Листинг 1.47.

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

Рассмотрим теперь пример программного добавления полей в документ. Я ограничусь достаточно простой ситуацией. Добавим в начало документа три поля, задающие автора документа, дату и время:

Public Sub CreateFields() 'Работа с полями With ActiveDocument 'Добавление полей разного типа в начало документа Dim myRange As Range 'Установить автора документа ' .Name = "Vladimir Billig" Set myRange = .Range(Start:=0, End:=0) .Paragraphs.Add myRange .Paragraphs.Add myRange .Paragraphs.Add myRange myRange.Move Unit:=wdParagraph, Count:=-3 .Fields.Add Range:=myRange, Type:=wdFieldAuthor myRange.Move Unit:=wdParagraph, Count:=1 .Fields.Add Range:=myRange, Type:=wdFieldDate myRange.Move Unit:=wdParagraph, Count:=1 .Fields.Add Range:=myRange, Type:=wdFieldTime

'Еще один способ добавления полей на примере 'добавления поля автора с одновременным изменением автора документа myRange.Move Unit:=wdParagraph, Count:=1 myRange.Select .Fields.Add Range:=myRange, Type:=wdFieldEmpty, _ PreserveFormatting:=False Selection.TypeText Text:="Author ""Fooler"""

'Печать полей FieldsAnalyse 'Обновление полей .Fields.Update FieldsAnalyse End With End Sub

Листинг 1.48.

В этой процедуре добавляются три пустых абзаца в начало документа, а затем добавляются три поля. Затем демонстрируется еще один способ работы с полями, когда вначале задается пустое поле, а потом в нем печатается текст, определяющий это поле. Конечно, это должен быть разумный текст, определяющий тип поля и его характеристики. Так, зачастую, работают с полями вручную. Заметьте, необходимо обновить это поле, чтобы поле отражало значение результата. Печать результатов до обновления и после обновления позволяет проследить за изменениями значений полей. Приведем результаты отладки:

Число полей - 4 Код поля - Author \* MERGEFORMAT Вид поля - 2 Тип поля - 17 Результат поля - Vladimir Billig Код поля - DATE \* MERGEFORMAT Вид поля - 2 Тип поля - 31 Результат поля 14.12.99 Код поля - TIME \* MERGEFORMAT Вид поля - 2 Тип поля - 32 Результат поля - 12:28 Код поля - Author "Fooler" Вид поля - 0 Тип поля --1 Результат поля - Число полей - 4 Код поля - Author \* MERGEFORMAT Вид поля - 2 Тип поля - 17 Результат поля - Vladimir Billig Код поля - DATE \* MERGEFORMAT Вид поля - 2 Тип поля - 31 Результат поля - 14.12.99 Код поля - TIME \* MERGEFORMAT Вид поля - 2 Тип поля - 32 Результат поля - 12:28 Код поля - Author "Fooler" Вид поля - 2 Тип поля - 17 Результат поля - Fooler

Листинг 1.49.


Работа с текстом


Объекты Range и Selection позволяют выполнять основные операции над текстом (и не только над текстом): "выделить", "добавить", "заменить", "удалить". У наших объектов большой набор методов, позволяющих реализовать эти операции. Все рассматриваемые здесь методы принадлежат обоим объектам, если не сделана специальная оговорка.

Выделение

Говоря в этом параграфе о выделении, я имею в виду не применение метода Select, а выделение в более широком смысле, умение задать некоторую подобласть данной области. Выделить некоторую часть текста означает, по существу, определение объекта Range или Selection. Оба объекта задают непрерывную область, а их свойства Start и End позволяют задать начало и конец области. Меняя эти свойства, можно задать нужную область выделения. Этот основной способ выделения мы не раз демонстрировали в наших примерах:

Dim myRange As Range, myRange1 As Range With ActiveDocument Set myRange = .Range(Start:=.Sections(2).Range.Paragraphs(3).Range.Start, _ End:=.Sections(3).Range.Paragraphs(5).Range.End) Set myRange1 = .Sections(3).Range.Paragraphs(1).Range End With

Листинг 1.57.

(html, txt)

В первом случае при задании области используются параметры Start и End, во втором - задается вся область данного объекта. Область может изменяться автоматически при добавлении или удалении из нее части текста. Изменить область можно и путем ее перемещения. Этим занимается специальная группа методов перемещения Move. Прежде чем говорить о перемещении, рассмотрим сжатие области. Нередко нужна пустая область - точка вставки, параметры Start и End которой совпадают. Поэтому простейший способ сжатия - задать совпадающие значения этих параметров:

Листинг 1.58.

(html, txt)

Для сжатия области можно применять специальный метод сжатия - Collapse(Direction). Область стягивается в начальную или конечную позицию. Направление сжатия задает параметр Direction, принимающий значения wdCollapseStart или wdCollapseEnd. По умолчанию область стягивается в начальную точку (значение параметра: wdCollapseStart). Если сжимается абзац, и он стягивается в конечную точку, точка вставки переносится за метку конца абзаца и устанавливается в начало следующего абзаца. Если такой эффект нежелателен, после сжатия применяется метод перемещения MoveEnd, передвигающий точку вставки назад на один символ:


Set myRange = ActiveDocument.Paragraphs(1).Range myRange.Collapse Direction:=wdCollapseEnd myRange.MoveEnd Unit:=wdCharacter, Count:=-1

Листинг 1.59.

(html, txt)

Если есть методы сжатия области, то должны быть и методы расширения области. Основным из них является метод Expand(Unit). В зависимости от значения параметра Unit область можно расширить на слово, предложение, абзац, раздел, на строку или столбец таблицы, или на всю таблицу. Для объекта Selection область можно расширить на всю строку. Для расширения области на весь фрагмент можно использовать метод WholeStory, что впрочем эквивалентно вызову метода Expand(Unit := wdStory)

Метод Move является основным методом перемещения. Остальные методы - в той или иной степени его модификации. Метод Move(Unit, Count) сжимает область в точку, стягивая ее в начало или конец, и затем перемещает точку вставки. Параметр Unit определяет единицы перемещения, а Count - количество этих единиц и направление стягивания и перемещения (по умолчанию 1). Положительные значения этого параметра задают стягивание к концу и перемещение вперед, отрицательные - стягивание в начало и перемещение назад. Само стягивание означает перемещение на одну единицу. Метод возвращает количество единиц, на которое фактически произошло перемещение, или 0, если оно не осуществлено. Параметр Unit принимает значения wdCharacter (по умолчанию), wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow и wdTable.

Методы перемещения на сам текст не влияют - лишь изменяют область, заданную объектами Range и Selection. Поэтому эти методы применимы только к переменным типа Range, но не к фиксированным областям. Например, запись:

Листинг 1.60.

(html, txt)

не имеет эффекта, поскольку область первого абзаца - вещь неизменяемая.

Метод Move стягивает область в точку, которая и перемещается, поэтому после его выполнения область исчезает, и остается только точка вставки. Методы MoveStart и MoveEnd перемещают начальную или конечную точку области, обычно расширяя тем самым область.

Конечно, для перемещения по тексту документу есть много различных возможностей, кроме группы методов Move. Стоит упомянуть группу методов Next, основным из которых является метод Next(Unit,Count). Основное отличие от метода Move с теми же параметрами состоит в том, что метод Next возвращает сам объект Range, в отличие от метода Move, возвращающего число символов, на которое произошло перемещение. Напомним также о тех возможностях перемещения, которыми обладают объекты Browser и Hyperlink, напомним о закладках, специально предназначенных для перехода к ним.

Удаление текста

Метод Delete позволяет удалить текст. Вызванный без параметров, он удаляет вызывающий его объект Range или Selection. Если он применен в форме Delete(Unit,Count), удаляется часть текста в указанной области. Параметр Unit задает единицы, но при удалении возможны только два значения: wdWord и wdCharacter. Параметр Count задает количество удаляемых единиц. Если область стянута в точку, удаляются символы перед точкой вставки или после нее в зависимости от знака параметра Count. Вот несколько примеров:



'Удаляется текст в области объекта myRange myRange.Delete ' Удаляются первые три слова из области myRange1 myRange1.Delete Unit:= wdWord, Count :=3 'Область стягивается в точку myRange1.Collapse Direction := wdCollapseStart 'Удаляются три первых слова из области, предшествующей myRange1 myRange1.Delete Unit:= wdWord, Count :=-3

Листинг 1.61.

(html, txt)

Вставка текста

Группа методов Insert объектов Range и Selection позволяет осуществлять вставки в документ. Для вставки текста используются методы InsertBefore(Text) и InsertAfter(Text). Параметр Text типа String задает текст, вставляемый до или после области, заданной объектами Range или Selection. После вставки текста область автоматически расширяется, включая в себя добавляемый текст. Вот пример вставки нового абзаца в начало документа:

Dim myRange As Range Set myRange = ActiveDocument.Range(Start:=0, End:=0) myRange.Text = "дорогой " myRange.InsertBefore "Мой " myRange.InsertAfter "друг! " myRange.InsertParagraphAfter

Листинг 1.62.

(html, txt)

Свойство Text позволяет заменять текст в выделенной области, поэтому нет нужды вызывать метод Insert(Text), - лучше использовать свойство. Методы InsertBefore и InsertAfter безопасны, так как текст добавляется, не изменяя содержимого области. При вставке внутрь области, например, при использовании метода InsertSymbol или InsertParagraph, заменяется содержимое области. Эта вроде бы безобидная программка сотрет все содержимое документа, заменив его пустым абзацем:

Set myRange = ActiveDocument.Range myRange.InsertParagraph

Листинг 1.63.

(html, txt)

Говоря о методах вставки текста, нельзя не упомянуть о таком мощном методе, как InsertFile - он позволяет вставлять не только текст или таблицу Excel, но и целый документ, хранящийся в файле. Вот простой пример вызова метода, при котором в начало активного документа вставляется существующий документ:

Public Sub test1() Dim myRange As Range Dim myPath As String

With ActiveDocument myPath = .Path Set myRange = .Range(Start:=0, End:=0) myRange.InsertFile myPath & "\DocTwo.doc" End With End Sub



Листинг 1.64.

(html, txt)

Работа с буфером

Известно, как полезен буфер при работе с одним и, особенно, с несколькими документами. Объекты Range и Selection в полной мере позволяют задействовать все возможности буфера. Метод Copy, не имеющий параметров, копирует объект (содержимое области) в буфер. Метод Cut, действуя аналогично, копирует объект в буфер, заодно удаляя его. Заметьте, что в отличие от предыдущей версии, теперь метод Cut работает, как ему положено, не только копируя объект, но и удаляя его, ранее удаления не происходило, вместо этого объект, вызывавший метод стягивался в точку. Метод Paste позволяет приклеить объект, помещенный в буфер. Рассмотрим пример:

.Public Sub test1() Dim myRange As Range Set myRange = ActiveDocument.Paragraphs(5).Range myRange.Select 'Добавляем новый абзац myRange.InsertAfter "New Text" myRange.InsertParagraphAfter 'Выделяем и затем вырезаем добавленный абзац и помещаем его в буфер myRange.MoveStart Unit:=wdParagraph myRange.Select Selection.Cut 'Добавляем новый абзац Selection.InsertAfter "Новый текст!" Selection.InsertParagraphAfter 'Добавляем абзац из буфера Selection.Collapse Direction:=wdCollapseEnd Selection.Paste End Sub

Листинг 1.65.

(html, txt)

Метод Paste позволяет "вклеить" содержимое буфера в область, заданную объектами Range и Selection. Эта операция опасна, так как происходит замена, а не добавление текста. Поэтому обычно метод Paste применяется к объектам Range и Selection, стянутым в точку вставки. В выполнении этого метода есть нюансы. У объекта Range содержимое буфера включается в его область, Объект Selection остается точкой вставки, расположенной после текста, добавленного из буфера.

Заметьте, в буфер можно копировать не только текст. В нашем следующем примере в буфер копируется рисунок, являющийся элементом коллекции TableOfFiguress. Напомню, что элементы этой коллекции вставляются аналогично символам текста и являются частью абзаца. В тестовом документе DocOne, с которым я работаю, в начало текста вставлен рисунок мышки. Я буду работать с первым абзацем этого текста, содержащим этот рисунок, как с обычным текстом, выделю рисунок, помещу его в буфер, а затем приклею в другом месте текста. Вот код соответствующей процедуры:



Public Sub CopyImage() ' Копирование рисунка через буфер Dim MyRange As Range Set MyRange = Documents("DocOne").Paragraphs(1).Range With MyRange 'Первый абзац этого документа содержит рисунок ' - элемент коллекции TableOfFiguress.Выделяем рисунок .MoveEnd Unit:=wdCharacter, Count:=-7 .Select .Copy End With Set MyRange = ActiveDocument.Paragraphs(6).Range MyRange.Select Selection.Collapse Direction:=wdCollapseEnd Selection.Paste

End Sub

Листинг 1.66.

(html, txt)

Иногда в буфер копируют формат текста. Этим занимается метод CopyFormat, копирующий формат по первому символу объекта Selection. Если этот символ - метка абзаца, копируется формат абзаца. Методом CopyFormat обладает только объект Selection.

Метод PasteFormat применяет форматирование, хранящееся в буфере к объекту Selection.

Метод PasteSpecial позволяет явно управлять форматированием в момент вставки объекта из буфера.

Разделы и поддокументы


Сейчас мы обсудим более подробно две коллекции Sections и SubDocuments, задающие разделы документа и поддокументы, входящие в состав основного документа. Почти в каждом текстовом документе можно встретить символы, слова, предложения и абзацы. Что же касается более крупных единиц текста, то в разных документах они называются по-разному. Чаще всего, приходится встречаться со страницами и листами документа, но используются и такие термины как параграфы, главы, части, разделы документа. В объектной модели Word, к сожалению, нет таких объектов как Page и Pages, соответствующих таким естественным единицам текстового документа как страницы документа и их коллекции. В документе Word следующей крупной единицей после абзаца является раздел - объект класса Section. Все разделы одного документа составляют коллекцию Sections.

Что же такое раздел, как и для чего он создается? Раздел в документе всегда можно создать руками, для чего достаточно вставить символ разрыва документа - Section break, вызвав пункт Break из меню Insert. Символ разрыва может быть разного типа, задавая следующую страницу, четную или нечетную страницу, столбец и другие виды раздела. Таким образом, можно руками разбить документ на страницы, вставляя подходящие символы разрыва в нужных местах. В этом случае разделы будут выступать в роли страниц документа. Иногда разделы создаются автоматически, например, при представлении некоторой части документа в виде нескольких столбцов. Часть документа, представленная в виде нескольких столбцов, представляет отдельный раздел.

При программной работе разделы можно создавать двояко, используя метод InsertBreak, которым обладают объекты Range и Selection, или вызывая метод Add коллекции Sections. Метод Add(Range, Start) имеет два параметра:

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

Заметьте, в методе InsertBreak указывается только второй параметр, поскольку новый раздел начинается с объекта Range (Selection), вызвавшего метод.

Рассмотрим пример, в котором документ с именем DocThree, программно разбивается на разделы. Наше разбиение гарантирует, что соответствующие главы и параграфы документа находятся в отдельных разделах, что облегчает дальнейшую работу с ними. Вот как выглядит процедура, решающая эту задачу:


Листинг 1.27.

(html, txt)

В этой процедуре показано, как происходит выделение раздела, подсчет некоторых характеристик раздела, например, подсчет числа абзацев, предложений и символов раздела. Показано, как создаются разделы документа, используя как метод InsertBreak так и метод Add коллекции Sections. Метод Add вызывается как с явно заданными параметрами, так и параметрами, задаваемыми по умолчанию.

Перейдем теперь к рассмотрению понятия поддокумент и способов работы с объектами, задающими поддокументы. Есть некоторый разумный предел размера одного документа. Если в документе больше 10-20 страниц, работать с ним становится неудобно. В этом случае в нем целесообразно выделить главный документ и поддокументы. Главный документ и поддокументы являются, по сути, документами, связанными ссылками, с каждым из которых можно работать независимо. Вот пример выделения поддокумента из главного документа:

Листинг 1.28.

(html, txt)

Наш документ DocThree вначале не имел поддокументов. Этот документ предварительно разбивается на разделы, если это еще не было сделано, а затем в нем выделяется поддокумент, начиная с третьего раздела и кончая последним разделом документа. Метод AddFromRange класса SubDocuments создает поддокумент, выделяя из главного документа область, заданную параметром Range.

Заметьте, область, задаваемая параметром Range, должна начинаться с заголовка, имеющего один из стандартных стилей Heading. При сохранении документа, поддокумент удаляется из документа и сохраняется в отдельном файле. Имя файла строится автоматически, используя текст заголовка, начинающего поддокумент. В главном документе остается ссылка на поддокумент. При желании его всегда можно слить с главным, но с ним можно работать и как с независимым документом. Вот как выглядит наш главный документ после того, как в нем выделен поддокумент:


Рис. 1.9.  Главный документ с выделенным поддокументом

Рисунки и элементы управления. Объекты класса TableOfFigures


Word предоставляет широкие возможности для появления рисунков в его документах. При работе вручную рисунки в документах появляются по-разному: во-первых, можно вставлять уже готовые рисунки в текст документа, можно также вставить элемент управления Image и связать с ним готовый рисунок, во-вторых, можно воспользоваться широким набором инструментов рисования, собранными на панели Drawing (Рисование). С помощью этих инструментов можно вставлять готовые рисованные объекты самых разных типов, начиная с прямоугольников и овалов, кончая блок-схемами, фигурными стрелками и звездами. Большие возможности представляют инструменты Curve (Кривая), FreeForm (Полилиния), Scribble (Рисованная Кривая). Чтобы добраться до них, необходимо на панели Drawing выбрать вкладку AutoShapes (АвтоФигуры), затем Lines (Линии), а затем нажать нужную кнопку. В этот момент в руках у пользователя "появляется" обычный карандаш, с помощью которого можно нарисовать любой рисунок произвольной (свободной) формы, проводя линии выбранным цветом и выбранной толщиной. После чего весь рисунок можно закрасить (залить) нужным цветом. Созданный рисунок можно вращать, растягивать или сжимать, в общем, выполнять основные операции, допустимые в графических редакторах.

Все, что можно делать вручную, можно делать и программно, поскольку есть соответствующие объекты со своими свойствами и методами. Все рисунки, размещаемые в документе в слое "рисования", с объектной точки зрения являются объектами класса TableOfFigures или InlineShape. Но, обратите внимание, коллекции TableOfFiguress(Shape), InlineShapes(InlineShape) содержат рисунки документа, но не только их! Рисунки это только один из возможных типов объектов, хранящихся в этих коллекциях. ActiveX- и OLE-объекты, рисованные тексты, созданные средствами Word Art, также являются элементами этих коллекций. Напомню, что элементы управления, размещаемые непосредственно в документе, являются OLE- объектами, об этом я уже говорил во введении. Но, заметьте, одновременно они являются и объектами класса TableOfFigures, точнее InlineShape. Так что при размещении в документе, например, командной кнопки или элемента Image, как бы оно не выполнялось вручную или программно, в коллекции InlineShapes появится новый элемент. Объекты разных типов, находящиеся в этих коллекциях, объединяет то, что всех их можно отнести к рисованным объектам и размещаются они в документе в слое рисования.

Коллекции TableOfFiguress и InlineShapes близки по своей природе. Как правило, при программном создании объектов многие из них можно поместить по желанию либо в коллекцию TableOfFiguress, либо в InlineShapes. Отличаются элементы этих двух коллекций тем, как они привязаны к документу - первые могут свободно перемещаться по документу, вторые жестко привязаны к заданной области документа и ведут себя подобно символам текста документа. Но, заметьте, элементы той и другой коллекции имеют метод Convert (ConvertToShape, ConvertToInlineShape), позволяющий конвертировать объект класса InlineShape в объект класса TableOfFigures и обратно. Коллекция TableOfFiguress содержит больше типов элементов, чем коллекция InlineShapes, поэтому преобразование не всегда возможно.

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

Прежде всего, следует упомянуть метод Addshape, первый параметр которого задает тип добавляемого объекта. Поскольку, как я уже говорил, типов рисованных объектов достаточно много, то соответствующая константа, задающая тип, может принимать около сотни различных значений. По этой причине, чаще всего, пользуются не этим общим методом создания TableOfFigures-объектов, а частными методами, позволяющими создавать TableOfFigures-объекты определенного типа. Вот методы, позволяющие создавать TableOfFigures-объекты, аналогичные тем, что создаются вручную при работе с инструментами панели Drawing: AddCallout , AddCurve, AddLine, AddPolyline, BuildFreeForm. Последний из этих методов соответствует двум уже упоминавшимся инструментам FreeForm и Scribble. При работе с этим методом создается объект класса FreeForm, который затем преобразуется в объект класса TableOfFigures. Метод AddOleObject используется для создания OLE-объектов, в частности для создания элементов управления. Метод AddOleControl используется для создания ActiveX объектов. Метод AddTextBox позволяет создать текстовые окна. Метод AddPicture позволяет добавлять рисунки в документ. Метод AddTextEffect позволяет создавать художественные надписи, так как это делает Word Art.


Word предоставляет широкие возможности для появления рисунков в его документах. При работе вручную рисунки в документах появляются по-разному: во-первых, можно вставлять уже готовые рисунки в текст документа, можно также вставить элемент управления Image и связать с ним готовый рисунок, во-вторых, можно воспользоваться широким набором инструментов рисования, собранными на панели Drawing (Рисование). С помощью этих инструментов можно вставлять готовые рисованные объекты самых разных типов, начиная с прямоугольников и овалов, кончая блок-схемами, фигурными стрелками и звездами. Большие возможности представляют инструменты Curve (Кривая), FreeForm (Полилиния), Scribble (Рисованная Кривая). Чтобы добраться до них, необходимо на панели Drawing выбрать вкладку AutoShapes (АвтоФигуры), затем Lines (Линии), а затем нажать нужную кнопку. В этот момент в руках у пользователя "появляется" обычный карандаш, с помощью которого можно нарисовать любой рисунок произвольной (свободной) формы, проводя линии выбранным цветом и выбранной толщиной. После чего весь рисунок можно закрасить (залить) нужным цветом. Созданный рисунок можно вращать, растягивать или сжимать, в общем, выполнять основные операции, допустимые в графических редакторах.

Все, что можно делать вручную, можно делать и программно, поскольку есть соответствующие объекты со своими свойствами и методами. Все рисунки, размещаемые в документе в слое "рисования", с объектной точки зрения являются объектами класса TableOfFigures или InlineShape. Но, обратите внимание, коллекции TableOfFiguress(Shape), InlineShapes(InlineShape) содержат рисунки документа, но не только их! Рисунки это только один из возможных типов объектов, хранящихся в этих коллекциях. ActiveX- и OLE-объекты, рисованные тексты, созданные средствами Word Art, также являются элементами этих коллекций. Напомню, что элементы управления, размещаемые непосредственно в документе, являются OLE- объектами, об этом я уже говорил во введении. Но, заметьте, одновременно они являются и объектами класса TableOfFigures, точнее InlineShape. Так что при размещении в документе, например, командной кнопки или элемента Image, как бы оно не выполнялось вручную или программно, в коллекции InlineShapes появится новый элемент. Объекты разных типов, находящиеся в этих коллекциях, объединяет то, что всех их можно отнести к рисованным объектам и размещаются они в документе в слое рисования.

Коллекции TableOfFiguress и InlineShapes близки по своей природе. Как правило, при программном создании объектов многие из них можно поместить по желанию либо в коллекцию TableOfFiguress, либо в InlineShapes. Отличаются элементы этих двух коллекций тем, как они привязаны к документу - первые могут свободно перемещаться по документу, вторые жестко привязаны к заданной области документа и ведут себя подобно символам текста документа. Но, заметьте, элементы той и другой коллекции имеют метод Convert (ConvertToShape, ConvertToInlineShape), позволяющий конвертировать объект класса InlineShape в объект класса TableOfFigures и обратно. Коллекция TableOfFiguress содержит больше типов элементов, чем коллекция InlineShapes, поэтому преобразование не всегда возможно.

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

Прежде всего, следует упомянуть метод Addshape, первый параметр которого задает тип добавляемого объекта. Поскольку, как я уже говорил, типов рисованных объектов достаточно много, то соответствующая константа, задающая тип, может принимать около сотни различных значений. По этой причине, чаще всего, пользуются не этим общим методом создания TableOfFigures-объектов, а частными методами, позволяющими создавать TableOfFigures-объекты определенного типа. Вот методы, позволяющие создавать TableOfFigures-объекты, аналогичные тем, что создаются вручную при работе с инструментами панели Drawing: AddCallout , AddCurve, AddLine, AddPolyline, BuildFreeForm. Последний из этих методов соответствует двум уже упоминавшимся инструментам FreeForm и Scribble. При работе с этим методом создается объект класса FreeForm, который затем преобразуется в объект класса TableOfFigures. Метод AddOleObject используется для создания OLE-объектов, в частности для создания элементов управления. Метод AddOleControl используется для создания ActiveX объектов. Метод AddTextBox позволяет создать текстовые окна. Метод AddPicture позволяет добавлять рисунки в документ. Метод AddTextEffect позволяет создавать художественные надписи, так как это делает Word Art.




У нас уже есть достаточное число примеров на использование этих методов.

В следующем примере я вставляю в документ два рисунка. Один из них будет добавлен в коллекцию TableOfFiguress, второй в коллекцию InlineShapes. Заметьте, во втором случае у метода AddPicture есть параметр Range, позволяющий "привязать" рисунок к определенному месту документа. Первый же рисунок можно свободно передвигать по документу.

Листинг 1.32.

(html, txt)

Взгляните, как выглядит наш документ после добавления рисунков:


Рис. 1.10.  Документ после добавления рисунков

Заметьте, кошку можно перемещать по документу, а мышка "привязана". Хочу обратить Ваше внимание еще на одну особенность этой процедуры. Мне пришлось перед вставкой рисунков отключить автоматическое добавление заголовка из-за небольших "жучков" в Office 2000.

При работе метода AddPicture в Office 2000 появляются два небольших "жучка", если для рисунков включен автозаголовок "Microsoft Word Picture". Во-первых, неверен текст заголовка, сопровождающего рисунок, он уведомляет о вставке таблицы (Table). Во-вторых, для объекта TableOfFigures текст заголовка закрывает сам рисунок.

При работе с визуальными объектами документа, которые, как теперь понятно, являются членами коллекции TableOfFiguress, часто необходимо выделить из всей коллекции некоторую совокупность объектов, объединить их в подколлекцию и работать с ней аналогично тому, как мы работаем с массивом. Для реализации такой возможности имеется специальный класс TableOfFiguresRange, который может содержать как одиночный объект, так и все объекты TableOfFigures документа, совпадая с коллекцией TableOfFiguress. Создать объекты этого класса (подколлекции) можно двояко. Первый способ состоит в том, что из коллекции TableOfFiguress явно выделяются некоторые элементы перечислением их индексов или имен и заданная совокупность становится объектом TableOfFiguresRange. Задать перечисление можно, используя свойство Range коллекции TableOfFiguress, сочетая это свойство с возможностью определить объект Range с помощью массива индексов Array. В нижеследующем примере такая возможность будет продемонстрирована. Другая возможность основана на том, что объект Selection имеет свойство TableOfFiguresRange, возвращающее коллекцию объектов TableOfFigures, входящую в область выделения. Заметьте, что выделенными должны быть объекты TableOfFigures, а не область текста документа.

Еще одна часто возникающая потребность при работе с визуальными объектами связана с необходимостью объединения группы объектов в один объект. Для этих целей коллекция TableOfFiguresRange имеет метод Group, возвращающий одиночный объект TableOfFigures. В последствии такой объект можно разгруппировать и создать на его основе подколлекцию.

Давайте рассмотрим теперь пример, в котором создается некоторая группа объектов TableOfFigures разного типа. В момент создания каждому из объектов дается имя, эти имена используются для создания подколлекции, содержащей эту группу объектов. Затем на основе подколлекции создается некоторый групповой объект. Вот как выглядит код, решающий все эти задачи:



Листинг 1.33.

(html, txt)

Текст процедуры получился довольно длинным, что объяснимо, поскольку в ней создается довольно большое число различных объектов. Тем не менее, надеюсь, что сделанные ранее пояснения и комментарии в тексте позволяют понять все детали ее работы. По ходу дела вызывается небольшая процедура HowManyShapes, текст которой стоит также привести, поскольку она демонстрирует второй способ создания коллекции TableOfFiguresRange:

Public Sub HowManyShapes() Dim SR As TableOfFiguresRange Dim SH As TableOfFigures Set SR = Selection.ShapeRange For Each SH In SR Debug.Print SH.Name Next SH Debug.Print Selection.ShapeRange.Count End Sub

Листинг 1.34.

(html, txt)

Вот как выглядят отладочные результаты в окне проверки Immediate:

Листинг 1.35.

(html, txt)

Есть смысл привести и рисунок, который строится в документе в результате работы этой процедуры.


увеличить изображение
Рис. 1.11.  Рисунок, созданный программно

on_load_lecture()

Дальше »

  Если Вы заметили ошибку - сообщите нам.  
Страницы:

« |

1

|

2

|

3

|

4

|

5

|

6

|

7

|

8

|

9

|

10

|

11

|

12

|

вопросы | »

|

для печати и PDA

Курсы | Учебные программы | Учебники | Новости | Форум | Помощь


Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru

© 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование



У нас уже есть достаточное число примеров на использование этих методов.

В следующем примере я вставляю в документ два рисунка. Один из них будет добавлен в коллекцию TableOfFiguress, второй в коллекцию InlineShapes. Заметьте, во втором случае у метода AddPicture есть параметр Range, позволяющий "привязать" рисунок к определенному месту документа. Первый же рисунок можно свободно передвигать по документу.

Public Sub AddTwoShapes() 'добавляются рисунки в коллекцию TableOfFiguress и InlineShapes Dim Item As AutoCaption Dim MyPath As String Documents("DocOne").Activate MyPath = ActiveDocument.Path 'Отключим вставку автозаголовока для рисунков Set Item = Word.Application.AutoCaptions("Microsoft Word Picture") item.AutoInsert = False

With ActiveDocument 'Рисунок добавляется в коллекцию TableOfFiguress .Shapes.AddPicture FileName:=MyPath & "\cat.gif"

'Рисунок добавляется в коллекцию InlineShapes 'привязывается к первому параграфу документа. .InlineShapes.AddPicture FileName:=MyPath & "\mouse.bmp", _ Range:=.Paragraphs.First.Range End With End Sub

Листинг 1.32.

Взгляните, как выглядит наш документ после добавления рисунков:


Рис. 1.10.  Документ после добавления рисунков

Заметьте, кошку можно перемещать по документу, а мышка "привязана". Хочу обратить Ваше внимание еще на одну особенность этой процедуры. Мне пришлось перед вставкой рисунков отключить автоматическое добавление заголовка из-за небольших "жучков" в Office 2000.

При работе метода AddPicture в Office 2000 появляются два небольших "жучка", если для рисунков включен автозаголовок "Microsoft Word Picture". Во-первых, неверен текст заголовка, сопровождающего рисунок, он уведомляет о вставке таблицы (Table). Во-вторых, для объекта TableOfFigures текст заголовка закрывает сам рисунок.

При работе с визуальными объектами документа, которые, как теперь понятно, являются членами коллекции TableOfFiguress, часто необходимо выделить из всей коллекции некоторую совокупность объектов, объединить их в подколлекцию и работать с ней аналогично тому, как мы работаем с массивом. Для реализации такой возможности имеется специальный класс TableOfFiguresRange, который может содержать как одиночный объект, так и все объекты TableOfFigures документа, совпадая с коллекцией TableOfFiguress. Создать объекты этого класса (подколлекции) можно двояко. Первый способ состоит в том, что из коллекции TableOfFiguress явно выделяются некоторые элементы перечислением их индексов или имен и заданная совокупность становится объектом TableOfFiguresRange. Задать перечисление можно, используя свойство Range коллекции TableOfFiguress, сочетая это свойство с возможностью определить объект Range с помощью массива индексов Array. В нижеследующем примере такая возможность будет продемонстрирована. Другая возможность основана на том, что объект Selection имеет свойство TableOfFiguresRange, возвращающее коллекцию объектов TableOfFigures, входящую в область выделения. Заметьте, что выделенными должны быть объекты TableOfFigures, а не область текста документа.

Еще одна часто возникающая потребность при работе с визуальными объектами связана с необходимостью объединения группы объектов в один объект. Для этих целей коллекция TableOfFiguresRange имеет метод Group, возвращающий одиночный объект TableOfFigures. В последствии такой объект можно разгруппировать и создать на его основе подколлекцию.

Давайте рассмотрим теперь пример, в котором создается некоторая группа объектов TableOfFigures разного типа. В момент создания каждому из объектов дается имя, эти имена используются для создания подколлекции, содержащей эту группу объектов. Затем на основе подколлекции создается некоторый групповой объект. Вот как выглядит код, решающий все эти задачи:



Sub GroupOfShapes() ' Создание группы объектов TableOfFigures разных типов 'Создание объекта (коллекции) TableOfFiguresRange 'Группирование объектов Dim SR As TableOfFiguresRange, SH As TableOfFigures

With ActiveDocument.shapes 'Добавляем текстовое окно. Координаты Left-Top-Width-Height относительно якоря .AddTextbox(msoTextOrientationHorizontal, 220, _ 40, 120, 30).Select Selection.ShapeRange.Name = "Parts" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Части документа" Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter 'Добавляем стрелку .AddLine(280, 70, 280, 100).Select Selection.ShapeRange.Name = "Ar1" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем линию .AddLine(120, 100, 440, 100).Select Selection.ShapeRange.Name = "Lin1" 'Добавляем стрелку .AddLine(120, 100, 120, 130).Select Selection.ShapeRange.Name = "Ar2" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем стрелку .AddLine(440, 100, 440, 130).Select Selection.ShapeRange.Name = "Ar3" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 80, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part1" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Рисунки" 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 400, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part2" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Таблицы"

'Группирование объектов Set SR = .Range(Array("Parts", "Ar1", "Lin1", _ "Ar2", "Ar3", "Part1", "Part2")) SR.Select HowManyShapes Set SH = SR.Group SH.Name = "Fig.1" SH.Select HowManyShapes End With

End Sub

Листинг 1.33.



Текст процедуры получился довольно длинным, что объяснимо, поскольку в ней создается довольно большое число различных объектов. Тем не менее, надеюсь, что сделанные ранее пояснения и комментарии в тексте позволяют понять все детали ее работы. По ходу дела вызывается небольшая процедура HowManyShapes, текст которой стоит также привести, поскольку она демонстрирует второй способ создания коллекции TableOfFiguresRange:

Public Sub HowManyShapes() Dim SR As TableOfFiguresRange Dim SH As TableOfFigures Set SR = Selection.ShapeRange For Each SH In SR Debug.Print SH.Name Next SH Debug.Print Selection.ShapeRange.Count End Sub

Листинг 1.34.

Вот как выглядят отладочные результаты в окне проверки Immediate:

Parts Ar1 Lin1 Ar2 Ar3 Part1 Part2 7 Fig.1 1

Листинг 1.35.

Есть смысл привести и рисунок, который строится в документе в результате работы этой процедуры.


увеличить изображение
Рис. 1.11.  Рисунок, созданный программно


Синонимы


Объект SynonymInfo полезен при выборе синонимов, антонимов или слов и предложений, связанных по смыслу с текущим проверяемым словом.



Сноски, комментарии и исправления в документах


При работе с документом в нем могут быть созданы некоторые важные элементы, невидимые при обычном просмотре и появляющиеся при принятии специальных мер. Такими частями документа являются сноски, комментарии и исправления. Этим понятиям соответствуют классы объектов и коллекций этих объектов: FootNotes(FootNote), EndNotes(EndNote), Comments(Comment), Revisions( Revision)

Рассмотрим их чуть более подробно.

Сноски один из способов комментирования документа, применяемый, как правило, автором документа. Сноски позволяют, не прерывая плавного изложения материала, дать определение применяемого термина или сделать ссылку на соответствующую литературу. Они могут быть двух видов: подстраничные (внизу страницы) и концевые (в конце документа). Для программиста подстраничные сноски составляют коллекцию FootNotes, концевые - EndNotes.Класс Comment и коллекция Comments задают комментарии. Содержательно, комментарии могут быть как авторскими, так и комментариями рецензента. Обычно, когда я пишу свои тексты, у меня время от времени возникает желание прокомментировать те или иные свои высказывания, рассказать некоторые подробности, которые, возможно, излишни в основном тексте. Конечно, в этом случае можно было бы обойтись без комментариев и оформлять свои замечания особым стилем. Наибольшую ценность приобретают комментарии, когда созданный документ посылается на рецензию. У рецензента появляется возможность комментировать основные положения документа, не меняя сам документ и не производя в нем явных вставок. Так я поступаю, когда читаю присланные мне работы моих студентов. При чтении документа с комментариями их всегда можно увидеть либо на странице комментариев, либо установив курсор мыши на номере комментария. Так что комментарий это важный элемент при совместной работе над документом. Заметьте, что объект Comment содержит не только текст комментария, но и фамилию его автора, страницу, на которой помещен комментарий, и другие подробности.После создания первоначального варианта документа, над которым работает коллектив авторов, начинается его "отладка". Правку документа - внесение исправлений - может делать как один автор, так и группа авторов. Одна из "великих" возможностей Word, обеспечивающая совместную работу над документами, состоит в том, что каждый из создателей документа может править его (документ) как угодно, не испортив при этом исходный текст. Правки накапливаются в коллекции Revisions. Затем, работая в специальном режиме, каждую правку - объект класса Revision можно принять или отвергнуть.


При работе с документом в нем могут быть созданы некоторые важные элементы, невидимые при обычном просмотре и появляющиеся при принятии специальных мер. Такими частями документа являются сноски, комментарии и исправления. Этим понятиям соответствуют классы объектов и коллекций этих объектов: FootNotes(FootNote), EndNotes(EndNote), Comments(Comment), Revisions( Revision)

Рассмотрим их чуть более подробно.

Сноски один из способов комментирования документа, применяемый, как правило, автором документа. Сноски позволяют, не прерывая плавного изложения материала, дать определение применяемого термина или сделать ссылку на соответствующую литературу. Они могут быть двух видов: подстраничные (внизу страницы) и концевые (в конце документа). Для программиста подстраничные сноски составляют коллекцию FootNotes, концевые - EndNotes.Класс Comment и коллекция Comments задают комментарии. Содержательно, комментарии могут быть как авторскими, так и комментариями рецензента. Обычно, когда я пишу свои тексты, у меня время от времени возникает желание прокомментировать те или иные свои высказывания, рассказать некоторые подробности, которые, возможно, излишни в основном тексте. Конечно, в этом случае можно было бы обойтись без комментариев и оформлять свои замечания особым стилем. Наибольшую ценность приобретают комментарии, когда созданный документ посылается на рецензию. У рецензента появляется возможность комментировать основные положения документа, не меняя сам документ и не производя в нем явных вставок. Так я поступаю, когда читаю присланные мне работы моих студентов. При чтении документа с комментариями их всегда можно увидеть либо на странице комментариев, либо установив курсор мыши на номере комментария. Так что комментарий это важный элемент при совместной работе над документом. Заметьте, что объект Comment содержит не только текст комментария, но и фамилию его автора, страницу, на которой помещен комментарий, и другие подробности.После создания первоначального варианта документа, над которым работает коллектив авторов, начинается его "отладка". Правку документа - внесение исправлений - может делать как один автор, так и группа авторов. Одна из "великих" возможностей Word, обеспечивающая совместную работу над документами, состоит в том, что каждый из создателей документа может править его (документ) как угодно, не испортив при этом исходный текст. Правки накапливаются в коллекции Revisions. Затем, работая в специальном режиме, каждую правку - объект класса Revision можно принять или отвергнуть.




Конечно, также как и тексты, сноски, комментарии и исправления создаются, как правило, вручную. Тем не менее, часто приходится программно работать с этими объектами. Вот, например, типично возникающие задачи: собрать все комментарии данного автора, принять или отвергнуть все исправления, сделанные автором N.

Я приведу сейчас пример, где в документ будут добавлены комментарии и сноски:

Листинг 1.38.

(html, txt)

Вначале в документ добавляется комментарий, для чего используется метод Add, имеющий в данной ситуации два параметра. Первый - Range - задает точку (область) вставки, второй - текст комментария. При выполнении метода область, заданная объектом Range, подсвечивается и помечается специальной меткой комментария. Свойство Author позволяет указать автора сделанного комментария. Комментарий можно непосредственно просмотреть в тексте документа, установив курсор на метке комментария. Метод ShowBy выводит в окно специального вида все комментарии, выполненные автором, имя которого указано как аргумент метода.

Далее добавляются в документ сноски. И здесь объект Range указывает точку вставки сносок. Заметьте: в этом фрагменте при работе с объектом Range используется метод Move. Его первый параметр - Unit - задает единицы текста, в которых ведется счет при перемещении объекта Range; второй - задает количество единиц и направление перемещения: положительные значения задают перемещение вперед по тексту, отрицательные - назад. Сами сноски вставляются аналогично комментариям методом Add. Подстраничные сноски нумеруются арабскими цифрами, концевые - римскими. Параметр Reference метода Add позволяет задать для нумерации сносок специальные символы.

Наш следующий пример связан с введением исправлений. Я уже говорил, что исправления, как и любая работа с текстом, делаются обычно вручную, а программно они лишь обрабатываются. Но в моем примере я демонстрирую программное введение исправлений, более того, эти исправления выполняются от имени двух различных авторов. Исправления, сделанные одним из них, будут приняты, второго отвергнуты. Заметьте: для программной вставки исправлений метод Add неприменим. Исправления делаются точно так же, как и обычные изменения исходного документа, но выполняются они в специальном режиме правки. Чтобы его включить, требуется задать свойству Track Revisions значение True. Но давайте обратимся к примеру:

Листинг 1.39.

(html, txt)

Обратите внимание, что в отличие от объектов Comment свойство Author объектов Revision может быть использовано только для чтения, поэтому мне пришлось менять фамилию автора правок более хитрым способом. Конечно, выполнять эту программу рекомендуется в пошаговом режиме, чтобы можно было проследить за процесссом появления правок в документе, а затем их принятия в одном случае и отказа от них во втором.

Вот так выглядит окно комментариев и фрагмент нашего тестового документа, в ходе выполнения этой программы в тот момент, когда правки были сделаны обоими авторами:


увеличить изображение
Рис. 1.12.  Документ, содержащий комментарии, сноски и правки



Конечно, также как и тексты, сноски, комментарии и исправления создаются, как правило, вручную. Тем не менее, часто приходится программно работать с этими объектами. Вот, например, типично возникающие задачи: собрать все комментарии данного автора, принять или отвергнуть все исправления, сделанные автором N.

Я приведу сейчас пример, где в документ будут добавлены комментарии и сноски:

Public Sub WorkWithComments() 'работа с комментариями, сносками 'Открываем документ DocTwo Dim MyPath As String Dim myRange As Range Dim Fnote As Footnote, Enote As Endnote MyPath = Documents("DocOne").Path 'DocOne должен быть открыт Documents.Open MyPath & "\DocTwo.doc" Documents("DocTwo").Activate With ActiveDocument Set myRange = .Sections(2).Range.Paragraphs(2).Range .Comments.Add myRange, "Программный проект этого документа" _ & vbCrLf & " содержит примеры главы 1" .Comments(1).Author = "Владимир Биллиг" 'Показ комментария ActiveWindow.View.SplitSpecial = wdPaneComments .Comments. ShowBy = "Владимир Биллиг"

'Передвигается объект Range и устанавливаются сноски: 'подстраничная и конечная myRange.Move Unit:=wdParagraph, Count:=1 .Footnotes.Add Range:=myRange, _ Text:="документ DocTwo используется для экспериментов." myRange.Move Unit:=wdParagraph, Count:=1 'нумерация конечных сносок с начала страницы '.Endnotes.NumberingRule = wdRestartPage .Endnotes.Add Range:=myRange, _ Text:="документ DocThree используется для экспериментов." 'Печать сносок For Each Fnote In .Footnotes Debug.Print Fnote.Range Next Fnote For Each Enote In .Endnotes Debug.Print Enote.Range Next Enote

End With End Sub

Листинг 1.38.

Вначале в документ добавляется комментарий, для чего используется метод Add, имеющий в данной ситуации два параметра. Первый - Range - задает точку (область) вставки, второй - текст комментария. При выполнении метода область, заданная объектом Range, подсвечивается и помечается специальной меткой комментария. Свойство Author позволяет указать автора сделанного комментария. Комментарий можно непосредственно просмотреть в тексте документа, установив курсор на метке комментария. Метод ShowBy выводит в окно специального вида все комментарии, выполненные автором, имя которого указано как аргумент метода.

Далее добавляются в документ сноски. И здесь объект Range указывает точку вставки сносок. Заметьте: в этом фрагменте при работе с объектом Range используется метод Move. Его первый параметр - Unit - задает единицы текста, в которых ведется счет при перемещении объекта Range; второй - задает количество единиц и направление перемещения: положительные значения задают перемещение вперед по тексту, отрицательные - назад. Сами сноски вставляются аналогично комментариям методом Add. Подстраничные сноски нумеруются арабскими цифрами, концевые - римскими. Параметр Reference метода Add позволяет задать для нумерации сносок специальные символы.

Наш следующий пример связан с введением исправлений. Я уже говорил, что исправления, как и любая работа с текстом, делаются обычно вручную, а программно они лишь обрабатываются. Но в моем примере я демонстрирую программное введение исправлений, более того, эти исправления выполняются от имени двух различных авторов. Исправления, сделанные одним из них, будут приняты, второго отвергнуты. Заметьте: для программной вставки исправлений метод Add неприменим. Исправления делаются точно так же, как и обычные изменения исходного документа, но выполняются они в специальном режиме правки. Чтобы его включить, требуется задать свойству Track Revisions значение True. Но давайте обратимся к примеру:



Public Sub WorkWith Revisions() 'работа с исправлениями ' Открываем документ DocTwo Dim MyPath As String Dim MyRange As Range Dim Revis As Revision 'DocOne должен быть открыт MyPath = Documents("DocOne").Path Documents.Open MyPath & "\DocTwo.doc" Documents("DocTwo").Activate With ActiveDocument 'Работа с исправлениями . Show Revisions = True 'Удаляем все имеющиеся исправления . Revisions.RejectAll

'Добавляем новый абзац .Paragraphs.Add .Paragraphs.Last.Range.Text = "В книгах для программистов" _ & " тексты программ играют важную роль" .Paragraphs.Last.Range.Select 'Вводим исправления в последний абзац (автор Fooler) .Track Revisions = True Application.UserName = "Fooler" Selection.Range.Text = "В книгах для программистов" _ & " тексты программ не играют особой роли," _ & " а лишь усложняют понимание" 'Добавляем новый абзац .Track Revisions = False .Paragraphs.Add .Paragraphs.Last.Range.Text = "В книгах для программистов" _ & " тексты программ играют важную роль." .Paragraphs.Last.Range.Select 'Вводим исправления в последний абзац (автор Thinker) .Track Revisions = True Application.UserName = "Thinker" Selection.Range.Text = "В книгах для программистов" _ & " тексты программ весьма полезны," _ & " если только это хорошие программы."

For Each Revis In . Revisions Debug.Print Revis.Author, Revis.Date, Revis.Range.Text If Revis.Author = "Fooler" Then Revis.Reject ElseIf Revis.Author = "Thinker" Then Revis.Accept End If Next Revis Debug.Print . Revisions.Count .Track Revisions = False . Show Revisions = False Application.UserName = "Vladimir Billig" End With

End Sub

Листинг 1.39.

Обратите внимание, что в отличие от объектов Comment свойство Author объектов Revision может быть использовано только для чтения, поэтому мне пришлось менять фамилию автора правок более хитрым способом. Конечно, выполнять эту программу рекомендуется в пошаговом режиме, чтобы можно было проследить за процесссом появления правок в документе, а затем их принятия в одном случае и отказа от них во втором.

Вот так выглядит окно комментариев и фрагмент нашего тестового документа, в ходе выполнения этой программы в тот момент, когда правки были сделаны обоими авторами:


увеличить изображение
Рис. 1.12.  Документ, содержащий комментарии, сноски и правки


События, их обработка. Автомакросы


Жизнь в мире объектов была бы скучна, если бы не происходили события во внешнем мире, связанном с пользователем и операционной средой. Получая сообщения о событиях, объекты выполняют специальные методы - обработчики событий. Программируя эти методы, разработчик определяет реакцию объекта на события. Стандартные объекты VBA могут реагировать только на заранее фиксированные события. При создании собственных классов в Office 2000 появилась возможность определить для них собственный набор событий, на которые будут реагировать объекты этого класса. Познакомимся с событиями, на которые могут реагировать объекты Document и Application.



События объекта Application


Многие из объектов Word обладают встроенным набором событий. Но среди них есть странная группа объектов, которые обладают событиями, но появляются по умолчанию как объекты без событий. Эти объекты существуют в двух ипостасях, как объекты без событий и объекты с событиями (With Events). Чтобы включить события для таких объектов, необходимо предпринять ряд мер, в частности создать класс объектов With Events и экземпляр этого класса связать с объектом без событий. Такая технология использется и при работе с объектами собственных классов. Эти объекты создаются по умолчанию без событий, но разработчик вправе определить для них собственный набор событий.

Из стандартных объектов Word наиболее известными объектами этой группы являются объекты Application. Когда открывается Word и создается объект Application, по умолчанию он не имеет событий, которые мог бы обрабатывать. Но можно связать с приложением другой объект (Application With Events), реагирующий на события. В Office 97 у этих объектов было всего два события Quit и DocumentChange, возникающие, при попытках пользователя закрыть приложение или переключится с одного документа на другой. В Office 2000 набор событий существенно расширился и теперь их более десяти. Для того чтобы создать обработчик событий объекта Application необходимо:

Создать класс, в который вложен объект Application WithEvents;Создать в классе обработчики событий этого объекта, следуя обычной технологии.Создать экземпляр этого класса и связать объект Application WithEvents с объектом Application.

Начнем решение этой задачи с создания нового класса объектов. Этот класс очень прост и содержит лишь одно свойство, задающее объект с событиями. Вот определение этого класса:

Option Explicit 'Класс EventsOfApp Public WithEvents AppEv As Word.Application

Листинг 1.67.

(html, txt)

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



События объектов Document и Template


Объекты Document и Template могут реагировать на три события:

Таблица 1.3. События объектов Document и Template

СобытиеВозникает, когда
OpenВ коллекцию Documents добавляется существующий документ, и открывается файл, хранящий этот документ.
NewСоздается новый документ, который добавляется в коллекцию Documents.
CloseЗакрывается документ, и он удаляется из коллекции Documents.

Обработчики событий Open и Close находятся в модуле, связанном с документом (This Document). Помещать в проект конкретного документа обработчик события New не стоит (мы же говорим о создании нового документа!), так что место ему в шаблоне, на основе которого создается новый документ.

В лекции 4 я подробно рассмотрел, как программным путем можно создать обработчики событий, в том числе событий Open и New. Что же касается более простых ситуаций, то примеров создания обработчиков событий для разных объектов было предостаточно. Создание игры "Волк, Коза и Капуста", рассмотренной в лекции 6, полностью построено на обработке событий, возникающих в процессе игры.



Списки в документах


Коллекции Lists(List), ListParagraphs(ListParagraph), ListTemplates(ListTemplate) используются при работе со списками. Списки широко используются в документах всякий раз, когда имеешь дело с перечислением, скажем, пунктов повестки дня или деталей какого-либо механизма или объекта. Списки можно оформлять в соответствии с некоторым шаблоном. Существуют две группы шаблонов: нумерованные списки и списки-бюллетени. Коллекция ListTemplates содержит шаблоны оформления списков, а класс ListTemplate описывает конкретный шаблон. Шаблон применяется к списку абзацев и придает ему структуру, заданную шаблоном. Коллекция Lists содержит те списки документа (списки абзацев), что оформлены как нумерованные списки или списки-бюллетени. Коллекция ListParagraphs представляет список абзацев всех списков документа. Свойством ListParagraphs, которое возвращает объект соответствующего класса, обладает не только документ, но и объекты List и Range. Так что при наличии списка - объекта List можно выделить список его абзацев. Чаще приходится выполнять обратную операцию - применять к списку абзацев один из возможных шаблонов, придав ему "настоящую" структуру списка. Тогда используют объект ListFormat, как показано в следующей процедуре:

Листинг 1.36.

(html, txt)

Заметьте, что для того чтобы отменить форматирование совокупности абзацев как списка, применяется тот же метод ListFormat. Приведем результаты отладочной печати:

Списков в документе - 1 Они занимают - 3 абзацев Теперь списков - 2 Они занимают - 7 абзацев Теперь списков - 1 Они занимают - 3 абзацев

Листинг 1.37.

(html, txt)

Вначале в документе был один список из трех пунктов. Затем мы выделили некоторую область (4 абзаца), создали связанный с ней объект ListFormat и применили к нему шаблон списка-бюллетеня, вызвав метод ApplyBulletDefault. В результате появился еще один список заданной структуры из четырех пунктов, что подтверждает отладочная печать и что можно видеть при пошаговом выполнении этой программы. Заметьте, список абзацев теперь содержит все абзацы обоих списков. Использование объекта ListParagraphs может быть весьма полезным в ряде случаев, когда возникает необходимость обработки всех списков документа или его части. Обратите внимание, для отмены форматирования абзацев в виде списка я использовал тот же оператор, что и для включения форматирования.


End With End Sub

Листинг 1.36.

Заметьте, что для того чтобы отменить форматирование совокупности абзацев как списка, применяется тот же метод ListFormat. Приведем результаты отладочной печати:

Списков в документе - 1 Они занимают - 3 абзацев Теперь списков - 2 Они занимают - 7 абзацев Теперь списков - 1 Они занимают - 3 абзацев

Листинг 1.37.

Вначале в документе был один список из трех пунктов. Затем мы выделили некоторую область (4 абзаца), создали связанный с ней объект ListFormat и применили к нему шаблон списка-бюллетеня, вызвав метод ApplyBulletDefault. В результате появился еще один список заданной структуры из четырех пунктов, что подтверждает отладочная печать и что можно видеть при пошаговом выполнении этой программы. Заметьте, список абзацев теперь содержит все абзацы обоих списков. Использование объекта ListParagraphs может быть весьма полезным в ряде случаев, когда возникает необходимость обработки всех списков документа или его части. Обратите внимание, для отмены форматирования абзацев в виде списка я использовал тот же оператор, что и для включения форматирования.


Свойства объекта Word.Application


Свойства любого объекта делятся на две группы: свойства-участники (объекты) и терминальные свойства (обычные переменные Visual Basic). Свойства-участники Word.Application приведены в таблицах 1.1 и 1.2. Там они были перечислены, сейчас мы рассмотрим их чуть более подробно. Но вначале несколько слов о более простой группе терминальных свойств.



Свойства - участники


Конечно, центральные объекты мира Word - это объекты, входящие в коллекции Documents и Templates, документы и шаблоны, открытые в приложении. Им-то и посвящена большая часть этой лекции. Но пока давайте хотя бы кратко коснемся объектов "второго плана".



Таблицы в документах


Таблицы, таблицы, таблицы… Серьезных документов без них не бывает. Они могут быть разных типов. С документом Word связываются следующие классы коллекций, задающие те или иные таблицы: Tables, TablesOfContents, TablesOfFigures, TablesOfAuthoritiesCategories, TablesOfAuthorities.

Класс Table определяет "обычные" таблицы с произвольным количеством строк и столбцов и произвольным заполнением полей. Остальные классы задают таблицы специального вида. В следующем примере открывается документ с именем DocThree и в него вставляется несколько таблиц:

В начало документа вставляется специальная таблица, позволяющая автоматически создать оглавление нашего документа. Эта таблица представляет элемент коллекции TablesOfContents. Замечу, что автоматическое создание оглавления предполагает использование для заголовков документа стандартных стилей. Если же Вы используете для этих целей собственные стили с именами, отличными от Heading, то программно создать оглавление не удастся.В конец этого документа вставляется обычная таблица. Здесь же происходит заполнение ячеек таблицы, что позволяет продемонстрировать возможности программной работы с элементами таблицы.На следующем шаге процедуры WorkWithTables вызывается процедура, вставляющая в документ еще одну автоматически заполняемую таблицу специального вида элемент коллекции TablesOfFigures. О ней поговорим чуть позже, а пока приведем текст процедуры, решающей эти три задачи:

Листинг 1.29.

(html, txt)

Поскольку обычные таблицы является частью большинства документов Word, то стоит сказать о них чуть подробнее. При работе вручную таблицы можно вставлять в документ двумя способами. Более простые таблицы с фиксированным числом строк и столбцов можно вставить в документ, вызвав из меню Table (Таблица) пункт Insert (Вставить). В открывшемся диалоговом окне можно указать число строк и столбцов добавляемой таблицы и некоторые ее свойства, управляющие размерами ее ячеек. Если же необходимо построить таблицу более сложного вида, то из меню Table вызывается пункт Draw (Рисовать). В этом случае в руках у пользователя "появляется" карандаш и с его помощью можно нарисовать таблицу довольно сложной конфигурации. Я уже говорил ранее, что MacroRecorder не может следить за действиями пользователя, рисующего такую таблицу. Однако он вполне справляется, когда пользователь вставляет таблицу с фиксированным числом строк и столбцов и, например, заполняет ее ячейки. Собственно говоря, объект Table и работа с ним в предыдущей процедуре является программным отображением моих действий по созданию и работе с такими таблицами. Возникает естественный вопрос, а можно ли программно создать таблицу сложной конфигурации, например, подобную таблице Менделеева, можно ли работать программно с такими таблицами? Ответ, естественно, положителен. Программное построение таблицы сложной конфигурации обеспечивается тем, что, используя метод Cell, можно получить доступ к любой из ячеек таблицы, (в предыдущем примере показано, как это можно сделать), а затем к отдельной ячейке можно применить метод Split, расщепив ее на нужное количество строк и столбцов. Вот пример программной работы с таблицей Менделеева:


Sub WorkWithDrawingTable() ' В этой процедуре демонстрируется работа 'с рисованной таблицей Менделеева Documents("ExampleOfTable").Activate Dim DrawTable As Table Set DrawTable = ActiveDocument.Tables(1) With DrawTable Debug.Print "Столбцов - ", .Columns.Count Debug.Print "Строк - ", .Rows.Count Debug.Print .Cell(5, 1).Range.Text 'Усложняем конфигурацию .Cell(4, 5).Split 2, 3 End With End Sub
Листинг 1.30.
(html, txt)
Замечу, что программно работать с такими таблицами довольно сложно, так как здесь трудно понять, какие индексы будет иметь та или иная ячейка таблицы, после того как, например, одна из ячеек таблицы расщеплена на несколько ячеек. Так что можно понять, почему MacroRecorder отказывается транслировать действия пользователя, рисующего сложную таблицу, и не может создать текст соответствующего макроса. Он (MacroRecorder) не может разобраться, с какой ячейкой работает пользователь в текущий момент. В заключение еще раз повторю, что программно работать с таблицами сколь угодно сложной конфигурации, допустимой в Office 2000, хотя и сложно, но вполне возможно.
Помимо "обычных" таблиц есть возможность создавать и работать с большим числом специальных таблиц, заполняемых автоматически при их создании. Пример одной из таких таблиц таблицы, создающей оглавление документа уже приведен. Есть еще несколько видов специальных таблиц, аналогичных таблице оглавления. Такие таблицы позволяют строить автоматически ссылки на иллюстрации, используемые в документах, на цитируемые источники и так далее. Рассмотрим теперь более подробно работу с еще одной из специальных таблиц, содержащей ссылки на иллюстрации, используемые в документе. В документах Word типичным является использование большого числа иллюстраций - таблиц, графиков, диаграмм. Зачастую, наряду с оглавлением документа полезно в документе иметь аналоги оглавления, содержащие ссылки на иллюстративные элементы документа. Для этой цели и используются специальные таблицы объекты класса TableOfFigures. Вот процедура, создающая две такие таблицы, первая из которых содержит ссылки на графики, вторая на таблицы:
Листинг 1.31.
(html, txt)
Заметьте, что заголовки иллюстративных элементов, попадающих в соответствующие таблицы, должны быть "настоящими" заголовками и содержаться в коллекции CaptionLabels, о работе с которой я уже подробно рассказывал.


Листинг 1.30.
Замечу, что программно работать с такими таблицами довольно сложно, так как здесь трудно понять, какие индексы будет иметь та или иная ячейка таблицы, после того как, например, одна из ячеек таблицы расщеплена на несколько ячеек. Так что можно понять, почему MacroRecorder отказывается транслировать действия пользователя, рисующего сложную таблицу, и не может создать текст соответствующего макроса. Он (MacroRecorder) не может разобраться, с какой ячейкой работает пользователь в текущий момент. В заключение еще раз повторю, что программно работать с таблицами сколь угодно сложной конфигурации, допустимой в Office 2000, хотя и сложно, но вполне возможно.
Помимо "обычных" таблиц есть возможность создавать и работать с большим числом специальных таблиц, заполняемых автоматически при их создании. Пример одной из таких таблиц таблицы, создающей оглавление документа уже приведен. Есть еще несколько видов специальных таблиц, аналогичных таблице оглавления. Такие таблицы позволяют строить автоматически ссылки на иллюстрации, используемые в документах, на цитируемые источники и так далее. Рассмотрим теперь более подробно работу с еще одной из специальных таблиц, содержащей ссылки на иллюстрации, используемые в документе. В документах Word типичным является использование большого числа иллюстраций - таблиц, графиков, диаграмм. Зачастую, наряду с оглавлением документа полезно в документе иметь аналоги оглавления, содержащие ссылки на иллюстративные элементы документа. Для этой цели и используются специальные таблицы объекты класса TableOfFigures. Вот процедура, создающая две такие таблицы, первая из которых содержит ссылки на графики, вторая на таблицы:
Public Sub WorkWithTablesOfFigures() 'Работа с таблицами ссылок на иллюстрации документа Dim DocPath As String Dim myr As Range Dim ToF As TableOfFigures Dim capt As CaptionLabel 'Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthree").Activate
With ActiveDocument
Set myr = Selection.Range myr.Select 'Создаем таблицы ссылок на графики и таблицы 'Оба заголовка должны быть элементами коллекции CaptionLabels .TablesOfFigures.Add Range:=myr, Caption:="График" .TablesOfFigures.Add Range:=myr, Caption:="Table"
For Each ToF In .TablesOfFigures Debug.Print ToF.Caption Next ToF For Each capt In Application.CaptionLabels Debug.Print capt.Name Next capt End With End Sub
Листинг 1.31.
Заметьте, что заголовки иллюстративных элементов, попадающих в соответствующие таблицы, должны быть "настоящими" заголовками и содержаться в коллекции CaptionLabels, о работе с которой я уже подробно рассказывал.

Текст и объекты Range и Selection


Основной частью документа Word является, конечно, текст этого документа. Уже было сказано, как структурирован текст документа, рассмотрены коллекции - Characters, Words, Sentences, Paragraphs, которые позволяют работать с символами, словами, предложениями и абзацами текста. Говорил я также и о том, что только этими коллекциями не обойтись, и необходим общий класс объектов, позволяющий задать произвольную область текста. Таковыми являются два важных класса Range и Selection. Объекты этих классов широко используются при работе с текстом. Документы, поддокументы, разделы, все вышеупомянутые коллекции от Characters до Words имеют метод или свойство Range, возвращающие в качестве результат объект Range. Каждый объект Range задает область определения некоторого объекта, включая текст и все объекты, связанные с этим текстом - комментарии, ссылки и прочее. Так, если некоторый объект вызвал метод Range, то возвращаемый объект Range будет содержать область определения объекта, вызвавшего метод.

Объект Selection представляет выделенную область. Поскольку в каждом окне может быть только одна выделенная область, то одновременно может существовать лишь несколько объектов Selection по одному на каждое существующее окно или подокно. Заметим также, что, объект Selection всегда существует в окне, даже если и не сделано явного выделения некоторой области, в последнем случае объект Selection задает точку вставки, определенную позицией курсора.

Объект Document имеет метод Range, возвращающий объект Range, и метод Select, создающий объект Selection. Метод Range - это функция, возвращающая в качестве результата объект Range; метод Select - это процедура без параметров, которая создает объект Selection в качестве побочного эффекта. Заметьте существенную разницу между методами Range и Selection. В первом случае возвращается сам объект и поэтому можно запомнить возвращаемый объект и в программе одновременно работать с несколькими такими объектами. В случае вызова метода Selection объект не возвращается, следовательно, запомнить его нельзя, что и гарантирует уникальность объекта Selection.

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

Объекты Range и Selection столь же многообразны по своей структуре, как и объект Document. И даже большинство свойств у этих трех объектов одни и те же. Эти три объекта являются схожими. Это понятно, так как большинство частей документа: предложения, абзацы, разделы, таблицы, рисунки, комментарии, ссылки и многое другое - может составлять любую подобласть документа, в том числе и выделенную подобласть. Значит, большинство ранее описанных частей документа являются и частями (свойствами) объектов Range и Selection. Это приятно - ведь с большинством свойств этих объектов мы уже знакомы!

Объект Range напоминает матрешку: в каждую область вложена область поменьше. Вот пример корректного (хоть и не самого эффективного) задания объекта Range:

Листинг 1.55.

(html, txt)

Сколько объектов Range упоминается в этом предложении? Правильный ответ: 6, но не 3. Напомним: на нижнем уровне отсутствуют классы, определяющие символ, слово или предложение - все эти объекты принадлежат классу Range.

Для объекта Selection нельзя построить такую хитрую цепочку вложений - ведь метод Select не возвращает объект Selection. Но можно построить такую же "хитрую" последовательность операторов, которая задает сужающуюся область выделения:

Листинг 1.56.

(html, txt)



Терминальные свойства


Терминальные свойства просты для понимания, и я не буду долго на них останавливаться. Большинство из них являются общими для всех объектов Application. Попытаюсь сейчас дать небольшой обзор терминальных свойств, объединяя их в группы:

Свойства Top, Left, Heihgt, Width, Caption определяют размеры и заголовок окна приложения. Свойства, начинающиеся с префикса User, - UserAddress, UserName и другие задают характеристики пользователя.Группа булевых свойств, начинающихся с префикса Display, - DisplayScreenTips, DisplayStatusBar и другие позволяют включать или выключать отображение на экране тех или иных элементов интерфейса.Группа свойств, начинающихся префиксом Default - DefaultSaveFormat, DefaultTableSeparator позволяет устанавливать некоторые характеристики, используемые приложением по умолчанию.Группа булевых свойств, использующих суффикс Available - MAPIAvailable, MouseAvailable, MathCoprocessorAvailable устанавливают доступность некоторых устройств.Другие свойства - булевы и не булевы задают другие многочисленные характеристики, например, CapsLock и NumLock позволяют определить, нажаты ли на клавиатуре соответствующие клавиши, Path - путь к каталогу, содержащему Word, ActivePrinter - активный принтер и так далее.

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

Public Sub WorkWithTerm() 'Работа с терминальными свойствами 'Выключаю опции Application. DisplayStatusBar = False Application. DisplayRecentFiles = False

End Sub

Листинг 1.1.

(html, txt)

Изменяя терминальные свойства DisplayStatusBar и DisplayRecentFiles, я выключил панель статуса и показ в меню File файлов последнего использования. Убедившись в том, что они действительно выключились, я немедленно включил их уже руками, взведя соответствующие флажки в меню Tools|Options.

Рассмотрю подробнее лишь одно терминальное свойство, не столь тривиальное и отличающееся по своему духу от других свойств. Свойство IsObjectValid(obj As Object) и свойством назвать нельзя. Скорее это метод, аргументом которого является некоторый объект произвольного класса, а возвращаемое значение булевого типа показывает, существует ли объект, заданный аргументом метода (свойства). Это свойство полезно применять при работе, например, с коллекциями. Прежде чем начинать работу с тем или иным элементом коллекции, полезно проверить, а существует ли такой элемент, или, возможно, он уже был удален. Вот пример работы с этим свойством:


Public Sub IsObjectProp() ' В этом примере используется свойство IsObjectValid Dim MyPath As String Dim SecondDoc As Document MyPath = ActiveDocument.Path 'Определяем объект Set SecondDoc = Documents.Open(MyPath & "\DocTwo.doc") 'Удаляем объект, возможно, по ошибке Documents(1).Close 'Теперь нам объект понадобился If Not IsObjectValid(SecondDoc) Then 'Добавляем элемент в коллекцию Set SecondDoc = Documents.Open(MyPath & "\DocTwo.doc") End If 'Работа с документом DocTwo Debug.Print SecondDoc.Name

End Sub

Листинг 1.2.

(html, txt)

Заметьте, при работе с этим свойством я использую созданный мной объект SecondDoc, поскольку не могу написать IsObjectValid(Documents("DocTwo")). Написать-то, конечно, могу, но при выполнении возникнет ошибка. Ошибка не связана с самой функцией IsObject, - она возникнет раньше при вычислении значения аргумента - Documents("DocTwo"), поскольку в коллекции Documents этот элемент отсутствует.


Коллекция объектов Tasks содержит задачи,


Коллекция объектов Tasks содержит задачи, выполняемые системой в текущий момент. Возможно, Вы и не подозреваете, как много задач выполняется за кулисами операционной системы. В следующем примере распечатывается список имен задач, входящих в момент запроса в коллекцию:
Public Sub WorkWithTasks() 'Работа с задачами Dim Tsk As Task Debug.Print Application.Tasks.Count For Each Tsk In Application.Tasks Debug.Print Tsk.Name Next Tsk
End Sub
Листинг 1.24.
(html, txt)
Весь список из 65 текущих задач я приводить не буду, хотя познакомиться с ним полезно. Я ограничусь приведением имен лишь некоторых задач из начала и конца списка:
65 Microsoft Agent Microsoft Office Shortcut Bar Menu Parent Window NetDDE Agent Edit Microsoft Visual Basic - DocOne [running] - [Examples (Code)] Ch1 - Microsoft Word Run Sub/UserForm View DocOne - Microsoft Word Edit
Transmission window MarshalingWindow OLEChannelWnd MarshalingWindow Microsoft Outlook Program Manager
Листинг 1.25.
(html, txt)

Заголовки (CaptionLabels)


Коллекция объектов CaptionLabels (CaptionLabel) представляет заголовки, которые вставляются в документ одновременно со вставкой таблиц, рисунков, диаграмм и других подобных элементов документа. Следует отметить, что при вставке в документ каждого нового элемента определенного типа и его заголовка происходит автоматическая нумерация заголовков, (например, Рисунок 1, Рисунок 2 и т.д.).

В коллекцию разрешается добавлять новые заголовки и удалять существующие. При работе вручную следует выбрать в пункте Insert (Вставка) главного меню Word команду Caption (Название). В открывающемся диалоговом окне есть раскрывающийся список заголовков, из которого можно выбрать подходящий элемент и вставить его в документ. Кнопка New Label (Создать) позволяет добавить новый заголовок к уже имеющемуся списку. Кнопка Delete (Удалить) позволяет удалить заголовок. Вот как выглядит это окно:


Рис. 1.4.  Окно заголовков

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

Public Sub AddCaptions() 'Работа с коллекцией заголовков

Dim Item As CaptionLabel With CaptionLabels Debug.Print .Count 'Добавление трех заголовков .Add "Мой Рисунок" .Add "Диаграмма Excel" .Add "Мой Пример" Debug.Print .Count For Each Item In CaptionLabels Debug.Print Item .Name Next Item 'Удаление последнего заголовка .item(.Count).Delete

End With End Sub

Листинг 1.3.

(html, txt)

Вот результаты отладочной печати, появляющиеся в окне отладки (Immediate):

Листинг 1.4.

(html, txt)

Этот пример типичен для работы с коллекциями. Здесь добавляются и удаляются элементы коллекции, определяется их число, организуется цикл по всем элементам. Покажем теперь, как, используя эту коллекцию, можно программно вставлять в текст документа в нужном месте те или иные заголовки:

Public Sub InsertLabelInDoc() 'Вставка заголовка в текст документа 'Вставка заголовков With ActiveDocument .Paragraphs.Add .Paragraphs.Last.Range.Select Selection.InsertCaption Label:="Диаграмма Excel" .Paragraphs.Add .Paragraphs.Last.Range.Select Selection.InsertCaption Label:=CaptionLabels(CaptionLabels.Count) End With End Sub

Листинг 1.5.

(html, txt)

В данном примере дважды будет вставлен заголовок "Диаграмма Excel". Конечно, реально этот заголовок следует вставлять после (перед) соответствующей диаграммой, но в примере заголовки вставляются в конец документа, в последний его абзац. Заметьте, при вставке происходит автоматическая нумерация заголовков, так что в тексте документа появятся два таких заголовка:

Листинг 1.6.

(html, txt)



Как видите, лекция, посвященная объектной


Как видите, лекция, посвященная объектной модели документов Word, оказалась непомерно большой. Я, например, вздохнул с облегчением, когда закончил ее. Понимаю, что и читается она с трудом. Но надеюсь, Вы ощутили огромность этого здания, стали лучше понимать, что Word это не просто текстовый редактор, что многие его возможности зачастую остаются не востребованными. Полагаю, немногие пользователи ведут вычисления в Word, занимаются рисованием, строят сложные таблицы. Мало кто из программистов использует эти возможности, создавая документы программно. Конечно, большинство программистов и пользователей предпочитают работать с таблицами и вести вычисления в Excel, а рисовать в графических редакторах, но я хотел обратить Ваше внимание на широкий спектр возможностей, которые предоставляет сам Word. Естественно, даже в этом большом тексте о многом сказать не удалось, а иногда не все сказанное мною сказано внятно. Вместе с тем надеюсь, что, прочитав эту лекцию, возможно не вникая в некоторые детали, при необходимости Вы вернетесь к более внимательному изучению того или иного раздела с пользой для себя.