PDA

Просмотр полной версии : VBA Word


romankoff
20.11.2002, 02:09
Подскажите, пжалса, как в VBA получить доступ к букве в тексте документа word.
Я нашел как вариант - Ch = ThisDocument.Characters(I).Text, но мне кажется это не оптимальный вариант ...
Заранее спасибо ...

MAX67
22.11.2002, 11:10
Доступ к конкретному символу через .Characters(I). это стандартный и вполне нормальный вариант.
Т.к. это свойство применимо к обьектам Document, Selection и Range то главное сначала получить подходящий Range обьект. Все зависит от того что ты хочешь сделать.

romankoff
22.11.2002, 19:12
Благодарю за комментарий ...
Мне необходимо провести сканирование документа для последующего парсирования. При использовании .Characters(I) в большом документе ближе к середине и концу наблюдаются характерные тормоза. Я пробовал использовать .Words(I) - ситуация таже ...

MAX67
23.11.2002, 00:25
сканирование документа для последующего парсирования
Чёто для меня это всеравно звучит расплывчато.
Если ты ищешь конкретный символ или форматирование, то кода работающего быстрее чем родной вордовский find-replace все равно не придумать. Как правило, получается эффективнее несколько раз прогнать глобальный find-replace, чем сделать все за один проход, но с доморощенными вложенными парсингами или циклами.

Наверное и сам знаешь, но всетаки приведу банальные примеры:
'заменяем все квадратные скобки на круглые
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "["
.Replacement.Text = "("
.Forward = True
.Wrap = wdFindContinue
.Replacement.ParagraphFormat.LeftIndent = RefIndent
End With
Selection.Find.Execute Replace:=wdReplaceAll

Тоже самое можно делать с учетом форматирования - шрифта, стиля, параграфа, языка и т.д. в соответсвие с расширенным диалогом Правка->Заменить

Если надо не только найти и заменить можно например использовать такую конструкцию:

'если находим "(или" и дальше по тексту в пределах 20ти символов есть закрывающая скобка, то выделяем и удоляем всю конструкцию.
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "(или"
.Forward = True
.Wrap = wdFindStop
End With
While Selection.Find.Execute = True
If Selection.MoveEndUntil(Cset:=")", Count:=20) <> 0 Then
Selection.MoveEnd Count:=1
Selection.Delete
End If
Selection.Collapse direction:=wdCollapseEnd
Wend
End Sub

Можно обрабатывать отдельно каждый параграф:

For Each prf In ActiveDocument.Paragraphs
If prf.LeftIndent = 0 Then
prf.Range.Characters(1).Case = wdLowerCase
prf.SpaceBefore = 6
prf.SpaceBeforeAuto = False
End If
Next
Не забывай что для свойств Paragraph и Sentence можно вызвать все причиндалы от Range через их свойсто Range.

Ну и не забывай отключать обновление экрана.
Application.ScreenUpdating = False
........
Application.ScreenUpdating = True