Изменить шрифт для китайских иероглифов в VBA - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь написать вспомогательный скрипт для коллеги, который автоматически откроет все файлы .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) & "]"

1 Ответ

1 голос
/ 23 октября 2019

Можно найти значение символов, которые не могут быть представлены в VBIDE, вставив их в пустой документ Word, а затем используя VBA, чтобы напечатать значения AscW каждого символа в тексте, который вы хотите исследовать. Затем вы можете использовать ChrW в VBA для повторной сборки текста в дружественном для VBA способе.

С

pinyin.info / news / 2016 /…

Вы можете использовать поискстрока "[⺀ -■] {1,}", чтобы найти любой китайский символ. Однако, как вы заметили, когда вы вставляете этот текст в IDE VBA, вы получаете [? -?] {1,}, потому что VBA использует UTD-8 в качестве своего набора символов. (Я думаю).

Следующий код

Public Sub PrintCharacterValues()

Dim myIndex As Long

    With ActiveDocument.Paragraphs(1).Range

        For myIndex = 1 To 8

            Debug.Print .Characters(myIndex), AscW(.Characters(myIndex)), Hex(AscW(.Characters(myIndex)))

        Next

    End With

End Sub

Дает вывод

"              34           22
[              91           5B
?              11904        2E80
-              45           2D
?             -19           FFED
]              93           5D
"              34           22
               160          A0

Таким образом, вы можете получить критическую секцию строки поиска как

"[" & ChrW(&H2£80) & "-" & ChrW(&HFFED) &"]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...