SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

VBAからUnicode版のWindows API を使う

VBAにおけるUnicodeの取り扱い

Unicode文字列版 APIを呼ぶときのポイント

 APIを呼ぶ手順はANSI文字列版のときとほぼ同じですが、以下の点が違います。

 標準モジュールにDeclare ステートメントでAPI 関数を定義するとき、引数が文字列の部分は、ANSI文字列版では文字列型(String)をByValで定義しましたが、Unicode文字列版では長整数型(Long)をByValで定義してください。

 GetUserName関数で比較すると以下のようになります。

ANSI文字列版の場合
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long
UNICODE文字列版の場合
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameW" _
    (ByVal lpBuffer As Long, nSize As Long) As Long

 また、関数を呼び出すときに引数として文字列型(String)を渡す場合は、StrPtr関数で長整数型(Long)へキャストしてください。GetUserName関数を呼ぶ場合、以下のようになります。

'sは文字列型(String)
GetUserName StrPtr(s), size

Unicode文字列版 APIに文字列を渡す

 MsgBox関数はUnicodeに対応していませんでしたが、Windows APIのMessageBoxW関数を使って、Unicodeに対応したMsgBoxEx関数を作ってみます。

Unicodeに対応したMsgBoxEx()関数
'標準モジュールに以下のDeclare ステートメントを追加
Declare Function MessageBox Lib "user32" Alias "MessageBoxW" _
    (ByVal hwnd As Long, ByVal lpText As Long, _
     ByVal lpCaption As Long, ByVal wType As Long) As Long
Declare Function GetFocus Lib "user32" () As Long

'MsgBoxEx()関数
Sub MsgBoxEx(Text As String)
    Dim Caption As String
    Caption = "Microsoft Excel" 'キャプション
    'StrPtr()関数で長整数型(Long)にキャスト
    MessageBox GetFocus(), StrPtr(Text), StrPtr(Caption), 0
End Sub

'MsgBoxEx()関数の使用例
Sub Test()
    Dim Text As String
    Text = "千代田区" & ChrW(&H9EB4) & "町"
    MsgBoxEx Text
End Sub
実行例
実行例

Unicode文字列版 APIで文字列を受け取る

 APIのGetUserNameW()関数を使って補助漢字を含むユーザー名を取得してみます。

 事前に森鴎外(「鴎」は補助漢字 U+9DD7)というユーザーを作成し、ログオンした状態でマクロを実行してください。

補助漢字を含むユーザー名を取得する
'標準モジュールに以下のDeclare ステートメントを追加
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameW" _
    (ByVal lpBuffer As Long, nSize As Long) As Long

'使用例
Sub Test()
    Dim Buffer As String
    Dim Size As Long

    Buffer = String(256, vbNullChar) 'バッファにNull文字をセット
    Size = 256
    'StrPtr()関数で長整数型(Long)にキャスト
    GetUserName StrPtr(Buffer), Size
    'ANSI文字列版と同様、余分なNullCharを削除する
    Buffer = Left(Buffer, InStr(1, Buffer, vbNullChar) - 1)
    'ワークシートのA1セルへ書き込み
    ThisWorkbook.ActiveSheet.Range("A1").Value = Buffer
End Sub
実行例
実行例

まとめ

 Windows VistaからJIS第3水準・第4水準漢字が使えるようになりましたが、これらの文字を扱う場合もJIS補助漢字と同様にUnicode版のWindows APIを使う必要があります。

 また、VistaではIMEの変換候補に補助漢字や第3・4水準漢字の単語が標準で出てくるようになっています。そのため、MS-OfficeアプリケーションでUnicode対応のプログラムを書く必要性は高まっていると思われます。

 詳しくは以下のページを参照してください。

参考資料

  1. MSDN:「Office VBA と Windows API
  2. VBAユーザーのためのWin32 APIプログラミングガイド」(大村あつし 著、エーアイ出版、1999年3月
  3. マイクロソフト サポート オンライン:「FILE: WIN32API.EXE は、 Visual Basic 5.0 の Win32api32.txt のバージョンを更新しました。
  4. ITpro:「Unicodeは「使える」から「知らずに使う」フェーズへ

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

さなみ(サナミ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1718 2008/01/31 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー