在VBA中更改汉字的字体

在VBA中更改汉字的字体,vba,ms-word,win32com,Vba,Ms Word,Win32com,我正在尝试为一位同事编写一个助手脚本,该脚本将自动打开目录中的所有.doc(x)文件,查找所有汉字,设置字体,保存并关闭 我已经有了这个脚本的工作版本。文件打开/保存/关闭部分在Python/win32com中处理,工作正常。我的主要争论点仍然是VBA宏 我知道有一个regex(\p{Han},它应该能够捕获所有的汉字,但这在VBA中似乎不起作用。类似地,我尝试使用Unicode范围和Chr(W)。到目前为止,还没有产生任何输出,更不用说正确的输出了。 出于沮丧,我做了最后一次尝试,并简单地反转

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

我已经有了这个脚本的工作版本。文件打开/保存/关闭部分在Python/win32com中处理,工作正常。我的主要争论点仍然是VBA宏

我知道有一个regex(\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
最后一行的操作无效! 我也不会用这样的细绳。我不确定VBA是如何解析的,但显然不是我们希望的方式

编辑2:修复

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


通过将无法在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
因此,您可以得到find字符串的临界部分,如下所示

"[" & ChrW(&H2£80) & "-" & ChrW(&HFFED) &"]"

就单词Find/Replace with wildcards而言,!不是以下任何字符的意思。这是你想要的吗?或者你是指字符“!”。这正是我的解决方法。我没有使用正则表达式查找汉字,而是编写了一个正则表达式,它只查找负数集中的字符。因此,所有标准拉丁字符字符+一些Umlaut字符和一系列特殊字符。问题是此列表a)不够详尽,b)由于VBA中的正则表达式限制(您无法添加“)”甚至“\ ^”而无法完成没有从Visual Basic中获取错误。您需要阅读Microsoft帮助页上的“查找和替换通配符”。通配符与Regex类似,但不同。您在“)”上的断言etc是不真实的,因为我在word VBA中的find/replace中多次使用了此类符号,没有任何VBA问题。我已经阅读了很多VBA/MS帮助页面,但到目前为止没有任何效果。也就是说,这只是解决方法。虽然改进此正则表达式当然是有益的,但我更愿意以更直接的方式获得实际解决方案nner如果可能,即:一个只查找和处理汉字的正则表达式或一段代码。将字符粘贴到word中,然后打印每个字符的十六进制值。这将告诉您使用哪个ChrW字符来构建字符串。”[⺀-■]" 给出5B、2E80、2D、FFED、5D的十六进制值。因此,您可以在9分钟前将字符串构建为“[”&ChrW(&H2E80)和“-”&ChrW(&HFFED)和“]{1,}”–Freeflow
"              34           22
[              91           5B
?              11904        2E80
-              45           2D
?             -19           FFED
]              93           5D
"              34           22
               160          A0
"[" & ChrW(&H2£80) & "-" & ChrW(&HFFED) &"]"