更改 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) &"]"
我正在尝试为一位同事编写一个帮助脚本,它将自动打开目录中的所有 .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) &"]"