ExcelVBAについて教えてください。

VB6で作られたプログラムをExcelVBAに移植しようとしているのですが、外部APIを呼び出す際に文字列を設定するところでVB6では文字列の終端の意味の"Chr(0)"を付け足して実現しているのですが(C言語で作られたものなのでこういう仕様だというメーカーの説明)ここをExcelVBAで実現することが出来ません。文字列だけ渡したり、Chr$(0)やvbNullやvbNullCharやvbNullStringを試してみたのですが文字列の終わりを認識できていないようです。
賢者の方、お知恵をお貸しくださいませ!

回答の条件
  • 1人2回まで
  • 登録:2008/10/31 09:09:39
  • 終了:2008/11/07 09:10:02

回答(1件)

id:harasima No.1

harasima回答回数128ベストアンサー獲得回数72008/10/31 23:43:55

ポイント60pt

StrConv関数をかましてみてはどうでしょう?



http://www.ne.jp/asahi/hishidama/home/tech/excel/dll.html


Cだと文字列は'0x00'≒NULLが番兵となって文字列終了の目印にしています。『C言語で作られたものなのでこういう仕様』というのはそう言う意味です。

で、VBの”string”オブジェクトはUniCodeになっていて、(UniCodeで書かれたファイルなどダンプすると分かりますが)一般文字だと1文字づつ'0x00'が入って1文字しか表示されなかったり、文字化けしてしまうのかと思います。


で、上記ページのMessageBoxの例では、サブルーチンを自作してますが、StrConv 関数を使用して、UniCodeのstringオブジェクトを旧来の文字コードに変換すれば良いかと思います。

Dim ret As Integer
ret = MessageBoxPtr(0, VarPtr(text(0)), VarPtr(caption(0)), vbOKOnly)
'ret = MessageBoxPtr(0, StrPtr("message"), StrPtr("title"), vbOKOnly)

としてありますが、コメントアウトしてある場所を書き換えてそのまま(2バイト文字も)使えます。

Dim ret As Integer
ret = MessageBoxPtr(0, StrPtr(StrConv("message", vbFromUnicode)), StrPtr(StrConv("title", vbFromUnicode)), vbOKOnly)
id:maxpower

ありがとうございます。

早速明日試してみます!

2008/11/02 19:16:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません