Visual Basic 6. Руководство разработчика


Объекты, которые представляют текст


Базовым объектом для доступа к тексту в документах 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


Содержание раздела