1

我正在使用 VBA for Word,并且正在开发一个在 Word 文档中进行批量查找/替换的项目。我从 .csv 导入了查找/替换术语的列表。

我遇到的问题是我想用代表单词的符号替换单词。例如,如果我使用面包这个词,我想将它替换为面包的 UTF-32 符号(Unicode 十进制 127838/十六进制 0x1f35e)。当我使用内置的 MS-Word 查找/替换手动执行此操作时,效果很好,我只需在替换框中输入 alt+127838 即可顺利工作,但在 UTF-32 查找/替换批处理似乎给我带来了麻烦。

如果我使用 ChrW() 它将超出范围,因为 ChrW 只接受高达 65,535 的值。它无法处理第 17 位。如果我尝试插入它,它会给我一个运行时错误。

我尝试使用 \U 转义字符,但它只是用“\U127838”字面替换它,这不是很有帮助。不确定 VBA 是否甚至支持 unicode 转义字符。如果我不把它放在引号中,它会给我一个语法错误。

虽然我对编程并不陌生,但我对 VBA 和 VB 还是很陌生。我在网上查了一下,似乎 VB 的 UTF32Encoding 类不适用于 VBA

https://msdn.microsoft.com/en-us/library/system.text.utf32encoding(v=vs.90).aspx

可能是我不熟悉 VB 和 VBA 之间的细微差别,但是当我尝试初始化程序时:

将 u32LE 调暗为新的 UTF32Encoding(假,真)

它在我的 VBA 代码中给了我一个语法错误。

我尝试使用 Imports 语句,但这也使我的编译器感到困惑。我不确定我是否做错了什么,或者 VBA 是否不支持此类。

如果 VBA 不支持打印 UTF32 字符,请告诉我,我应该尝试使用 Python 或 Java 之类的东西。非常感谢您的帮助!

这是我正在编写的函数。我注释掉了 Imports 行,因为它给了我一个错误(它说找不到突出显示“.Text”的方法或成员)

Sub findReplaceUnicode(ByVal findItem As String, unicode As Long)

'Imports System.Text
Dim u32LE As New UTF32Encoding(False, True)



Selection.find.ClearFormatting
Selection.find.Replacement.ClearFormatting
With Selection.find
    .Text = findItem
    .Replacement.Text = ChrW(unicode)
    .Replacement.font.Name = "Segoe UI Symbol"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.find.Execute replace:=wdReplaceAll

结束子

4

1 回答 1

0

好吧,首先你不能在你的 VBA 代码中使用 .NET 命名空间。在 VBA 程序中使用 VB 类是错误的。没有兼容性。

解决这个问题的方法是不使用 UTF32。但是,其中许多符号也具有双重 UTF-16 编码。例如,面包符号 (UTF-32 0x1f35e) 也可以由两个 UTF-16 条目键入:0xD83C 0xDF5E (d83cdf5e)。

http://www.fileformat.info/info/unicode/char/1f35e/index.htm

File Format.info 是查找该翻译的有用站点。用超过 17 位替换符号的一种方法是输入:

.Replacement.Text = ChrW(first) & ChrW(second)

其中 first 是复合 UTF-16 条目的前半部分,而 second 是复合 UTF-16 条目的后半部分。

一个好的经验法则是,当有疑问时,手动记录宏,然后对结果进行逆向工程。

于 2015-11-23T23:27:44.133 回答