imho.ws |
![]() |
![]() |
![]() |
# 2 |
Guest
Сообщения: n/a
|
Доступ к конкретному символу через .Characters(I). это стандартный и вполне нормальный вариант.
Т.к. это свойство применимо к обьектам Document, Selection и Range то главное сначала получить подходящий Range обьект. Все зависит от того что ты хочешь сделать. |
![]() |
# 3 |
Guest
Сообщения: n/a
|
Благодарю за комментарий ...
Мне необходимо провести сканирование документа для последующего парсирования. При использовании .Characters(I) в большом документе ближе к середине и концу наблюдаются характерные тормоза. Я пробовал использовать .Words(I) - ситуация таже ... |
![]() |
# 4 | |
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 |
|