Форум по VBA и MS Office

Word => Макросы в Word => Тема начата: Посетитель_20112025 от 13 ноября 2025, 01:17

Название: Замена длинного списка замен одним регулярным выражением
Отправлено: Посетитель_20112025 от 13 ноября 2025, 01:17
Имею довольно длинный список замен следующего вида:
Буква1 –> Замена1
Буква2 –> Замена2
Буква3 –> Замена3
. . .
Насколько я понимаю, нет никакой возможности объединить их в одну замену, но всё же решил спросить: вдруг есть какой-то хитрый лайфхак...
Название: Замена длинного списка замен одним регулярным выражением
Отправлено: Администратор от 13 ноября 2025, 12:59
В одну команду Find, которая бы делала все эти замены, - нет такой возможности объединить.

Единственное можно как-нибудь попробовать оптимизировать код: уменьшить код, ускорить код. Для этого нужно смотреть конкретную ситуацию, т.к. ситуаций может быть много разных.
Название: Замена длинного списка замен одним регулярным выражением
Отправлено: Посетитель_20112025 от 01 декабря 2025, 22:50
Я тут измерил время, которое отрабатывает такой цикл:

Спойлер
Dim i As Long
For i = 913 To 974
    .Execute FindText:=ChrW(i), ReplaceWith:="&#" + CStr(i) + ";", Replace:=wdReplaceAll
Next
For i = 7936 To 8194
    .Execute FindText:=ChrW(i), ReplaceWith:="&#" + CStr(i) + ";", Replace:=wdReplaceAll
Next
[свернуть]

Т.е. поиск/замена в общей сложности выполняются 319 раз. Так вот: на одной странице текста время выполнения составляет 9 секунд – и это при том, что реально ни одной замены не выполнялось, поскольку ни одного такого символа в тексте не было.

Эта задача легко бы решалась, если бы можно было использовать такую конструкцию:
Спойлер
.Execute FindText:="([список_букв])", ReplaceWith:="&#" + CStr(AscW(\1)) + ";", Replace:=wdReplaceAll
[свернуть]
Но, к сожалению, «\1» внутри функции «AscW» воспринимается как синтаксическая ошибка. Что, впрочем, я и ожидал.
Название: Замена длинного списка замен одним регулярным выражением
Отправлено: Администратор от 02 декабря 2025, 09:55
Да, получается использование Найти и заменить для вашей задачи не подходит - т.к. будет работать очень долго.
Значит нужно использовать какие-нибудь другие способы.

Разработчики из Майкрософта не стремились сделать встроенные средства быстрыми. У Майкрософта видимо конкурентов нет, поэтому им всё равно: быстро работает или нет - всё равно программу будут покупать, т.к. больше никто не производит такую программу.