在Excel的VBA中声明Unicode字符串

17

我正在尝试创建一个substitute()函数,将希腊字符转换为拉丁字符。

问题在于,在声明完函数之后,我该如何实际执行替换操作?

Dim Source As String
Source = "αβγδεζηικλμνξοπρστθφω"  

源代码被解释为 "áâãäåæçéêëìíîïðñóôõöù"
是否有办法在声明级别使用 Unicode?


将希腊字符转换为拉丁字符。这是什么意思?α 变成 a,β 变成 b,γ 变成 g 等等?如果是这样,那 ζ、η、ξ 应该转换成什么? - Jean-François Corbett
我有自己的目标字符串,在其中进行转换。基本上,这并不重要。 - Stavros
相关:此方法无法在const中使用。请参见excel-Stack Overflow中的VBA Unicode字符串文字。 ___________________________________________________________________________________________ 一些函数(例如MsgBox)不支持Unicode--请参见ms access-Stack Overflow中的VBA中如何显示带有Unicode字符的消息框? - user202729
@GSerg 也许你应该反转重复的关闭?这个问题有更高的投票和更早的时间。 - user202729
1
@user202729,这两个都不相关。相关的是答案的正确性。这里被接受的答案是不正确的,因为它会产生双重Unicode,这是没有意义的并且会破坏数据,更让人气愤的是,它是基于常规字符串文字的,由于IDE的非Unicode特性,只有在带有希腊语环境的计算机上才能正常工作,正如我在那个答案下所指出的。 - GSerg
3个回答

14
你可以尝试使用StrConv
StrConv("αβγδεζηικλμνξοπρστθφω", vbUnicode)

来源: http://www.techonthenet.com/excel/formulas/strconv.php

[编辑] 另一个解决方案:

您可以使用此过程获取每个希腊字符(小写和大写):

Sub x()
    Dim i As Long

    For i = 913 To 969
        With Cells(i - 912, 1)
            .Formula = "=dec2hex(" & i & ")"
            .Offset(, 1).Value = ChrW$(i)
        End With
    Next i
End Sub
你可以创建一个数组来查找字符。
来源:http://www.excelforum.com/excel-programming/636544-adding-greek-letters.html
[EDIT 2] 这里是一个子程序来构建你想要的字符串:
Sub greekAlpha()
Dim sAlpha As String
Dim lLetter As Long

For lLetter = &H3B1 To &H3C9
    sAlpha = sAlpha & ChrW(lLetter)
Next
End Sub

1
还是不行。也许是我声明变量的方式不对。你成功让它工作了吗? - Stavros
@Stavros:事实上,我无法在完整的示例中使其正常工作。我添加了另一种解决方案(根据您想要做什么而定,它可以正常工作)。 - JMax
@Stavros:我编写了一个过程,可以创建具有正确字符的字符串,但由于我仍然不知道您要实现什么目标,因此我只能进行评估和尝试... - JMax
请注意,根据Microsoft StrConv()文档,此解决方案仅适用于Windows。 - Br.Bill
4
使用StrConv("string literal", vbUnicode)绝对错误的。它的作用是首先创建一个包含该字面值的Unicode字符串(如果该字面值包含在当前ANSI代码页中无法表示的字符,则此时它已经是垃圾),然后再次将其转换为Unicode,假装它是ANSI编码。这导致出现“双重Unicode”字符串。对于只包含英文的字符串,它看起来像每个字符后面都插入了vbNullChar;对于国际化字符串,结果是完全的垃圾。 - GSerg
显示剩余3条评论

12

如先前所述,VBA支持Unicode字符串,但您不能在代码中编写Unicode字符串,因为VBA编辑器仅允许对VBA文件进行8位代码页Windows-1252编码。

但是,您可以将所需的Unicode字符串转换为其二进制等效形式:

str = StrConv("±²³´µ¶·¹º»¼½¾¿ÀÁÃĸÆÉ", vbFromUnicode)
'str value is now "αβγδεζηικλμνξοπρστθφω"

使用记事本将字符串转换:复制粘贴Unicode字符串,将文件保存为Unicode(不是UTF-8),并将其作为ASCII(实际上是Windows-1252)打开,然后将其粘贴到VBA编辑器中,但不包括前两个字符(ÿþ),这是BOM标记。


4
聪明的诡计,但它面临完全相同的问题。由此产生的聪明字符可能很容易无法在计算机当前的 ANSI 代码页中表示。例如,当我将该字符串粘贴到我的 VBA 编辑器中时,我得到的是“±???µ¶·??»????AAAA??E”。 - GSerg
我能够在Notepad++中使这个方法在某种程度上工作...在Notepad++中打开新文件,将编码更改为UCS-2,粘贴Unicode文本,将编码更改为Windows-1252,它会要求保存文件,保存它。在Notepad++中关闭文件并在Windows记事本中打开文件,在打开时选择编码为ANSI。按照上述方式在VBA中使用此文本。然而,当ANSI文本具有用作VBA字符串分隔符的双引号时,问题就出现了。对于一些字符,VBA ChrW()函数也可以与Unicode十六进制转换为十进制一起使用..例如,要嵌入Unicode减号 "−",请使用ChrW(8722)。 - Uttam

8

您说您的源代码被解释为“áâãäåæçéêëìíîïðñóôõöù”。

请注意,Visual Basic编辑器不会显示Unicode,但是它支持操作Unicode字符串

Dim strValue As String
strValue = Range("A1").Value
Range("B1").Value = Mid(strValue, 3)
Range("C1").Value = StrReverse(strValue)

如果A1包含希腊字符,则运行此代码后B1和C1也将包含希腊字符。
你只是不能在立即窗口或消息框中正确查看这些值。

1
请注意,虽然 MsgBox 无法正确显示 Unicode,但您可以在 UserForm 上的 Label 或 TextBox 控件中显示您的 Unicode 字符串。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接