- ベストアンサー
StrConvでUnicodeに変換出来ない文字
エクセルのVBAで、StrConv関数を使用して、文字列をUnicodeに変換しようとしているのですが、特定の文字が変換できません。 解決方法をご存知の方は教えてください。 現象:StrConv("マミムメモ",vbUnicode)で変換すると、ムメモが文字化けしてしまう。 確認方法: MsgBox StrConv(StrConv(InputBox("入力"), vbUnicode), vbFromUnicode) で、InputBoxに"マミムメモ"を入力すると、メッセージボックスに"マミ???"と表示されてしまう。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> Outlookで使用しているレジストリに格納して、Outlookでその文字列を > 使用したいのですが.... 最初に言ってもらわないと...^^; VB(A) の SetSetting/GetSetting ステートメントではアクセスできる場所 に制限がありますので、Outlook のレジストリにアクセスしているとなると API を使ってますね? 恐らく API の使い方にミスがありそうです。 ヒント:API の宣言部に間違いはありませんか? ヒント:API に文字列を渡す場合、ByVal キーワードを使って渡します。 ヒント:RegSetValue API の引数 cbData は、Unicode --> Shift-JIS に 変換したバイト長+1、つまり最後がNullで終わるように渡さないと、 NT 系 OS では正しく書き込めません。 Ex) CLng(LenB(StrConv("文字列", vbFromUnicode)) + 1
その他の回答 (2)
vbUnicodeとvbFromUnicodeを反対にするのでは? MsgBox StrConv(StrConv(InputBox("入力"), vbFromUnicode), vbUnicode)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 ご質問文にあるとおりの用途なら、 > StrConv("マミムメモ",vbUnicode) これは Unicode をさらに Unicode へエンコードしているため文字化けします。 以下を実行すると分かります。 MsgBox LenB(InputBox("入力", Default:="マミムメモ1")) 結果は 12 を返します。「マミムメモ1」 は全角5文字+半角1文字の計 11 バイトですが、Unicode は全角・半角ともに 2 バイトなので 6文字×2バイト = 12 ですね。InputBox からの入力は Unicode です。 Buf = StrConv(Buf, vbFromUnicode) (中間処理) Buf = StrConv(Buf, vbUnicode) といった処理で文字化けするなら、コード全体を補足する必要があります。 > MsgBox StrConv(StrConv(InputBox("入力"), vbUnicode), vbFromUnicode) 以上の理由で、これは使い方自体が間違えてますよ。
お礼
回答ありがとうございます。 もし、ご存知でしたら、なぜ「マミ」は正しく変換され、「ムメモ」は変換されないのか教えて下さい。 実は、実際にやりたいことは、InputBoxで入力した文字列を変換したいのではありませんでした。 Excelのセルに表示している文字を、Outlookで使用しているレジストリに格納して、Outlookでその文字列を使用したいのですが、その際に「マミ」はOutlookで正しく表示され、「ムメモ」は正しく表示されなかったのです。
お礼
アドバイスありがとうございました。 マイクロソフト社に問い合わせたところ、VB(A)から呼び出せるAPIでは、当該のOutlookのレジストリに正しく文字列を書き込むことはできないのだそうです。。。。 WMIを使う方法を案内してもらって、解決することができました。 度々、回答いただきまして、ありがとうございました。