如何在VBA中显示带有Unicode字符的消息框?

Eri*_*k A 6 ms-access vba access-vba

我在VBA中有一个包含Unicode字符的字符串。

我想在包含该字符串的消息框中显示该字符串。

但是,消息框仅包含一个问号,而不是字符串。

MCVE:

Dim s As String
s = ChrW(5123)
MsgBox s
Run Code Online (Sandbox Code Playgroud)

Eri*_*k A 8

MsgBox 与非ANSI Unicode字符不兼容。

MessageBoxW但是,我们可以使用WinAPI 函数显示消息框。

让我们声明该函数,然后为其创建一个与VBA MsgBox函数几乎相同的包装器:

Private Declare PtrSafe Function MessageBoxW Lib "User32" (ByVal hWnd As LongPtr, ByVal lpText As LongPtr, ByVal lpCaption As LongPtr, ByVal uType As Long) As Long

Public Function MsgBoxW(Prompt As String, Optional Buttons As VbMsgBoxStyle = vbOKOnly, Optional Title As String = "Microsoft Access") As VbMsgBoxResult
    Prompt = Prompt & VbNullChar 'Add null terminators
    Title = Title & vbNullChar 
    MsgBoxW = MessageBoxW(Application.hWndAccessApp, StrPtr(Prompt), StrPtr(Title), Buttons)
End Function
Run Code Online (Sandbox Code Playgroud)

此功能仅与Microsoft Access兼容。但是,对于Excel可以互换Application.hWndAccessApp使用Application.hWnd,使其工作。对于其他与VBA兼容的应用程序,您必须找到获取hWnd的适当方法。

MsgBox只要不使用上下文相关的帮助功能,就可以像使用它:

Dim s As String
s = ChrW(5123)
MsgBoxW s
Run Code Online (Sandbox Code Playgroud)

  • VBA 字符串作为 COM“BSTR”存储在内存中。它由一个 4 字节无符号整数组成,该整数存储字符串的长度(以字节为单位),后跟作为宽字符的字符串数据本身(每个字符 2 个字节),并以 2 个空字节结尾。因此,“BSTR”字符串具有长度前缀和空终止符。“StrPtr()”函数检索的内部指针指向字符串数据的内存位置,而不是长度前缀。这意味着 VBA 字符串“vbastr”可以通过“StrPtr(vbastr)”直接传递到需要指向空终止 C 字符串的指针的 API 函数。 (3认同)