Я пытаюсь написать вспомогательный скрипт для коллеги, который автоматически откроет все файлы .doc (x) в каталоге, найдет все китайские иероглифы, установит их шрифт, сохранит и закроет.
У меня уже есть рабочая версия этого скрипта. Часть открытия / сохранения / закрытия файла обрабатывается в Python / win32com и работает нормально. Моя главная точка зрения - это макрос VBA.
Я знаю, что есть регулярное выражение (\ p {Han}) , которое должно быть в состоянии поймать всех китайцевсимволы, но это не похоже на работу в VBA. Точно так же я попытался использовать диапазоны Unicode и Chr (W). Ничто до сих пор не дало никаких результатов, не говоря уже о корректных результатах. Из-за разочарования я сделал последнюю попытку и просто перевернул параметры поиска. Вот как это происходит сейчас:
Sub FindReplace_zh(Rng As Range)
With Rng.Find
Do While .Execute(FindText:="[!A-ZÄÖÜa-zäöü0-9><_ ^11^13§$²³%#&/\+-]", MatchWildcards:=True)
If Rng.Font.Bold = True And Rng.Font.Name Like "Arial*" Then
Rng.Font.Name = "SimHei"
ElseIf Rng.Font.Bold = False And Rng.Font.Name Like "Arial*" Then
Rng.Font.Name = "SimSun"
End If
Rng.Collapse 0
Loop
End With
End Sub
ПО ЭТОМУ МЕНЬШЕ ЭТО РАБОТАЕТ, но это далеко не так элегантно и все еще дает нежелательный результат.
Мне еще предстоит понять, как я могу заменить " [! A-ZÄÖÜa-zäöü0-9> <_ ^ 11 ^ 13§ $ ²³% # & / + -]</em>"с переменной или почти всем остальным. Многие символы не охватываются этим регулярным выражением, например "(", ")" и т. Д., Но их добавление (даже экранирование) приведет к ошибкам во время выполнения в VBA. Я нашел много уроков и вопросов, касающихся удаления или вставки текста, но мой конкретный случай поиска текста, а затем изменения шрифта, оставляя все остальное нетронутым, кажется довольно конкретным.
Забавный факт: мне пришлосьдобавьте ^ 11 и ^ 13 в список регулярных выражений, поскольку их отсутствие приведет к тому, что макрос будет вставлять новые разрывы строк в случайных позициях .doc
РЕДАКТИРОВАТЬ: Новая попытка с комментарием:
Dim searchPattern As String
searchPattern = "[" & ChrW(&H2E80) & "-" & ChrW(&HFFED) & "]{1,}"
With Rng.Find
Do While .Execute(FindText:=searchPattern, MatchWildcards:=True)
Недопустимая операция в последней строке! Я бы тоже не связал такую строку. Я не уверен, как VBA анализирует это, но не так, как мы надеялись.
EDIT2: FIX
Удаление "{1,}" из searchPattern сделало это. Теперь он работает точно так, как я ожидал:)
searchPattern = "[" & ChrW(&H2E80) & "-" & ChrW(&HFFED) & "]"