Тема: VBA Word
Показать сообщение отдельно
Старый 23.11.2002, 00:25     # 4
MAX67
Guest
 
Сообщения: n/a

Цитата:
сканирование документа для последующего парсирования
Чёто для меня это всеравно звучит расплывчато.
Если ты ищешь конкретный символ или форматирование, то кода работающего быстрее чем родной вордовский 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