Имею довольно длинный список замен следующего вида:
Буква1 –> Замена1
Буква2 –> Замена2
Буква3 –> Замена3
. . .
Насколько я понимаю, нет никакой возможности объединить их в одну замену, но всё же решил спросить: вдруг есть какой-то хитрый лайфхак...
В одну команду Find, которая бы делала все эти замены, - нет такой возможности объединить.
Единственное можно как-нибудь попробовать оптимизировать код: уменьшить код, ускорить код. Для этого нужно смотреть конкретную ситуацию, т.к. ситуаций может быть много разных.
Я тут измерил время, которое отрабатывает такой цикл:
Спойлер
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» воспринимается как синтаксическая ошибка. Что, впрочем, я и ожидал.
Да, получается использование Найти и заменить для вашей задачи не подходит - т.к. будет работать очень долго.
Значит нужно использовать какие-нибудь другие способы.
Разработчики из Майкрософта не стремились сделать встроенные средства быстрыми. У Майкрософта видимо конкурентов нет, поэтому им всё равно: быстро работает или нет - всё равно программу будут покупать, т.к. больше никто не производит такую программу.