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