プロが教えるわが家の防犯対策術!

 失礼します。

 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はこういう仕様になってしまったのかが知りたいのです。

A 回答 (3件)

たぶん、コード体系が変わったためです。



VB2.0のころは、Windows3.1やWindows95ですね。コードはシフトJISを使っていました。

現在Windows98以降はEUCという2bytコードをOSが使用してますので、プログラム自体は正しく動作しても、シフトJIS→EUCでは結果が変わりますので、そのようなことになっているのでは?

単純に文字列を設定すれば、自動的に変換がかかるので普通は気づかないのですが、ご質問のように文字コードそのものを設定する場合は結果が違ってきてしまう。という事でしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

どうやら、文字コードの違いのようですね。マイクロソフトによると、文字列型の内部形式はUnicodeとのことです。と、すると、制御文字が保持できないのも頷けます。
(http://www.microsoft.com/japan/msdn/library/defa …

実は、これに気付いたのは、バイナリファイルの入出力を文字列型で行っていた時なのですが、私と同じ状況を実験してみているページを発見しました。
(http://homepage2.nifty.com/kasayan/vba/binary.htm)

マイクロソフトとしては、代わりにByte型を用意したのだから、それを使えということなのでしょう。しかし、バイナリ・テキスト混在のファイルの入出力では、文字列型で一括して扱える方が便利なのですがね。というか、だったら初めからCで書きます、というところでしょうか。

お礼日時:2003/04/28 09:13

ご存知でしょうが、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です。
    • good
    • 0
この回答へのお礼

どうやら、文字列型は「文字」に特化してしまったようですね。

バイナリデータを文字列型として扱えると、Instrをかけたり、Midで切り出したり、便利だと思うのですが。それとも、何かこれと同等の事を簡単に実現する方法があるのでしょうか。最近はBasicを触っていないのでよく分からないのですが。

ともあれ、回答ありがとうございました。

お礼日時:2003/04/28 09:21

確かVBでも、「・」や「?」になってしまうと思います。

この回答への補足

回答ありがとうございます。

あの、それは、
text1.text = Chr(130)
とすると、テキストボックスの文字が文字化けする、という意味でしょうか。

そうではなく、
s$ = Chr$(130)
text1.text = Asc(s$)
としても、テキストボックスに「130」ではなく「0」が表示されるのか、という問題なのですが。

補足日時:2003/04/28 08:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!