none
office2016 マクロが異なるOSで文字化けについて RRS feed

  • 質問

  • VBA作成環境:Win10日本語版 ent sp1 64bit、中国語言語パッケージインストール; office 2016; 入力はOSデフォルト日本語IME; unicode中国語。

    使用環境:Win10日本語版 ent sp1 64bit; office 2016; 入力はOSデフォルト日本語IME; unicode日本語。

    現象:作成したexcelのマクロについて、使用環境のVBAエディタの中で、漢字だけの文字化けが発生されました。

    うちの対応:ファイル保存時、excelのWEB オプションのエンコードは日本語(JIS)に変更して保存しました。結果はNG

    助けてお願いいします。m_(-_-)_m


    • 編集済み MarsGuan 2019年1月30日 9:45
    2019年1月30日 9:45

回答

  • 私の知らない環境、さらに、どのように文字化けしているのかが未詳なので
    外しているかもしれませんが...

    私の知る限り、VBAの文字列(String型)はUniCodeですが、
    VBE(エディターの画面)ではShift-JISに無い文字は"?"に置き換わります。
    https://teratail.com/questions/136057 が同じことを言ってます。

    • 回答としてマーク MarsGuan 2019年2月2日 2:57
    2019年2月1日 0:56

すべての返信

  • 私の知らない環境、さらに、どのように文字化けしているのかが未詳なので
    外しているかもしれませんが...

    私の知る限り、VBAの文字列(String型)はUniCodeですが、
    VBE(エディターの画面)ではShift-JISに無い文字は"?"に置き換わります。
    https://teratail.com/questions/136057 が同じことを言ってます。

    • 回答としてマーク MarsGuan 2019年2月2日 2:57
    2019年2月1日 0:56
  • ありがとうね~調査続きます。微妙な不具合ですね
    2019年2月2日 3:00
  • VBE のテキストエディタ部分やウォッチリスト、イミディエイト画面などは
    Unicode 非対応なので OS のデフォルトエンコード (コードページ) 以外の
    文字は入出力・表示ができません。
    (文字列を扱う WinAPI のワイド文字列対応の W 系関数ではなく ANSI 版の A 系
    関数を使っている時と同様)

    ファイル入出力などはできるはずですが VBE 上に直接、Unicode 文字を表示する
    ことはできないと思います。
    Excel のセルにならフォントさえあれば表示はできるのでセルに表示したい場合は
    ChrW 関数で 1 字ずつコード指定するしかないでしょう。

    例えば「东」 (東) なら Unicode 番号は 0x4E1C なので ChrW$(&H4E1C) です。
    (なお、MsgBox は Unicode 非対応みたいです)


    • 編集済み infade 2019年2月5日 3:01 誤字修正
    2019年2月5日 3:00
  • 多言語対応の VBA コードを書こうとすると、Application.International プロパティを考慮する必要が生じる場合があったりしますが、<strike>対中国圏なら、文字コードの違い以外はさほど気にしなくても済みそう</strike> 。

    コントロール パネルの地域設定(intl.cpl)の
     形式タブの "形式" (あるいは追加のカスタム設定)
     管理タブの "Unicode 対応ではないプログラムの言語" (システムロケール)
    および、Office オプションの「編集言語」「表示言語」設定による影響も受けそうです。

    > 漢字だけの文字化けが発生されました。

    Excel のセルや String 変数などは Unicode に対応していますが、開発環境すべてが Unicode 対応というわけではありません。コードエディタ画面やイミディエイト の制限の他、メソッドやステートメントにも一部制限がありますので、ChrW 関数で置き換えるだけでは対応しきれない可能性があります。

    たとえば「Workbooks.Open メソッド」については Unicode 文字を含んだパスでも開けますが、VBA の「Open ステートメント」に指定するファイルパスは OS 既定のコードページに限定されます。このため Open ステートメントや Kill ステートメントでは、"东.TXT"、"㎥.TXT"、"躾.TXT" などのファイル名を扱うことができません。

    また OS 環境によっては、StrConv 関数での一部の変換が失敗することがあります。
    vbWide や vbNarrow は、東アジア圏のシステムロケールでしか扱えませんし、
    vbKatakana や vbHiragana は日本限定のパラメーターです。
    ※第3 引数(LocalID) に msoLanguageIDJapanese (=1041)を明示することで回避できる可能性あり。

    なお現在の ロケール ID は LanguageID プロパティで取得できます。

    With Application.LanguageSettings
        Debug.Print .LanguageID(msoLanguageIDInstall), .LanguageID(msoLanguageIDUI)
    End With


    MsgBox 関数については、そのままだと Unicode 文字を表示できないのですが、
    MessageBoxW API や WshShell の Popup メソッドで代用することができます。

    msg = "東亜/" & ChrW(&H4E1C) & ChrW(&H4E9A) & "/東亞"
    
    ret = MsgBox(msg, vbInformation Or vbOKCancel, "文字化け")
    
    ret = CreateObject("WScript.Shell").Popup(msg, 0, "正常表示", vbInformation Or vbOKCancel)


    2019年2月6日 2:00