Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 2724 / 260 | Оценка: 4.03 / 3.74 | Длительность: 19:48:00
Специальности: Программист, Менеджер
Лекция 1:

Word и его объекты

Лекция 1: 123456789101112 || Лекция 2 >
Списки в документах

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

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.

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

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

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

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

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

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

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

Конечно, также как и тексты, сноски, комментарии и исправления создаются, как правило, вручную. Тем не менее, часто приходится программно работать с этими объектами. Вот, например, типично возникающие задачи: собрать все комментарии данного автора, принять или отвергнуть все исправления, сделанные автором 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 позволяет указать автора сделанного комментария. Комментарий можно непосредственно просмотреть в тексте документа, установив курсор на метке комментария. Метод Show By выводит в окно специального вида все комментарии, выполненные автором, имя которого указано как аргумент метода.

Далее добавляются в документ сноски. И здесь объект 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. Документ, содержащий комментарии, сноски и правки
Гипертекстовый документ. Закладки и гиперссылки

Гипертекстом называется текст, содержащий ссылки. Конечно, настоящим гипертекстовым документом может быть только документ в электронной форме, поскольку в этом случае становится возможным непосредственный переход по ссылкам. Гипертекстовый документ перестает быть линейным текстом, читаемым от начала до конца. Порядок его чтения (работы с документом) определяется в момент просмотра документа и зависит от выбора гиперссылок лицом, работающим с документом. Когда я говорю о гипертекстовом документе, то применительно к документам 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.

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

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

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 при создании гиперссылок имеет больше параметров, чем при создании закладок. При создании закладки достаточно указать имя закладки и область, с ней связанную. При создании гиперссылки указывается область, связанная с гиперссылкой, точка отправления и точка назначения, заданная двумя параметрами. Параметр Add ress указывает имя документа, к которому будет осуществлен переход, а параметр 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, который позволяет организовать переходы от элемента к элементу уже рассмотренных нами коллекций таблицам, комментариям, страницам, разделам, элементам других коллекций, среди которых есть, конечно же, и закладки. Говоря о роли закладок, следует отметить, что они используются не только для организации гипертекстовых документов. Их роль велика и в документах типа справочников, где приходится осуществлять частый поиск внутри документа. Закладки позволяют создать систему индексов, ускоряя поиск. Всем хорошо знаком этот прием при работе с обычным словарем, когда делаются закладки на каждой из букв алфавита. Я не буду приводить сейчас примера реализации этой идеи.

Лекция 1: 123456789101112 || Лекция 2 >