Множественная замена

Автор Jelly, 29 января 2023, 01:10

Jelly

Приветствую!
Есть макрос такого типа:

Код
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "Moscow"
        .Replacement.Text = "Москва"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll


    With Selection.Find
        .Text = "Saratov"
        .Replacement.Text = "Саратов"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

    With Selection.Find
        .Text = "Perm"
        .Replacement.Text = "Пермь"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
[свернуть]

И так далее. Подобных конструкций в нем еще несколько десятков. Макрос выполняется на большом количестве файлов поочередно, работает небыстро. Есть ли вариант как-то его сократить, чтобы ускорить время выполнения?

Администратор

На первый взгляд нет - ничего ни убавить, ни прибавить - это уже так сделали разработчики Майкрософта.
Если только уменьшить диапазон поиска. Сейчас поиск в вашем коде происходит по всему документу, если текст надо менять только в заданных местах, то может быть будет быстрее: поиск будет вестись не по всему файлу, а только в указанном месте.

Jelly

Спасибо. То есть свойства вида

.Forward = True
.Wrap = wdFindAsk
.Format = Falsе
и т.д.,

которые одинаковы для всех случаев, нельзя прописать один раз,
а далее просто дать списком, что на что должно меняться?


Администратор

Сразу список передать нельзя в параметр Text, можно передать только одно значение.
Можно уменьшить количество кода, используя цикл, но на скорость это не повлияет: Ворд так же будет для каждого искомого значения просматривать весь текст.
Можно попробовать ускорить, если отключить обновление монитора, перейти в режим Черновик, сделать окно документа невидимым, но думаю, что это не сильно ускорит, т.к. время именно тратится на просмотр всего документа.