更改 VBA 中的汉字字体

Change Font for Chinese Characters in VBA

我正在尝试为一位同事编写一个帮助脚本,它将自动打开目录中的所有 .doc(x) 文件,找到所有中文字符,设置它们的字体,保存并关闭。

我已经有了这个脚本的工作版本。文件 opening/saving/closing 部分在 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§$²³%#&/+-]" 与一个变量,或大多数其他任何东西。许多字符不在此正则表达式中,例如“(”、“)”等,但添加它们(即使使用 转义)将导致 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

从 searchPattern 中删除“{1,}”就成功了。现在它完全符合我的预期:)

searchPattern = "[" & ChrW(&H2E80) & "-" & ChrW(&HFFED) & "]"

可以找到无法在 VBIDE 中表示的字符值,方法是将它们粘贴到一个空的 Word 文档中,然后使用 VBA 打印您希望调查的文本中每个字符的 AscW 值。然后,您可以在 VBA 中使用 ChrW 以 VBA 友好的方式重新组合文本。

来自

拼音.info/news/2016/…

您可以使用查找字符串“[⺀-■]{1,}”来查找任何汉字。但是,正如您在将此文本粘贴到 VBA IDE 时所注意到的那样,您会得到 [?-?]{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) &"]"