Объекты, которые представляют текст
Базовым объектом для доступа к тексту в документах Word является объект Range,
который представляет собой непрерывный сегмент текста. Чтобы извлечь некоторый текст из документа, можно воспользоваться методом Range объекта Document, который принимает в качестве параметров позиции начального и конечного символов в тексте. Синтаксически это выглядит так:
Document.Range(start, end)
Параметры start и end — два числовых значения. Непривычным является то, что первый символ документа имеет номер 0. Следующий оператор позволяет извлечь первые 100 символов документа, представленного объектной переменной Document.
Range 1 = Document.Range (0, 99)
Эти символы присваиваются объектной переменной Range). Переменная Range 1 может быть объявлена как вариантная, но ее также можно объявить как переменную типа Range:
Dim Range 1 As Range
В приведенных операторах перед использованием переменной Document ее необходимо установить, чтобы затем можно было сослаться на существующий объект:
Set Documenti = Documents(1)
Переменная
Document1 может быть объявлена как вариантная, но ее также можно объявить как переменную типа Document:
Dim Documenti As Document
Также можно заменить переменную Document1 на встроенный объект ActiveDocument,
который представляет активный документ. К выделенному тексту в активном документе можно обращаться, воспользовавшись следующим выражением:
Application.ActiveDocument.Selection
Слова, предложения и абзацы являются более значимыми элементами текста, нежели символы. Соответственно, объекты Word, Sentence и Paragraph более подходят для работы с текстом и, обычно, именно они используются при обращении к документам. Но эти объекты не поддерживают все свойства объекта Range. Впрочем, все эти элементы текста могут быть преобразованы в объект Range, обладающий свойством Range. Например, следующее выражение возвращает третий абзац в указанном документе как объект Range:
Document1.Paragraphs(3).Range
После этого можно обратиться к свойствам объекта
Range, чтобы обработать третий абзац.
Однако объект Paragraph не обладает ни свойством Font, ни методом Select. Чтобы изменить вид третьего абзаца в документе, необходимо сначала преобразовать абзац в объект Range:
Set Rangel = Documenti.Paragraphs (3).Range
Rangel.Font.Bold = True
Document1 — правильно объявленная переменная типа Document, a Rangel — правильно объявленная переменная типа Range. Впрочем, можно объединить оба оператора в один и избежать, тем самым, необходимости создания объектной переменной Rangel:
Document1.Paragraphs(3).Range.Font.Bold = True
С помощью приведенного ниже оператора можно выделить тот же параграф:
Document.Paragraphs(3).Range.Select
Как только абзац (или любой другой фрагмент текста) выделен, к нему можно применить все средства обработки (например, редактировать, перемещать в другое место, форматировать).
Наиболее часто используются два метода объекта Range: InsertAfter, с помощью которого можно вставить строку текста после указанного объекта Range, и InsertBefore, с помощью которого можно вставить строку текста перед указанным объектом Range. Следующие операторы позволяют вставить заголовок в начало документа и заключительный абзац в конец:
AppWord.ActiveDocument.Select
AppWord.ActiveDocument.Range.InsertBefore _
"This is the document's title"
'(Это заголовок документа)
AppWord.ActiveDocument.Range.InsertAfter
"This is the closing paragraph"
'(Это заключительный абзац)
С помощью метода Select
в объекте ActiveDocument можно выделить текст целиком. Преобразовав после этого выделенный текст в объект типа Range, можно применить к нему методы, присущие объекту соответствующего типа. Методы InsertBefore и InsertAfter позволяют поместить некоторый текст перед и после объекта Range.
VB6 в действии: проект WordVBA
Располагая информацией о методах и объектах, можно разработать программу, которая сможет открыть документ, поместить в него некоторый текст, форматировать
его, а затем сохранить в файле на диске. Начать следует с создания экземпляра Word и установления связи с ним. В этом проекте демонстрируются возможности:
• создания нового документа;
• вставки текста и его форматирования,
• подсчета количества абзацев, слов и символов в новом документе и вывода полученных результатов в окно сообщений (рис. 14.14).
Эти действия выполняются непосредственно из приложения Visual Basic, в то время как Word работает в фоновом режиме. Пользователь не видит окно Word (даже в виде значка на панели задач). Новый документ сохраняется в файле C:\SAMPLE.DOC, и позже его можно будет открыть в Word для редактирования.
Рис. 14.14. В проекте WordVBA демонстрируется создание и обработку DOC-файла из приложения Visual Basic.
Программа, обслуживающая кнопку Create DOC file, проста. Для работы с текстом используется свойство Paragraph объекта Document, чтобы управлять текстом (можно вставлять новые абзацы и работать с ними). Следует обратить внимание на то, как выполняется выравнивание первого абзаца текста с помощью свойства Alignment объекта Paragraph.
Программа 14.10. Кнопка Create DOC file
Private Sub Commandl_Click()
Dim thisDoc As Document
Dim thisRange As Range
Dim prnTime As Date
Dim breakLoop As Boolean
Me.Caption = "Creating document..."
' (Создание документа...)
Set thisDoc = WordApp.Documents.Add
thisDoc.Range.InsertBefore "Document Title" & vbCrLf & vbCrLf
' (Заголовок документа...)
Set thisRange = thisDoc.Paragraphs(1).Range
thisRange.Font.Bold = True
thisRange.Font.Size = 14
thisRange.ParagraphFormat.Alignment = wdAlignParagraphCenter
thisRange.InsertAfter "This sample document was created _
automatically with a Visual Basic application." _
& vbCrLf
' (Этот образец документа был создан
' автоматически приложением Visual Basic...)
thisRange.InsertAfter "You can enter additional text here" _
SvbCrLf
' (Сюда можно ввести текст...)
thisRange.InsertAfter vbCrLf & vbCrLf
thisRange.InsertAfter "This project was created for _
Mastering VB6"
' (Этот проект был создан для книги по VB6)
thisRange.InsertAfter "(Sybex, 1999) and was tested with _
Word 97 "
' ( (изд-ва Sybex, 1999) и был испытан с
' помощью Word 97.)
thisRange.InsertAfter vbCrLf
thisRange.InsertAfter "Your text follow"
' (Далее следует ваш текст)
thisRange InsertAfter Textl.Text
Me.Caption = "Saving document... " ' (Сохранение документа...) thisDoc.SaveAs "c:\sample.doc"
Me Caption = "Printing document..." ' (Печать документа...)
thisDoc.Printout True, True
prnTime = Time
breakLoop = False
While WordApp.BackgroundPrintingStatus <> 0 And Not breakLoop
If Minute(Time - prnTime) > 1 Then
Reply = MsgBox (" Word is taking too long to print." _
vbCrLf & "Do you want to quif" , vbYesNo)
'(Документ печатается слишком долго.. Будете ждать?)
If Reply = vbYes Then
breakLoop = True
Else
prnTime = Time
End If
End If
Wend
WordApp.Quit
MsgBox "Document saved and printed!"
' (Документ сохранен и распечатан!)
Command2.Enabled = True
Command3.Enabled = True
Me Caption = "Word VBA Demo"
End Sub
Кнопка Massage DOC File позволяет продемонстрировать работу с текстом в документе Word с помощью автоматизации OLE. Первоначальный текст содержит множество ненужных пробелов между словами. Чтобы заменить эти пробелы на одиночные (типичная задача при редактировании), можно воспользоваться диалоговым окном Find & Replace (Поиск и замена). Приложение WordVBA выполняет эту операцию, вызывая метод Find.
Для обращения к методу Find требуется указать множество параметров, большая часть которых является необязательными. Для приложения WordVBA необходимо определить строку, которую следует найти, и строку, на которую ее следует заменить. Поэтому надо указать, что программа должна отыскивать два последовательно расположенных пробела и заменять их одним пробелом. Но на этом процесс не закончится, поскольку в документе могут содержаться три последовательно расположенных пробела, а в результате выполнения указанной процедуры их количество будет уменьшено до двух. Поэтому операция Find & Replace (Поиск и замена) должна быть выполнена еще раз. Как только программа отыщет два последовательно расположенных пробела, операция замены будет выполнена еще раз.
Программа 14.11. Обработка документа
Word
Private Sub Command2 Click ()
Dim thisDoc As Document
Dim thisRange As Range
WordApp.Documents.Open ("c:\sample doc")
WordApp.Visible = False
Set thisDoc = WordApp.ActiveDocument
thisDoc.Content.Find.Execute FindText:="VB5", _
ReplaceWith:="VB6", Replace:=wdReplaceAll
While thisDoc.Content.Find.Execute(FindText:= " ", _
Wrap:=wdFindContinue)
thisDoc.Content.Find.Execute FindText:= " ", _
ReplaceWith:= " ", Replace:= wdReplaceAll, _
Wrap:=wdFindContinue
Wend
End Sub