Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 2:

Начнем с объектов Office 2000

Коллекция Sections

Свойство Sections, возвращающее коллекцию разделов, имеют объекты класса Documents, Selection, Range. Разделение документа на разделы позволяет придать документу подходящую структуру. Обычно раздел - довольно крупная единица текста в отличие от абзаца. Например, если документ представляет книгу, то каждый ее параграф или глава может быть выделена в отдельный раздел. При установке разделов вручную из меню Insert выбирается пункт Break, позволяющий закончить предыдущий раздел и начать новый. Раздел кончается специальным символом прерывания определенного типа. В зависимости от типа символа прерывания новый раздел может начинаться:

  • на той же странице;
  • на следующей странице;
  • на следующей четной странице;
  • на следующей нечетной странице.

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

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

Application, Count, Creator, Parent, First, Last.

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

Add(Range, Start)

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

wdSectionNewPage, wdSectionContinuous, wdSectionEvenPage, wdSectionOddPage, wdSectionNewColumn

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

Для удаления раздела из коллекции может быть использован метод Delete объектов Selection и Range.

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

Public Sub WorkWithSecAndPar()
'Работа с разделами и абзацами
'Добавление новой книги
Documents.Add
Documents(1).Activate
With ActiveDocument
    'Вставка двух разделов в документ
    'Раздел начнется с нечетной страницы
    .Sections.Add Start:=wdSectionOddPage
    .Sections.Add
    'Вставка абзаца во второй раздел
    .Sections(2).Range.Paragraphs.Add
    .Sections(2).PageSetup.LeftMargin = 3
    .Sections(2).Range.Style = "Heading 1"
    .Sections(2).Range.Font.Name = "Arial"
    .Sections(2).Range.Paragraphs(1).Range.InsertBefore ("Лекция 1")
    'Вставка нового раздела и абзаца
    .Sections.Add Start:=wdSectionNewPage
    .Sections.Last.Range.Paragraphs.Last.Range.InsertBefore ("Параграф 1")
    .Sections.Last.Range.Paragraphs.Add
    'Вставка нового раздела и абзаца
    .Sections.Add Start:=wdSectionNewPage
    .Sections.Last.Range.Paragraphs.Last.Range.InsertBefore ("Параграф 2")
    .Sections.Last.Range.Paragraphs.Add
    'Вставка нового раздела в конец документа
    'Раздел начнется с нечетной страницы
    .Sections.Add Start:=wdSectionOddPage
    .Sections.Last.PageSetup.LeftMargin = 23
    .Sections.Last.Range.Font.Name = "TimesNewRoman"
    'Вставка абзаца
    .Sections.Last.Range.Paragraphs(1).Range.InsertBefore ("Лекция 2")
    .Sections.Last.Range.Paragraphs.Add
    Debug.Print "Число разделов документа =", .Sections.Count
    Debug.Print "Число абзацев документа =", .Paragraphs.Count
    'Удаление раздела выполняет метод объекта Range
    .Sections(1).Range.Delete
    Debug.Print "Число разделов документа =", .Sections.Count
End With

End Sub
1.6.

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

Sections.Last.Range.Paragraphs(1).Range.InsertBefore ("Лекция 2")
  • Свойство Sections активного документа возвращает объект Sections, задающий коллекцию разделов этого документа.
  • Свойство Last объекта возвращает объект Section, задающий последний раздел в этой коллекции.
  • Свойство Range возвращает объект Range, связанный с данным разделом. Теперь становятся доступны методы и свойства объекта, в частности свойство Paragraphs, которым объект Section не обладает.
  • Вызов Paragraphs(1) возвращает объект класса Paragraph, задающий первый абзац из коллекции абзацев данного раздела. Заметьте: опущен метод по умолчанию Item, так что запись Paragraphs(1) является краткой формой записи Paragraphs. Item (1)
  • И снова мы получаем объект Range, теперь уже связанный с абзацем.
  • На последнем шаге вызывается метод InsertBefore объекта Range, позволяющий добавить в начало абзаца текст, заданный аргументом метода. В нашем случае - "Документы и проекты" .
Коллекции Characters, Words, Sentences

Свойства Characters, Words, Sentences возвращающие коллекции символов, слов или предложений, имеют объекты класса Documents, Selection, Range. Все эти коллекции устроены довольно просто. Они имеют известные нам свойства:

Application, Count, Creator, First, Last, Parent

и единственный метод Item(Index). Этот метод для всех коллекций возвращает объект Range, позволяющий работать как с единственным символом, так и с совокупностью символов, соответствующей слову или предложению. Добавление в коллекцию и удаление из нее элементов осуществляется методами объекта Range.

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

Коллекции и конструкция For Each … Next

При работе с коллекциями довольно часто приходится организовывать цикл по всем элементам коллекции. До сих пор во всех наших примерах мы использовали обычные средства - цикл " For ", где количество шагов цикла определялось свойством Count (его имеет каждая коллекция). Наша конструкция выглядела так:

With <объект>
	For i = 1 To .Count
	.Item(i) 	' Доступ к i-му объекту и работа с ним
	Next i
End With

VBA предлагает специальную конструкцию " For Each " для организации подобных циклов. Синтаксис конструкции таков:

For Each <Элемент> In <Группа>
[<Операторы>]
[Exit For]
[<Операторы>]
Next [<Элемент>]

где:

<Группа> - имя объекта-коллекции или массива.

<Элемент> - объект (переменная), совпадающий по классу с элементами коллекции, или имеющий тип Variant. Для массивов допустим только тип Variant. Нормально цикл заканчивается, когда переменная цикла получила все возможные значения и коллекция исчерпана. Но можно организовать досрочный выход. Для этого используется внутренняя конструкция Exit For. Обычно она помещается в Then -ветвь оператора If. Если условие выхода выполняется, следом выполняются Exit For и следующие за ним операторы, требуемые для корректного завершения цикла. После чего управление покидает цикл.

Цикл For Each не может использоваться для массивов с элементами, определенными пользователем. Последнее объясняется тем, что переменная типа Variant не может принимать пользовательский тип.

Приведем пример использования "старой" и "новой" конструкций:

With Documents
	For i = 1 To .Count		For Each doc In Documents
		Debug.Print 	.Item(i)		Debug.Print 	doc
	Next i 				Next doc
End With

Преимущество "новой" очевидно: удобнее иметь сам элемент doc вместо индекса элемента i. Особенно это может быть важно, когда в ходе цикла приходится многократно обращаться к элементу doc.

При работе с коллекциями используйте, как правило, конструкцию For Each. Кроме всего прочего, она выполняется намного эффективнее по времени исполнения.

Объекты Range

Роль коллекций во всех приложениях Office 2000 велика. Если одновременно могут существовать несколько объектов (экземпляров) одного и того же класса, то существует и объединяющий их класс - коллекция, в которой собраны все экземпляры. Класс коллекция позволяет работать с последовательностью элементов - экземпляров класса.

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

Что определяет объект Range?

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

xlApp.Range("A1:A2") = 2
xlApp.Range("B1") = "=A1+A2"
xlApp.Range("B2") = "=A1*A2"

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

Метод Range

Ранее мы говорили, что объект класса Paragraph имеет свойство Range, иначе говоря, в него вложен объект Range., задающий последовательность символов данного абзаца. Объектов, имеющих свойство Range, немало. Это понятно, ведь не только с абзацами полезно связать диапазон, соответствующий объекту. При обращении к свойству Range таких объектов в качестве результата получаем соответствующий диапазон - ссылку на объект Range.

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

Function Range(Start, End) As Range

Он имеет два параметра: Start и End - и возвращает как результат объект класса Range.

Если объект Range уже построен, то значения его параметров Start и End можно переопределить, вызвав его метод SetRange, в котором можно задать новые значения этих параметров.

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

Public Sub WorkWithRange()
Dim myr As Range, myr1 As Range
Dim i As Byte
'Добавляем новый документ
Documents.Add
With ActiveDocument
'Добавляем 7 абзацев в текст созданного документа
    For i = 1 To 7
        .Paragraphs.Last.Range.Text = "Абзац " & i
        .Paragraphs.Add
    Next i
'Используется свойство Range
    Set myr = .Paragraphs(1).Range
'Выделен первый абзац
    myr.Select
'Новый объект myr1 задает пустой объект - позицию курсора
'В правой части вызывается метод Range
    Set myr1 = ActiveDocument.Range(Start:=myr.Start, End:=myr.Start)
    myr1.Select
'Теперь объект myr1 задает единственный символ -первый символ текста
'Здеесь использован метод SetRange
    myr1.SetRange Start:=myr1.Start, End:=myr1.End + 1
    myr1.Select
'Три абзаца с третьего по пятый выделяются курсивом
    myr1.SetRange Start:=.Paragraphs(3).Range.Start, End:=.Paragraphs(5).Range.End
    myr1.Font.Italic = True
    myr1.Select
End With
End Sub
1.7.
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.