Как отобразить окно сообщения с символами юникода в VBA? - PullRequest
5 голосов
/ 17 марта 2019

У меня есть строка, содержащая символы Юникода в VBA.

Я хочу отобразить эту строку в окне сообщения, содержащем ее.

Однако вместо строки окно сообщения содержит тольковопросительный знак.

MCVE:

Dim s As String
s = ChrW(5123)
MsgBox s

1 Ответ

6 голосов
/ 17 марта 2019

MsgBox несовместимо с не-ANSI символами Юникода.

Однако мы можем отображать окна сообщений с функцией WinAPI MessageBoxW, и это так.

Давайте объявим эту функцию, а затем создадим для нее оболочку, которая почти идентична функции 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

Эта функция совместима только с Microsoft Access. Однако для Excel вы можете поменять Application.hWndAccessApp на Application.hWnd, чтобы он работал. Для других VBA-совместимых приложений вам нужно найти подходящий способ получить hWnd.

Вы можете использовать его как MsgBox, если вы не используете функциональность контекстно-зависимой справки:

Dim s As String
s = ChrW(5123)
MsgBoxW s
...