- ベストアンサー
VBA・VB6.0・VB.NETの文字列型
失礼します。 Excel97/2000のVBAの文字列型変数は、アスキーコード129-159/224-252のデータを保持できないみたいですが、これはVB6.0/VB.NETなどでもそうなのですか? つまり、VBAでは、 Sub main() Dim s as String s = Chr$(130) Sheet1.Cells(1, 1) = Asc(s) End Sub とすると、シートのA1に「0」が表示されてしまうということです。 というのも、私はVB6.0/VB.NETを持っていないのですが、ちょっとVB2.0時代のコードを使う必要が生じたので、VBAで実行してみたところ、以上のような仕様の違いに気付いたのです。 これがVBAだけの特性なのか、最近のVBはこういう仕様になってしまったのかが知りたいのです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
たぶん、コード体系が変わったためです。 VB2.0のころは、Windows3.1やWindows95ですね。コードはシフトJISを使っていました。 現在Windows98以降はEUCという2bytコードをOSが使用してますので、プログラム自体は正しく動作しても、シフトJIS→EUCでは結果が変わりますので、そのようなことになっているのでは? 単純に文字列を設定すれば、自動的に変換がかかるので普通は気づかないのですが、ご質問のように文字コードそのものを設定する場合は結果が違ってきてしまう。という事でしょう。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
ご存知でしょうが、129-159、224-252は2バイトコード文字(シフトJIS)の第1バイトのコードですね。だから「文字」は割り当てられていないといえるでしょう。エクセルでは=char(18223)やCode("年")(=18223)などの関数表現が可能で(この例は年の文字)す。 Sub test01() s = Asc("年") Cells(15, 5) = Chr(s) End Sub でCells(15, 5) に「年」が表示されます。 Sub test02() MsgBox Asc("年") MsgBox Chr(-27570) End Sub とりとめもないですが、もう少し良く判った方の解説がほしいですね。 エクセル2000、VB6です。
お礼
どうやら、文字列型は「文字」に特化してしまったようですね。 バイナリデータを文字列型として扱えると、Instrをかけたり、Midで切り出したり、便利だと思うのですが。それとも、何かこれと同等の事を簡単に実現する方法があるのでしょうか。最近はBasicを触っていないのでよく分からないのですが。 ともあれ、回答ありがとうございました。
- fantasis
- ベストアンサー率26% (14/52)
確かVBでも、「・」や「?」になってしまうと思います。
補足
回答ありがとうございます。 あの、それは、 text1.text = Chr(130) とすると、テキストボックスの文字が文字化けする、という意味でしょうか。 そうではなく、 s$ = Chr$(130) text1.text = Asc(s$) としても、テキストボックスに「130」ではなく「0」が表示されるのか、という問題なのですが。
お礼
回答ありがとうございます。 どうやら、文字コードの違いのようですね。マイクロソフトによると、文字列型の内部形式はUnicodeとのことです。と、すると、制御文字が保持できないのも頷けます。 (http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vadatstring.asp) 実は、これに気付いたのは、バイナリファイルの入出力を文字列型で行っていた時なのですが、私と同じ状況を実験してみているページを発見しました。 (http://homepage2.nifty.com/kasayan/vba/binary.htm) マイクロソフトとしては、代わりにByte型を用意したのだから、それを使えということなのでしょう。しかし、バイナリ・テキスト混在のファイルの入出力では、文字列型で一括して扱える方が便利なのですがね。というか、だったら初めからCで書きます、というところでしょうか。