Листинг 2. Выделение поддокумента из главного документа

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

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

Что же такое раздел, как и для чего он создается? Раздел в документе всегда можно создать вручную, для чего достаточно вставить символ разрыва документа – Section break, вызвав пункт Break из меню Insert. Символ разрыва может иметь разный вид – в зависимости от того, какая информация следует за ним – четная или нечетная страница, столбец, или другой вид раздела. Таким образом, можно вручную разбить документ на страницы, вставляя подходящие символы разрыва в нужных местах. В этом случае разделы будут выступать в роли страниц документа. Иногда разделы создаются автоматически, например, при представлении некоторой части документа в виде нескольких столбцов. Часть документа, представленная в виде нескольких столбцов, – это отдельный раздел. При программной работе разделы можно создавать двумя способами: используя метод InsertBreak, которым обладают объекты Range и Selection, или вызывая метод Add коллекции Sections.

Метод Add(Range, Start) имеет два параметра:

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

· Start задает тип символа разрыва.

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

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

Листинг 1. Разбивка документа на разделы

Public Sub WorkWithSections() 'В документе DocThree создаются разделы документа 'Вначале документ не имеет разделов Dim sect As Section Dim myr As Range Documents("Docthгее").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

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

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

Public Sub WorkWithSubDoc() ‘Работа с поддокументами Dim DocPath As String Dim myr As Range ‘Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthrее").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 WithEnd Sub