VBA в MS Office 2007

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

Разбить на страницы
Показывать лекцию целиком

10.1. Коллекция Documents - открытые документы

Коллекция Documents включает в себя открытые документы с их полезными методами и свойствами. Наряду с объектами Document, которые входят в коллекцию, здесь мы подробнее рассмотрим уже известный вам объект ActiveDocument,

ActiveDocument имеет те же свойства и методы, что и любой Document - объект, однако, часто объектом ActiveDocument удобнее пользоваться.

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

Для начала давайте рассмотрим свойства и методы коллекции, а потом займемся объектом Document.

10.2. Методы коллекции Documents

10.2.1. Add - создаем новый документ

Этот метод добавляет новый объект Document в коллекцию Documents - то есть создает новый документ. Его можно использовать так (листинг 10.1.):

Documents.Add

При выполнении такого кода будет создан новый пустой документ на основе шаблона Normal. Чтобы ссылка на созданный документ была присвоена переменной, можете воспользоваться такой конструкцией (листинг 10.2.):

Dim obj_NewDoc As Word.Document
    Set obj_NewDoc = Application.Documents.Add

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

Метод Add может принимать несколько необязательных параметров. Полный вызов метода выглядит так:

Documents.Add (Template, NewTemplate, DocumentType, Visible)

Template (Шаблон) - отвечает за шаблон, который будет использован при создании файла. По умолчанию это Normal.dotm.

NewTemplate (Новый шаблон) - если этот параметр установлен в True - файл будет обрабатываться как шаблон. По умолчанию установлен в False.

DocumentType (Тип документа) - очень полезный параметр, который позволяет создавать документы различных типов. На тип документа указывает одна из констант, в частности, по умолчанию это wdNewBlankDocument - то есть пустой документ. Так же этот параметр может принимать значения wdNewEmailMessage (Почтовое сообщение), wdNewFrameset (Документ с рамками - такие используются при создании WEB-страниц), wdNewWebPage (WEB-страница).

Visible (Видимость) - по умолчанию установлен в True - то есть создаваемый документ видим для пользователя. Если вы хотите, сначала сформировать новый документ, а уже потом показать его пользователю - установите это свойство в False, а после окончания формирования документа - воспользуйтесь свойством Visible созданного документа, чтобы отобразить его.

10.2.2. Open - открываем документы

Метод Open используется для открытия существующих файлов, возвращая объект типа Document. Файл, имя которого задано при вызове метода, открывается и добавляется в коллекцию Documents. Метод может принимать множество параметров, однако основной - это FileName, который и задает имя открываемого файла.

Например, для открытия файла 1.docm, расположенного в корневом каталоги диска С, можно воспользоваться кодом из листинга 10.3.

Documents.Open FileName:="C:\1.docm"

10.2.3. Close - закрываем все документы

Метод Close используется для закрытия всех открытых документов. Применяют его достаточно редко - удобнее закрывать каждый конкретный документ по отдельности. При вызове метода без параметров система задаст вопрос о сохранении документов, которые были изменены (листинг 10.4.).

Documents.Close

Полный вызов метода выглядит так:

Documents.Close(SaveChanges, OriginalFormat, RouteDocument)

Среди параметров для нас наибольший интерес представляют первых два.

SaveChanges (Сохранить изменения) отвечает за сохранение изменений. По умолчанию он установлен в wdPromptToSaveChanges (Вывести запрос о сохранении), так же он может быть установлен в wdDoNotSaveChanges (Не сохранять изменения) и wdSaveChanges (Сохранить изменения). Как видите, с помощью параметра wdSaveChanges можно организовать удобное и быстрое закрытие множества документов с сохранением изменений

OriginalFormat (Формат) - отвечает за формат сохраняемого документа. Может принимать различные значения: wdOriginalDocumentFormat (Оригинальный формат документа), wdPromptUser (Запросить формат у пользователя), wdWordDocument (Документ Word).

Вот как выглядит вызов метода Close, который сохраняет все открытые документы и закрывает их (листинг 10.5.)

Documents.Close (wdSaveChanges)

Учтите - если какие-то из документов сохраняются в первый раз - вы получите запрос об имени документа.

10.2.4. Item - обращаемся к отдельным документам

10-01-Item.docm - пример к п. 10.2.4.

Метод Item позволяет обращаться к открытым документам (то есть - к объектам Document ), используя их индексы или имена. Нумерация документов начинается с единицы. Чтобы узнать общее количество открытых документов, можно воспользоваться свойством Documents.Count.

Например, с помощью нижеприведенного кода из листинга 10.6 мы поочередно выводим имена открытых документов с указанием номера документа в коллекции:

For i = 1 To Documents.Count
    MsgBox (Documents.Item(i).Name  _
    " - документ номер "  i)
Next i

Очевидно, что свойство Count коллекции Documents позволяет узнать количество открытых документов, а свойство Name объекта Item(i) содержит имя документа с индексом i.

На рис. 10.1 вы можете видеть одно из окон с сообщением об имени и номере документа.

(рис 10.1) Окно сообщения об имени и номере документа

К документам в коллекции Documents можно обращаться и по именам. Также, при обращении к документу необязательно напрямую указывать метод Item - в листинге 10.7 вы можете видеть различные варианты обращения к документу.

MsgBox Documents("Мой документ.docx").Name
   MsgBox Documents.Item("Мой документ.docx").Name
   MsgBox Documents(1).Name

10.2.5. Save - сохранение всех документов

Метод Save сохраняет все документы коллекции. Если документ сохраняется впервые - будет выведено окно с запросом имени файла. В листинге 10.8 приведен пример вызова метода.

Documents.Save

10.3. Свойства коллекции Documents

Среди свойств коллекции Documents нас будет интересовать лишь одно - Count. Это свойство позволяет узнать количество элементов в коллекции Documents, то есть - количество открытых документов. В листинге 10.9 мы выводим в окне сообщения количество открытых документов

MsgBox ("Количество открытых документов: "  _
    Documents.Count)

10.4. Объект Document

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

10.5. Методы объекта Document

10.5.1. Activate - сделаем документ активным

Позволяет сделать документ активным. Например, это может понадобиться для редактирования документа.

Например, код из листинга 10.10 активирует первый документ среди открытых документов.

Dim obj_Doc As Document
Set obj_Doc = Documents.Item(1)
obj_Doc.Activate

10.5.2. Close - закрыть документ

Метод Close закрывает документ. Например, код из листинга 10.11 позволяет закрыть документ, из которого он запущен.

ThisDocument.Close

Метод можно вызывать с параметрами. В частности, полезен параметр SaveChanges, предназначенный для настройки автоматического сохранения документа. Если присвоить ему значение wdSaveChanges - документ будет сохранен при закрытии. Например, код из листинга 10.12 по очереди закрывает каждый из открытых документов.

Dim obj_Doc As Document
For Each obj_Doc In Documents
    obj_Doc.Close SaveChanges:=wdSaveChanges
Next

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

10.5.3. ComputeStatistics - статистика документа

10-02-Статистика документа.docm - пример к п. 10.5.3

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

ComputeStatistics(Statistic, IncludeFootnotesAndEndnotes)

Параметр Statistic позволяет задавать тип получаемой статистики. Он может принимать значения типа wdStatistic - константы, описание которых приведено ниже:

  • wdStatisticCharacters -количество символов без пробелов
  • wdStatisticCharactersWithSliaces - количество символов, включая пробелы
  • wdStatisticLines - количество строк
  • wdStatisticPages - количество страниц
  • wdStatisticParagraphs - количество абзацев
  • wdStatisticWords - количество слов
  • Параметр IncludeFootnotesAndEndnotes позволяет указать, учитывать ли при подсчете статистики сноски. Установленный в значение True, включает сноски в подсчет статистики, в False - исключает.

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

    Dim num_Stat
        num_Stat = ActiveDocument.ComputeStatistics _
        (wdStatisticCharacters, True)
        MsgBox ("В документе " + Str(num_Stat) + _
        " символов без пробелов, включая сноски")

    10.5.4. FitToPages - уменьшить размер текста на одну страницу

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

    10.5.5. GoTo - перемещение по документу

    10-03-GoTo.docm - пример к п. 10.5.5.

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

    GoTo(What, Which, Count, Name)

    What - тип части документа, на которую осуществляется переход. Например, среди них есть такие элементы:

  • wdGoToBookmark - закладка (пожалуй, наиболее полезный элемент)
  • wdGoToHeading - заголовок
  • wdGoToLine - строка
  • wdGoToObject - объект
  • wdGoToPage - страница
  • Which - направление перемещения.

  • wdGoToAbsolute - перемещение в абсолютных единицах измерения
  • wdGoToFirst - перемещение к первому элементу
  • wdGoToLast -перемещение к последнему элементу
  • wdGoToNext - переход на следующий элемент
  • wdGoToPrevious - переход на предыдущий элемент
  • wdGoToRelative - перемещение относительно текущего элемента
  • Count - номер элемента в документе. Этот параметр часто опускают, так как переход осуществляется с использованием других установок, в частности - параметра Which.

    Name - имя элемента, на который осуществляется переход. Например, имя может быть у закладки.

    С помощью листинга 10.14. мы можем перейти к первому заголовку в файле и добавить в его начало слово "Глава"

    Dim obj_Range As Range
    Set obj_Range = Application.Documents. _
    Item(1).GoTo(wdGoToHeading, wdGoToFirst)
    obj_Range.Text = "Глава " + obj_Range.Text

    10.5.6. Range - область документа

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

    10.5.7. Redo, Undo - отмена изменений

    Эти методы позволяют отменить последнее изменение ( Redo ) и вернуть отмененное изменение ( Undo ).

    10.5.8. RemoveDocumentInformation - удаляем персональную информацию из документа

    Позволяет удалить из документа различную персональную информацию. Например - данные о создателе документа и т.д. Метод может принимать параметр, который определяет, что именно следует удалять. На практике самым полезным является параметр .

    10.5.9. Save - сохранение файлов

    Сохраняет документ. Обычно применяют без параметров, хотя полезен может быть параметр NoPrompt. Установленный в True, предписывает MS Word сохранять файл без дополнительных вопросов пользователю.

    Обычно для сохранения файлов с определенными параметрами используют метод SaveAs.

    10.5.10. SaveAs - тонкое управление сохранением

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

    FileName - задает имя файла

    FileFormat - формат файла. Здесь могут быть использованы значения из перечисления wdSaveFormat. В частности, для сохранения документа в формате по умолчанию (.docx) надо использовать wdFormatDocumentDefault. Для сохранения документа в формате Word 97 - wdFormatDocument97, для получения HTML-файла - wdFormatHTML.

    10.5.11. Select - выделяем содержимое документа

    Выделяет все содержимое документа. После этого с документом можно работать, используя средства объекта Selection.

    10.5.12. UndoClear - очистить историю изменений

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

    10.6. Свойства объекта Document

    10.6.1. Application - приложение документа

    Это свойство позволяет получить объект приложения документа. Вы можете подумать, что это - ошибка, что, наоборот, объект документа содержится в объекте приложения. Однако, ошибки нет. Это свойство позволяет обращаться к приложению тогда, когда у нас нет ссылки на него, а есть лишь ссылка на документ. Например, код в листинге 10.15 позволяет скрыть окно Microsoft Word вместе с окном документа, используя свойство Visible объекта Application.

    ThisDocument.Application.Visible = False

    10.6.2. AttachedTemplate - присоединенный шаблон

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

    Например, такой листинг 10.16. позволяет вывести имя присоединенного шаблона и путь к нему:

    Dim obj_Templ As Template
        Set obj_Templ = ActiveDocument.AttachedTemplate
        MsgBox ("Имя шаблона: "  obj_Templ.Name  _
        ", путь к шаблону: "  obj_Templ.Path)

    Здесь мы сначала объявили новую переменную типа Template, потом присвоили ей ссылку на шаблон, присоединенный к активному документу, а потом воспользовались свойствами Name и Path шаблона, чтобы вывести информацию о нем.

    Листинг 10.17 позволяет присоединить к документу шаблон MyTemplate.dotm, расположенный на диске C.

    ActiveDocument.AttachedTemplate = "C:\MyTemplate.dotm"

    10.6.3. Bookmarks - закладки

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

    10.6.4. Characters, Words, Sentences, Paragraphs и другие

    10-04-Символы.docm - пример к п. 10.6.4.

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

  • Characters (Символы) - возвращает одноименную коллекцию, каждый объект которой представляет собой отдельный символ в документе. Каждый объект коллекции Characters представляет собой диапазон ( Range ), содержащий один символ
  • Words (Слова) - то же самое, но уже для слов.
  • Sentences (Предложения) - то же самое для предложений.
  • Paragraphs (Абзацы) - коллекция абзацев документа.
  • Помимо этих коллекций документ может содержать и другие подобные. В частности, следующие:
  • Hyperlinks - гиперссылки. При добавлении гиперссылки обратите внимание на то, что метод Add использует объект привязки гиперссылки - Anchor (Якорь) - им может быть, например, графический или текстовый элемент.
  • Indexes - индексы.
  • InlineShapes, Shapes - фигуры, графические элементы
  • Lists - списки.
  • OMaths - формулы.
  • Sections - разделы.
  • Tables - таблицы.
  • Работа со всеми этими коллекциями схожа. Давайте рассмотрим ее на примере коллекции Characters, которую, как уже было сказано, можно использовать для работы с отдельными символами документа. Работу с некоторыми другими коллекциями мы рассмотрим ниже.

    Листинг 10.18 позволяет вывести в окне сообщения информацию о количестве символов в документе (включая пробелы).

    MsgBox ("Количество символов: "  _
        ActiveDocument.Characters.Count)

    С помощью метода Item коллекции, мы можем получить доступ к каждому символу документа. Например, с помощью этого метода можно проводить различные статистические подсчеты. листинг 10.19. позволяет узнать, сколько раз в документе использована буква "ф" в верхнем и нижнем регистре.

    Dim var_Fcount
        var_Fcount = 0
        For i = 1 To ActiveDocument.Characters.Count
            If ActiveDocument.Characters.Item(i) = "ф" Or _
            ActiveDocument.Characters.Item(i) = "Ф" Then _
            var_Fcount = var_Fcount + 1
        Next i
        MsgBox ("Количество букв 'Ф' в документе: "  _
        var_Fcount)

    Листинг 10.20 позволяет заменить букву "ё" в верхнем и нижнем регистре на "е".

    Dim obj_D As Document
        Set obj_D = ActiveDocument
        For i = 1 To obj_D.Characters.Count
            If obj_D.Characters.Item(i) = "ё" _
            Then obj_D.Characters.Item(i) = "е"
            If obj_D.Characters.Item(i) = "Ё" _
            Then obj_D.Characters.Item(i) = "Е"
        Next i

    В листинге 10.21 вы можете найти программу, которая "переворачивает" весь текст в документе - меняет последний символ с первым, второй - с предпоследним и так далее.

    Dim obj_D As Document
        Dim str_Chr As String
        Dim var_Count As Variant
        Set obj_D = Documents.Add
        obj_D.Range.Text = "Привет!"
        var_Count = obj_D.Characters.Count
        For i = 1 To var_Count \ 2
            str_Chr = obj_D.Characters.Item(i)
            obj_D.Characters.Item(i) = _
            obj_D.Characters.Item(var_Count - i + 1)
            obj_D.Characters.Item(var_Count - i + 1) = _
            str_Chr
        Next i

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

    Далее создаем новый документ и добавляем в него текст "Привет" с помощью свойства Text объекта Range. Именно этот текст мы и будем переворачивать.

    Итак, мы используем цикл длительностью, равной количеству символов в документе, деленному на 2, причем обратите внимание на оператор деления. Это - целочисленное деление, то есть для четного числа символов в обмене будут участвовать все символы, а для нечетного - один, "центральный" символ останется на своем месте.

    В цикле мы сначала присваиваем i -й символ переменной, потом присваиваем i -му символу противоположный ему символ, а в конце - противоположному символу - символ, хранящийся в переменной. Обратите внимание на алгоритм расчета противоположного символа. Var_Count - i + 1 дает нам последний символ при i = 1, то есть - для первого символа и т.д. В этом несложно убедиться путем расчетов. Например, если в тексте 10 символов, то для обмена с первым символом ( i = 1) мы получим последний символ (10-1+1=10), для второго ( i =2) - девятый (10-2+1=9) и т.д.

    10.6.5. Content - "чистый" текст документа

    10-05-Content.docm - пример к п. 10.6.5.

    Свойство документа Content возвращает объект Range - текст документа без сносок, колонтитулов и т.д.

    В листинге 10.22 вы можете найти пример использования свойства Content для настройки шрифта документа.

    Dim obj_C As Range
        Set obj_C = ActiveDocument.Content
        With obj_C.Font
            .Name = "Arial"
            .Size = 12
            .Spacing = 1.5
        End With

    В этом коде мы объявили объектную переменную типа Range, связали с ней объект Range, возвращаемый свойством Content активного документа, после чего, воспользовавшись свойством Font объекта Range, установили гарнитуру ( Name ) шрифта Arial, размер ( Size ) - 12 пунктов и расстояние между символами в 1.5 пункта.

    Чтобы записать текст документа в строковую переменную, можно воспользоваться кодом листинга 10.23.

    Dim str_Text As String
        str_Text = ActiveDocument.Content.Text

    Cвойство Text объекта Range возвращает текст объекта. Записав текст в переменную, мы сможем работать с ней средствами VBA.

    10.6.6. Endnotes, Footnotes - сноски

    10-06-Сноски.docm - пример к п. 10.6.6.

    Эти свойства возвращают, соответственно, коллекцию Endnotes и Footnotes. В коллекции Endnotes находятся объекты Endnote - то есть концевые ссылки - ссылки, которые расположены в конце документа. В коллекции Footnotes расположены объекты Footnote - обычные ссылки, которые расположены в конце страницы.

    Давайте рассмотрим работу с этими объектами на примере Footnotes. Работа с Endnotes аналогична работе с Footnotes.

    Добавить в документ новую ссылку можно с помощью метода Add коллекции Footnotes.

    Полный вызов метода Add выглядит так:

  • ActiveDocument.Footnotes.Add(Range, Reference, Text)
  • Range - область текста, для которой вставляется сноска.
  • Reference - определяет символ сноски. По умолчанию используется автоматическая нумерация сносок.
  • Text - текст сноски.
  • В листинге 10.24. вы можете видеть код, добавляющий сноску для выделенного фрагмента текста (как правило, выделяют слово):

    ActiveDocument.Footnotes.Add _ 
        Range:=Selection.Range, _
        Text:="Новая сноска!"

    Свойство Count коллекции Footnotes позволяет узнать количество ссылок в документе.

    Чтобы обращаться к отдельным сноскам (объектам Footnote ), можно пользоваться либо их индексами в коллекции Footnotes, либо - оператором For Each - Next.

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

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

    В листинге 10.25 приведен пример форматирования сносок и ссылок на них.

    Dim obj_D As Document
        Dim obj_Footnote As Footnote
        Set obj_D = ActiveDocument
        'Форматируем сноски
        For Each obj_Footnote In obj_D.Footnotes
            obj_Footnote.Range.Font.Size = 11
        Next
        'Форматируем знаки-ссылки на сноски
        For i = 1 To obj_D.Footnotes.Count
            obj_D.Footnotes.Item(i).Reference _
            .Font.Color = wdColorRed
        Next i

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

    Далее, с помощью цикла For-Next мы обходим все ссылки на сноски в тексте и делаем цвет их шрифта красным.

    Чтобы удалить сноску, можно воспользоваться методом Delete объекта Footnote.

    Узнать номер сноски в коллекции Footnotes можно, используя свойство Index. Например, код листинга 10.26 позволяет вывести поочередно все сноски с их номерами в окне сообщения.

    Dim obj_D As Document
        Dim obj_Footnote As Footnote
        Set obj_D = ActiveDocument
        'Выводим информацию о сносках
        For Each obj_Footnote In obj_D.Footnotes
          MsgBox ("Номер сноски: "  obj_Footnote.Index  _
          vbCrLf  "Текст сноски: "  obj_Footnote.Range.Text)
        Next

    Константа vbCrLf заменяет собой знак перевода строки, в итоге при выполнении этого кода для каждой сноски будет выведено такое окно (рис. 10.2.).

    (рис 10.2) Информация о сносках

    10.6.7. FullName, Name, Path - пути и имена

    Свойство FullName возвращает строку, содержащую полное имя документа - то есть полный путь к документу и его имя.

    MsgBox (ActiveDocument.FullName)

    Свойство Name возвращает имя документа без пути, а Path - путь без имени.

    10.6.8. Saved - сохранен или нет

    Возвращает True если документ не изменялся после последнего сохранения.

    10.6.9. Tables - работа с таблицами

    10-07-Таблицы.docm - пример к п. 10.6.9.

    Свойство возвращает коллекцию Tables (Таблицы), которая содержит объекты Table - таблицы, которые имеются в документе. Работа с таблицами похожа на работу с другими объектами документов.

    Например, чтобы добавить в документ новую таблицу, нужно воспользоваться методом Add коллекции Tables. Рассмотрим пример (листинг 10.28.). Добавим в позицию курсора таблицу, состоящую из 3-х строк и 4-х столбцов.

    Dim obj_Table As Table
    Set obj_Table = _
    ActiveDocument.Tables.Add(Range:=Selection.Range, _
    NumRows:=3, NumColumns:=4)
    With obj_Table
        .Borders.OutsideLineStyle = wdLineStyleTriple
        .Borders.InsideLineStyle = wdLineStyleSingle
    End With

    Здесь мы сначала объявляем объектную переменную типа Table - для хранения ссылки на таблицу. Далее - при помощи метода Add коллекции Tables добавляем в документ новую таблицу, состоящую из 3-х строк и 4-х столбцов. Обратите внимание на параметр Range метода Add. Он задает позицию в документе, куда будет вставлена новая таблица. Здесь мы приравняли ему такое значение: Selection.Range. Ниже мы будем говорить и об объекте Selection, и о Range, однако отметим, что выражение Selection.Range можно передать обычным языком как "Текущее выделение". Значит, таблица будет вставлена в выделенную область документа, либо, если область документа явно не выделена - туда, где в момент запуска макроса установлен курсор.

    Добавленная таблица не очень хорошо заметна в документе - она состоит из невидимых линий. Поэтому мы настраиваем отображение линий таблицы с помощью блока With - End With для переменной obj_Table. Воспользуемся коллекцией Borders объекта Table - она позволяет работать с границами таблицы. Параметр OutsideLineStyle позволяет задавать тип линий внешней границы таблицы. Здесь мы установили тип линии wdLineStyleTriple - это тройная линия. Аналогично, с помощью параметра InsideLineStyle мы сделали внутренние линии таблицы одинарными ( wdLineStyleSingle ).

    10.6.10. Omaths - математические формулы

    Свойство OMaths возвращает коллекцию OMaths, которая содержит математические формулы, хранящиеся в документе. Как и в случае с другими подобными коллекциями, OMaths имеет множество полезных свойств и методов. Давайте рассмотрим пример добавления в документ новой математической формулы (листинг 10.29). Этим кодом мы добавим новую формулу, преобразовав в нее выделенный фрагмент документа.

    Selection.OMaths.Add Selection.Range
        Selection.Range.OMaths(1).BuildUp

    Итак, для добавления нового объекта OMath в коллекцию OMath, мы используем метод Add. Главный параметр, который нужно передать методу Add - это объект типа Range, содержащий текст, который должен быть преобразован в формулу. В нашем случае это конструкция Selection.Range. Проще говоря, выделенный текст. Далее мы используем коллекцию OMaths для объекта Range текущего выделения. Она будет содержать все объекты OMath в выделении. Мы обращаемся к первому (и единственному) элементу коллекции и выполняем метод BuildUp - этот метод преобразует текст объекта в профессиональный математический вид.

    10.7. События объекта Document

    10-08-Documents События.docm - пример к п. 10.7.

    Работать с событиями документа гораздо проще, чем с событиями приложения. Чтобы создать обработчик события для документа нужно войти в редактор Visual Basic for Applications, выбрать в окне Project Explorer объект ThisDocument - этот объект представляет собой документ, в котором хранится VBA-проект. Далее, откроется окно редактирования кода, в нем, в списке объектов, нужно выбрать Document - этот объект символизирует документ, которому принадлежит проект, а в окне выбора события - событие, для которого мы хотим создать обработчик. Вот, как (рис. 10.3.) выглядит окно редактора после создания пустого обработчика события New для документа.

    (рис 10.3) Добавление обработчика события для документа (10_03.bmp)

    Событие New добавляется по умолчанию при выборе объекта Document в списке объектов редактора. Однако, это событие пригодно лишь для использования его в документах, которые планируется сохранить как шаблоны и использовать для автоматизации создания других документов. Ниже мы рассмотрим пример работы с шаблонами.

    New - одно из самых полезных и часто используемых событий документа. Помимо него можно отметить события Open, которое выполняется при открытии документа, и Close - оно выполняется при закрытии. Эти события работают и с обычными документами, а не только с шаблонами, как New.

    Open и Close используют для настройки проверок документа перед закрытием, для инициализации событий приложения ( Open ) и в других подобных случаях. Если вам нужно сделать что-то до начала редактирования документа или перед его закрытием - воспользуйтесь событиями Open и Close.

    10.8. Выводы

    В этой лекции мы рассмотрели особенности программной работы с документами MS Word. На очереди - работа с объектами, представляющими собой различные участки документов.

    Страницы:

    10.1. Коллекция Documents - открытые документы

    Коллекция Documents включает в себя открытые документы с их полезными методами и свойствами. Наряду с объектами Document, которые входят в коллекцию, здесь мы подробнее рассмотрим уже известный вам объект ActiveDocument,

    ActiveDocument имеет те же свойства и методы, что и любой Document - объект, однако, часто объектом ActiveDocument удобнее пользоваться.

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

    Для начала давайте рассмотрим свойства и методы коллекции, а потом займемся объектом Document.

    10.2. Методы коллекции Documents

    10.2.1. Add - создаем новый документ

    Этот метод добавляет новый объект Document в коллекцию Documents - то есть создает новый документ. Его можно использовать так (листинг 10.1.):

    Documents.Add

    При выполнении такого кода будет создан новый пустой документ на основе шаблона Normal. Чтобы ссылка на созданный документ была присвоена переменной, можете воспользоваться такой конструкцией (листинг 10.2.):

    Dim obj_NewDoc As Word.Document
        Set obj_NewDoc = Application.Documents.Add

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

    Метод Add может принимать несколько необязательных параметров. Полный вызов метода выглядит так:

    Documents.Add (Template, NewTemplate, DocumentType, Visible)

    Template (Шаблон) - отвечает за шаблон, который будет использован при создании файла. По умолчанию это Normal.dotm.

    NewTemplate (Новый шаблон) - если этот параметр установлен в True - файл будет обрабатываться как шаблон. По умолчанию установлен в False.

    DocumentType (Тип документа) - очень полезный параметр, который позволяет создавать документы различных типов. На тип документа указывает одна из констант, в частности, по умолчанию это wdNewBlankDocument - то есть пустой документ. Так же этот параметр может принимать значения wdNewEmailMessage (Почтовое сообщение), wdNewFrameset (Документ с рамками - такие используются при создании WEB-страниц), wdNewWebPage (WEB-страница).

    Visible (Видимость) - по умолчанию установлен в True - то есть создаваемый документ видим для пользователя. Если вы хотите, сначала сформировать новый документ, а уже потом показать его пользователю - установите это свойство в False, а после окончания формирования документа - воспользуйтесь свойством Visible созданного документа, чтобы отобразить его.

    10.2.2. Open - открываем документы

    Метод Open используется для открытия существующих файлов, возвращая объект типа Document. Файл, имя которого задано при вызове метода, открывается и добавляется в коллекцию Documents. Метод может принимать множество параметров, однако основной - это FileName, который и задает имя открываемого файла.

    Например, для открытия файла 1.docm, расположенного в корневом каталоги диска С, можно воспользоваться кодом из листинга 10.3.

    Documents.Open FileName:="C:\1.docm"

    10.2.3. Close - закрываем все документы

    Метод Close используется для закрытия всех открытых документов. Применяют его достаточно редко - удобнее закрывать каждый конкретный документ по отдельности. При вызове метода без параметров система задаст вопрос о сохранении документов, которые были изменены (листинг 10.4.).

    Documents.Close

    Полный вызов метода выглядит так:

    Documents.Close(SaveChanges, OriginalFormat, RouteDocument)

    Среди параметров для нас наибольший интерес представляют первых два.

    SaveChanges (Сохранить изменения) отвечает за сохранение изменений. По умолчанию он установлен в wdPromptToSaveChanges (Вывести запрос о сохранении), так же он может быть установлен в wdDoNotSaveChanges (Не сохранять изменения) и wdSaveChanges (Сохранить изменения). Как видите, с помощью параметра wdSaveChanges можно организовать удобное и быстрое закрытие множества документов с сохранением изменений

    OriginalFormat (Формат) - отвечает за формат сохраняемого документа. Может принимать различные значения: wdOriginalDocumentFormat (Оригинальный формат документа), wdPromptUser (Запросить формат у пользователя), wdWordDocument (Документ Word).

    Вот как выглядит вызов метода Close, который сохраняет все открытые документы и закрывает их (листинг 10.5.)

    Documents.Close (wdSaveChanges)

    Учтите - если какие-то из документов сохраняются в первый раз - вы получите запрос об имени документа.

    10.2.4. Item - обращаемся к отдельным документам

    10-01-Item.docm - пример к п. 10.2.4.

    Метод Item позволяет обращаться к открытым документам (то есть - к объектам Document ), используя их индексы или имена. Нумерация документов начинается с единицы. Чтобы узнать общее количество открытых документов, можно воспользоваться свойством Documents.Count.

    Например, с помощью нижеприведенного кода из листинга 10.6 мы поочередно выводим имена открытых документов с указанием номера документа в коллекции:

    For i = 1 To Documents.Count
        MsgBox (Documents.Item(i).Name  _
        " - документ номер "  i)
    Next i

    Очевидно, что свойство Count коллекции Documents позволяет узнать количество открытых документов, а свойство Name объекта Item(i) содержит имя документа с индексом i.

    На рис. 10.1 вы можете видеть одно из окон с сообщением об имени и номере документа.

    (рис 10.1) Окно сообщения об имени и номере документа

    К документам в коллекции Documents можно обращаться и по именам. Также, при обращении к документу необязательно напрямую указывать метод Item - в листинге 10.7 вы можете видеть различные варианты обращения к документу.

    MsgBox Documents("Мой документ.docx").Name
       MsgBox Documents.Item("Мой документ.docx").Name
       MsgBox Documents(1).Name

    10.2.5. Save - сохранение всех документов

    Метод Save сохраняет все документы коллекции. Если документ сохраняется впервые - будет выведено окно с запросом имени файла. В листинге 10.8 приведен пример вызова метода.

    Documents.Save

    10.3. Свойства коллекции Documents

    Среди свойств коллекции Documents нас будет интересовать лишь одно - Count. Это свойство позволяет узнать количество элементов в коллекции Documents, то есть - количество открытых документов. В листинге 10.9 мы выводим в окне сообщения количество открытых документов

    MsgBox ("Количество открытых документов: "  _
        Documents.Count)

    10.4. Объект Document

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

    10.5. Методы объекта Document

    10.5.1. Activate - сделаем документ активным

    Позволяет сделать документ активным. Например, это может понадобиться для редактирования документа.

    Например, код из листинга 10.10 активирует первый документ среди открытых документов.

    Dim obj_Doc As Document
    Set obj_Doc = Documents.Item(1)
    obj_Doc.Activate

    10.5.2. Close - закрыть документ

    Метод Close закрывает документ. Например, код из листинга 10.11 позволяет закрыть документ, из которого он запущен.

    ThisDocument.Close

    Метод можно вызывать с параметрами. В частности, полезен параметр SaveChanges, предназначенный для настройки автоматического сохранения документа. Если присвоить ему значение wdSaveChanges - документ будет сохранен при закрытии. Например, код из листинга 10.12 по очереди закрывает каждый из открытых документов.

    Dim obj_Doc As Document
    For Each obj_Doc In Documents
        obj_Doc.Close SaveChanges:=wdSaveChanges
    Next

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

    10.5.3. ComputeStatistics - статистика документа

    10-02-Статистика документа.docm - пример к п. 10.5.3

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

    ComputeStatistics(Statistic, IncludeFootnotesAndEndnotes)

    Параметр Statistic позволяет задавать тип получаемой статистики. Он может принимать значения типа wdStatistic - константы, описание которых приведено ниже:

  • wdStatisticCharacters -количество символов без пробелов
  • wdStatisticCharactersWithSliaces - количество символов, включая пробелы
  • wdStatisticLines - количество строк
  • wdStatisticPages - количество страниц
  • wdStatisticParagraphs - количество абзацев
  • wdStatisticWords - количество слов
  • Параметр IncludeFootnotesAndEndnotes позволяет указать, учитывать ли при подсчете статистики сноски. Установленный в значение True, включает сноски в подсчет статистики, в False - исключает.

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

    Dim num_Stat
        num_Stat = ActiveDocument.ComputeStatistics _
        (wdStatisticCharacters, True)
        MsgBox ("В документе " + Str(num_Stat) + _
        " символов без пробелов, включая сноски")

    10.5.4. FitToPages - уменьшить размер текста на одну страницу

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

    10.5.5. GoTo - перемещение по документу

    10-03-GoTo.docm - пример к п. 10.5.5.

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

    GoTo(What, Which, Count, Name)

    What - тип части документа, на которую осуществляется переход. Например, среди них есть такие элементы:

  • wdGoToBookmark - закладка (пожалуй, наиболее полезный элемент)
  • wdGoToHeading - заголовок
  • wdGoToLine - строка
  • wdGoToObject - объект
  • wdGoToPage - страница
  • Which - направление перемещения.

  • wdGoToAbsolute - перемещение в абсолютных единицах измерения
  • wdGoToFirst - перемещение к первому элементу
  • wdGoToLast -перемещение к последнему элементу
  • wdGoToNext - переход на следующий элемент
  • wdGoToPrevious - переход на предыдущий элемент
  • wdGoToRelative - перемещение относительно текущего элемента
  • Count - номер элемента в документе. Этот параметр часто опускают, так как переход осуществляется с использованием других установок, в частности - параметра Which.

    Name - имя элемента, на который осуществляется переход. Например, имя может быть у закладки.

    С помощью листинга 10.14. мы можем перейти к первому заголовку в файле и добавить в его начало слово "Глава"

    Dim obj_Range As Range
    Set obj_Range = Application.Documents. _
    Item(1).GoTo(wdGoToHeading, wdGoToFirst)
    obj_Range.Text = "Глава " + obj_Range.Text

    10.5.6. Range - область документа

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

    10.5.7. Redo, Undo - отмена изменений

    Эти методы позволяют отменить последнее изменение ( Redo ) и вернуть отмененное изменение ( Undo ).

    10.5.8. RemoveDocumentInformation - удаляем персональную информацию из документа

    Позволяет удалить из документа различную персональную информацию. Например - данные о создателе документа и т.д. Метод может принимать параметр, который определяет, что именно следует удалять. На практике самым полезным является параметр .

    10.5.9. Save - сохранение файлов

    Сохраняет документ. Обычно применяют без параметров, хотя полезен может быть параметр NoPrompt. Установленный в True, предписывает MS Word сохранять файл без дополнительных вопросов пользователю.

    Обычно для сохранения файлов с определенными параметрами используют метод SaveAs.

    10.5.10. SaveAs - тонкое управление сохранением

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

    FileName - задает имя файла

    FileFormat - формат файла. Здесь могут быть использованы значения из перечисления wdSaveFormat. В частности, для сохранения документа в формате по умолчанию (.docx) надо использовать wdFormatDocumentDefault. Для сохранения документа в формате Word 97 - wdFormatDocument97, для получения HTML-файла - wdFormatHTML.

    10.5.11. Select - выделяем содержимое документа

    Выделяет все содержимое документа. После этого с документом можно работать, используя средства объекта Selection.

    10.5.12. UndoClear - очистить историю изменений

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

    10.6. Свойства объекта Document

    10.6.1. Application - приложение документа

    Это свойство позволяет получить объект приложения документа. Вы можете подумать, что это - ошибка, что, наоборот, объект документа содержится в объекте приложения. Однако, ошибки нет. Это свойство позволяет обращаться к приложению тогда, когда у нас нет ссылки на него, а есть лишь ссылка на документ. Например, код в листинге 10.15 позволяет скрыть окно Microsoft Word вместе с окном документа, используя свойство Visible объекта Application.

    ThisDocument.Application.Visible = False

    10.6.2. AttachedTemplate - присоединенный шаблон

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

    Например, такой листинг 10.16. позволяет вывести имя присоединенного шаблона и путь к нему:

    Dim obj_Templ As Template
        Set obj_Templ = ActiveDocument.AttachedTemplate
        MsgBox ("Имя шаблона: "  obj_Templ.Name  _
        ", путь к шаблону: "  obj_Templ.Path)

    Здесь мы сначала объявили новую переменную типа Template, потом присвоили ей ссылку на шаблон, присоединенный к активному документу, а потом воспользовались свойствами Name и Path шаблона, чтобы вывести информацию о нем.

    Листинг 10.17 позволяет присоединить к документу шаблон MyTemplate.dotm, расположенный на диске C.

    ActiveDocument.AttachedTemplate = "C:\MyTemplate.dotm"

    10.6.3. Bookmarks - закладки

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

    10.6.4. Characters, Words, Sentences, Paragraphs и другие

    10-04-Символы.docm - пример к п. 10.6.4.

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

  • Characters (Символы) - возвращает одноименную коллекцию, каждый объект которой представляет собой отдельный символ в документе. Каждый объект коллекции Characters представляет собой диапазон ( Range ), содержащий один символ
  • Words (Слова) - то же самое, но уже для слов.
  • Sentences (Предложения) - то же самое для предложений.
  • Paragraphs (Абзацы) - коллекция абзацев документа.
  • Помимо этих коллекций документ может содержать и другие подобные. В частности, следующие:
  • Hyperlinks - гиперссылки. При добавлении гиперссылки обратите внимание на то, что метод Add использует объект привязки гиперссылки - Anchor (Якорь) - им может быть, например, графический или текстовый элемент.
  • Indexes - индексы.
  • InlineShapes, Shapes - фигуры, графические элементы
  • Lists - списки.
  • OMaths - формулы.
  • Sections - разделы.
  • Tables - таблицы.
  • Работа со всеми этими коллекциями схожа. Давайте рассмотрим ее на примере коллекции Characters, которую, как уже было сказано, можно использовать для работы с отдельными символами документа. Работу с некоторыми другими коллекциями мы рассмотрим ниже.

    Листинг 10.18 позволяет вывести в окне сообщения информацию о количестве символов в документе (включая пробелы).

    MsgBox ("Количество символов: "  _
        ActiveDocument.Characters.Count)

    С помощью метода Item коллекции, мы можем получить доступ к каждому символу документа. Например, с помощью этого метода можно проводить различные статистические подсчеты. листинг 10.19. позволяет узнать, сколько раз в документе использована буква "ф" в верхнем и нижнем регистре.

    Dim var_Fcount
        var_Fcount = 0
        For i = 1 To ActiveDocument.Characters.Count
            If ActiveDocument.Characters.Item(i) = "ф" Or _
            ActiveDocument.Characters.Item(i) = "Ф" Then _
            var_Fcount = var_Fcount + 1
        Next i
        MsgBox ("Количество букв 'Ф' в документе: "  _
        var_Fcount)

    Листинг 10.20 позволяет заменить букву "ё" в верхнем и нижнем регистре на "е".

    Dim obj_D As Document
        Set obj_D = ActiveDocument
        For i = 1 To obj_D.Characters.Count
            If obj_D.Characters.Item(i) = "ё" _
            Then obj_D.Characters.Item(i) = "е"
            If obj_D.Characters.Item(i) = "Ё" _
            Then obj_D.Characters.Item(i) = "Е"
        Next i

    В листинге 10.21 вы можете найти программу, которая "переворачивает" весь текст в документе - меняет последний символ с первым, второй - с предпоследним и так далее.

    Dim obj_D As Document
        Dim str_Chr As String
        Dim var_Count As Variant
        Set obj_D = Documents.Add
        obj_D.Range.Text = "Привет!"
        var_Count = obj_D.Characters.Count
        For i = 1 To var_Count \ 2
            str_Chr = obj_D.Characters.Item(i)
            obj_D.Characters.Item(i) = _
            obj_D.Characters.Item(var_Count - i + 1)
            obj_D.Characters.Item(var_Count - i + 1) = _
            str_Chr
        Next i

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

    Далее создаем новый документ и добавляем в него текст "Привет" с помощью свойства Text объекта Range. Именно этот текст мы и будем переворачивать.

    Итак, мы используем цикл длительностью, равной количеству символов в документе, деленному на 2, причем обратите внимание на оператор деления. Это - целочисленное деление, то есть для четного числа символов в обмене будут участвовать все символы, а для нечетного - один, "центральный" символ останется на своем месте.

    В цикле мы сначала присваиваем i -й символ переменной, потом присваиваем i -му символу противоположный ему символ, а в конце - противоположному символу - символ, хранящийся в переменной. Обратите внимание на алгоритм расчета противоположного символа. Var_Count - i + 1 дает нам последний символ при i = 1, то есть - для первого символа и т.д. В этом несложно убедиться путем расчетов. Например, если в тексте 10 символов, то для обмена с первым символом ( i = 1) мы получим последний символ (10-1+1=10), для второго ( i =2) - девятый (10-2+1=9) и т.д.

    10.6.5. Content - "чистый" текст документа

    10-05-Content.docm - пример к п. 10.6.5.

    Свойство документа Content возвращает объект Range - текст документа без сносок, колонтитулов и т.д.

    В листинге 10.22 вы можете найти пример использования свойства Content для настройки шрифта документа.

    Dim obj_C As Range
        Set obj_C = ActiveDocument.Content
        With obj_C.Font
            .Name = "Arial"
            .Size = 12
            .Spacing = 1.5
        End With

    В этом коде мы объявили объектную переменную типа Range, связали с ней объект Range, возвращаемый свойством Content активного документа, после чего, воспользовавшись свойством Font объекта Range, установили гарнитуру ( Name ) шрифта Arial, размер ( Size ) - 12 пунктов и расстояние между символами в 1.5 пункта.

    Чтобы записать текст документа в строковую переменную, можно воспользоваться кодом листинга 10.23.

    Dim str_Text As String
        str_Text = ActiveDocument.Content.Text

    Cвойство Text объекта Range возвращает текст объекта. Записав текст в переменную, мы сможем работать с ней средствами VBA.

    10.6.6. Endnotes, Footnotes - сноски

    10-06-Сноски.docm - пример к п. 10.6.6.

    Эти свойства возвращают, соответственно, коллекцию Endnotes и Footnotes. В коллекции Endnotes находятся объекты Endnote - то есть концевые ссылки - ссылки, которые расположены в конце документа. В коллекции Footnotes расположены объекты Footnote - обычные ссылки, которые расположены в конце страницы.

    Давайте рассмотрим работу с этими объектами на примере Footnotes. Работа с Endnotes аналогична работе с Footnotes.

    Добавить в документ новую ссылку можно с помощью метода Add коллекции Footnotes.

    Полный вызов метода Add выглядит так:

  • ActiveDocument.Footnotes.Add(Range, Reference, Text)
  • Range - область текста, для которой вставляется сноска.
  • Reference - определяет символ сноски. По умолчанию используется автоматическая нумерация сносок.
  • Text - текст сноски.
  • В листинге 10.24. вы можете видеть код, добавляющий сноску для выделенного фрагмента текста (как правило, выделяют слово):

    ActiveDocument.Footnotes.Add _ 
        Range:=Selection.Range, _
        Text:="Новая сноска!"

    Свойство Count коллекции Footnotes позволяет узнать количество ссылок в документе.

    Чтобы обращаться к отдельным сноскам (объектам Footnote ), можно пользоваться либо их индексами в коллекции Footnotes, либо - оператором For Each - Next.

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

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

    В листинге 10.25 приведен пример форматирования сносок и ссылок на них.

    Dim obj_D As Document
        Dim obj_Footnote As Footnote
        Set obj_D = ActiveDocument
        'Форматируем сноски
        For Each obj_Footnote In obj_D.Footnotes
            obj_Footnote.Range.Font.Size = 11
        Next
        'Форматируем знаки-ссылки на сноски
        For i = 1 To obj_D.Footnotes.Count
            obj_D.Footnotes.Item(i).Reference _
            .Font.Color = wdColorRed
        Next i

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

    Далее, с помощью цикла For-Next мы обходим все ссылки на сноски в тексте и делаем цвет их шрифта красным.

    Чтобы удалить сноску, можно воспользоваться методом Delete объекта Footnote.

    Узнать номер сноски в коллекции Footnotes можно, используя свойство Index. Например, код листинга 10.26 позволяет вывести поочередно все сноски с их номерами в окне сообщения.

    Dim obj_D As Document
        Dim obj_Footnote As Footnote
        Set obj_D = ActiveDocument
        'Выводим информацию о сносках
        For Each obj_Footnote In obj_D.Footnotes
          MsgBox ("Номер сноски: "  obj_Footnote.Index  _
          vbCrLf  "Текст сноски: "  obj_Footnote.Range.Text)
        Next

    Константа vbCrLf заменяет собой знак перевода строки, в итоге при выполнении этого кода для каждой сноски будет выведено такое окно (рис. 10.2.).

    (рис 10.2) Информация о сносках

    10.6.7. FullName, Name, Path - пути и имена

    Свойство FullName возвращает строку, содержащую полное имя документа - то есть полный путь к документу и его имя.

    MsgBox (ActiveDocument.FullName)

    Свойство Name возвращает имя документа без пути, а Path - путь без имени.

    10.6.8. Saved - сохранен или нет

    Возвращает True если документ не изменялся после последнего сохранения.

    10.6.9. Tables - работа с таблицами

    10-07-Таблицы.docm - пример к п. 10.6.9.

    Свойство возвращает коллекцию Tables (Таблицы), которая содержит объекты Table - таблицы, которые имеются в документе. Работа с таблицами похожа на работу с другими объектами документов.

    Например, чтобы добавить в документ новую таблицу, нужно воспользоваться методом Add коллекции Tables. Рассмотрим пример (листинг 10.28.). Добавим в позицию курсора таблицу, состоящую из 3-х строк и 4-х столбцов.

    Dim obj_Table As Table
    Set obj_Table = _
    ActiveDocument.Tables.Add(Range:=Selection.Range, _
    NumRows:=3, NumColumns:=4)
    With obj_Table
        .Borders.OutsideLineStyle = wdLineStyleTriple
        .Borders.InsideLineStyle = wdLineStyleSingle
    End With

    Здесь мы сначала объявляем объектную переменную типа Table - для хранения ссылки на таблицу. Далее - при помощи метода Add коллекции Tables добавляем в документ новую таблицу, состоящую из 3-х строк и 4-х столбцов. Обратите внимание на параметр Range метода Add. Он задает позицию в документе, куда будет вставлена новая таблица. Здесь мы приравняли ему такое значение: Selection.Range. Ниже мы будем говорить и об объекте Selection, и о Range, однако отметим, что выражение Selection.Range можно передать обычным языком как "Текущее выделение". Значит, таблица будет вставлена в выделенную область документа, либо, если область документа явно не выделена - туда, где в момент запуска макроса установлен курсор.

    Добавленная таблица не очень хорошо заметна в документе - она состоит из невидимых линий. Поэтому мы настраиваем отображение линий таблицы с помощью блока With - End With для переменной obj_Table. Воспользуемся коллекцией Borders объекта Table - она позволяет работать с границами таблицы. Параметр OutsideLineStyle позволяет задавать тип линий внешней границы таблицы. Здесь мы установили тип линии wdLineStyleTriple - это тройная линия. Аналогично, с помощью параметра InsideLineStyle мы сделали внутренние линии таблицы одинарными ( wdLineStyleSingle ).

    10.6.10. Omaths - математические формулы

    Свойство OMaths возвращает коллекцию OMaths, которая содержит математические формулы, хранящиеся в документе. Как и в случае с другими подобными коллекциями, OMaths имеет множество полезных свойств и методов. Давайте рассмотрим пример добавления в документ новой математической формулы (листинг 10.29). Этим кодом мы добавим новую формулу, преобразовав в нее выделенный фрагмент документа.

    Selection.OMaths.Add Selection.Range
        Selection.Range.OMaths(1).BuildUp

    Итак, для добавления нового объекта OMath в коллекцию OMath, мы используем метод Add. Главный параметр, который нужно передать методу Add - это объект типа Range, содержащий текст, который должен быть преобразован в формулу. В нашем случае это конструкция Selection.Range. Проще говоря, выделенный текст. Далее мы используем коллекцию OMaths для объекта Range текущего выделения. Она будет содержать все объекты OMath в выделении. Мы обращаемся к первому (и единственному) элементу коллекции и выполняем метод BuildUp - этот метод преобразует текст объекта в профессиональный математический вид.

    10.7. События объекта Document

    10-08-Documents События.docm - пример к п. 10.7.

    Работать с событиями документа гораздо проще, чем с событиями приложения. Чтобы создать обработчик события для документа нужно войти в редактор Visual Basic for Applications, выбрать в окне Project Explorer объект ThisDocument - этот объект представляет собой документ, в котором хранится VBA-проект. Далее, откроется окно редактирования кода, в нем, в списке объектов, нужно выбрать Document - этот объект символизирует документ, которому принадлежит проект, а в окне выбора события - событие, для которого мы хотим создать обработчик. Вот, как (рис. 10.3.) выглядит окно редактора после создания пустого обработчика события New для документа.

    (рис 10.3) Добавление обработчика события для документа (10_03.bmp)

    Событие New добавляется по умолчанию при выборе объекта Document в списке объектов редактора. Однако, это событие пригодно лишь для использования его в документах, которые планируется сохранить как шаблоны и использовать для автоматизации создания других документов. Ниже мы рассмотрим пример работы с шаблонами.

    New - одно из самых полезных и часто используемых событий документа. Помимо него можно отметить события Open, которое выполняется при открытии документа, и Close - оно выполняется при закрытии. Эти события работают и с обычными документами, а не только с шаблонами, как New.

    Open и Close используют для настройки проверок документа перед закрытием, для инициализации событий приложения ( Open ) и в других подобных случаях. Если вам нужно сделать что-то до начала редактирования документа или перед его закрытием - воспользуйтесь событиями Open и Close.

    10.8. Выводы

    В этой лекции мы рассмотрели особенности программной работы с документами MS Word. На очереди - работа с объектами, представляющими собой различные участки документов.

    Вернуться к учебному плану