Word и его объекты
Свойства объекта Word.Application
Свойства любого объекта делятся на две группы: свойства-участники (объекты) и терминальные свойства (обычные переменные Visual Basic). Свойства-участники Word.Application приведены в таблицах 1.1 и 1.2. Там они были перечислены, сейчас мы рассмотрим их чуть более подробно. Но вначале несколько слов о более простой группе терминальных свойств.
Терминальные свойства
Терминальные свойства просты для понимания, и я не буду долго на них останавливаться. Большинство из них являются общими для всех объектов 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.
Изменяя терминальные свойства 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.
Заметьте, при работе с этим свойством я использую созданный мной объект SecondDoc, поскольку не могу написать IsObjectValid (Documents("DocTwo")). Написать-то, конечно, могу, но при выполнении возникнет ошибка. Ошибка не связана с самой функцией IsObject, - она возникнет раньше при вычислении значения аргумента - Documents ("DocTwo"), поскольку в коллекции Documents этот элемент отсутствует.
Свойства - участники
Конечно, центральные объекты мира Word - это объекты, входящие в коллекции Documents и Templates, документы и шаблоны, открытые в приложении. Им-то и посвящена большая часть этой лекции. Но пока давайте хотя бы кратко коснемся объектов "второго плана".
Заголовки (CaptionLabels)
Коллекция объектов CaptionLabels (CaptionLabel) представляет заголовки, которые вставляются в документ одновременно со вставкой таблиц, рисунков, диаграмм и других подобных элементов документа. Следует отметить, что при вставке в документ каждого нового элемента определенного типа и его заголовка происходит автоматическая нумерация заголовков, (например, Рисунок 1, Рисунок 2 и т.д.).
В коллекцию разрешается добавлять новые заголовки и удалять существующие. При работе вручную следует выбрать в пункте Insert (Вставка) главного меню Word команду Caption (Название). В открывающемся диалоговом окне есть раскрывающийся список заголовков, из которого можно выбрать подходящий элемент и вставить его в документ. Кнопка New Label (Создать) позволяет добавить новый заголовок к уже имеющемуся списку. Кнопка Delete (Удалить) позволяет удалить заголовок. Вот как выглядит это окно:
Работа руками нас интересует в малой степени, хотя, конечно, программист должен уметь это делать. Но давайте посмотрим, как это делается программно. Вначале добавим к существующей коллекции заголовков три своих заголовка:
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.
Вот результаты отладочной печати, появляющиеся в окне отладки (Immediate):
3 6 Figure Table Equation Мой Рисунок Диаграмма Excel Мой ПримерЛистинг 1.4.
Этот пример типичен для работы с коллекциями. Здесь добавляются и удаляются элементы коллекции, определяется их число, организуется цикл по всем элементам. Покажем теперь, как, используя эту коллекцию, можно программно вставлять в текст документа в нужном месте те или иные заголовки:
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.
Автозаголовки (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.
Процедура WorkWithAutoLabels включает все автозаголовки и распечатывает их имена. Приведем первую семерку имен OLE-объектов из 28 объектов, которые можно добавить в текущий момент у меня на компьютере:
28 Microsoft Word Table Adobe Acrobat Document Видеоклип Microsoft Chat Room Диаграмма Microsoft Excel Лист Microsoft Excel MIDI-файлЛистинг 1.8.
Автокоррекция (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.
Перемещение по тексту. Объект Browser
Объект Browser позволяет перемещать точку вставки, указывающую на объекты в документе. Перейти можно к предыдущей или следующей точке редактирования документа. Можно также предварительно выбрать целевой объект, это может быть таблица, заголовок, комментарий или другой из некоторого набора возможных объектов, а затем переходить к следующему или предыдущему объекту выбранного типа. Вручную это делается с помощью трех инструментальных кнопок, расположенных в самом низу вертикальной полосы прокрутки окна документа. Покажем, как программно, перемещаясь по заголовкам, можно помочь пользователю найти в документе нужный ему заголовок. Вот соответствующая процедура:
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.