Chr、ChrB、ChrW
Chr、ChrB、ChrW関数は文字コードから対応する文字を取得することが出来ます。
それぞれの関数に指定できるコードは異なります。
Chr
Chr関数に指定できる文字コードは英語圏などは0から255のASCIIコードの範囲になりますが、全ての文字が2バイトで構成されるDBCS(Double Byte Character Set)を採用している日本語圏の場合の文字コードは-32768から65535の範囲で、Shift-JISの文字コードを入力する必要があります。
ChrB
ChrB関数に指定できる文字コードは0から255のASCIIコードの範囲になりますが、128から255までは使うことはないでしょう。日本語圏の場合はDBCSコードを採用しているため半角文字も2バイト扱いになります。そのため、ChrB関数の引数に65で半角の「A」という文字を取得しても左1バイトの’A’しか取得しておらず、NULL終端が欠けているため文字として表示できない恐れがあります。そのため表示させたい場合はNULL終端を意味するChrB(0)をつなげます。
ChrW
ChrW関数に指定できる文字コードは-32768から65535の範囲ですが、Unicodeの文字コードを入力する必要があります。
共通
Chr関数とChrW関数は-32768から65535の範囲ではありますが、ASCIIコード以外はLong型の値だけでは何のことか分からないため、通常は「&H82A0」のように&Hを付けて16進数表記での文字コード指定を行います。
範囲外の場合は「実行時エラー’5′ プロシージャの呼び出し、または引数が不正です。」のエラーになります。
Chr、ChrB、ChrWの違い
各関数の違いは引数に設定する文字コードが異なる点です。
0から127のASCIIコードであれば3つの関数は同じ結果を返しますが、それ以降は異なります。
ChrB関数は分かりやすく言えばNull終端されていない半角文字を取得します。32から126が取得できる文字になります。0から31と127は制御文字のため画面表示されません。その結果「 !”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~」のいずれかの文字に変換できる文字コードが対象になります。128からは国によって割り当てられている内容が異なる場合があるため普通は使いません。文字として表示したい場合は取得した文字の後ろにNull文字をつなげる必要があります。
Chr関数とChrW関数ですが、引数に渡す文字コードがShift-JISかUnicodeかの違いです。
例えば「あ」という文字はShift-JISにもUnicodeにも存在します。しかし文字コードが異なります。Shift-JISでは「0x82A0(数値では-32096)」というコードで、Unicodeでは「U+3042(数値では12354)」というコードです。
ファイルを読み込んで文字単位ではなくバイナリ単位で処理を行う場合には、そのファイルの文字コードが何であるかを確認した上で、Shift-JISであればChr関数、UnicodeであればChrW関数、といった使い分けを行います。
しかしファイルの文字コードを判別するのが面倒な場合などは、VBAのコードはChr関数に統一しておいて、ファイルの方を読み込む前に変換しておくなどの方法もありだと思います。
以下のコードはChr関数とChrW関数の両方で「あ」を出力します。
1 2 3 4 5 6 7 8 9 |
Sub ChrSameCharTest() Dim s s = ChrW(&H3042) Debug.Print s s = Chr(&H82A0) Debug.Print s End Sub |
ChrW関数の限界
ChrW関数は引数のUnicode文字コードを変換しますが、Unicodeには3バイト以上の文字があります。たとえば魚のほっけ()は魚に花と書きますが、この文字はUnicodeでは「U+29E3D」と表現されます。これは数値にすると171581になります。
ChrW関数の引数は定義上はLong型になっていますが、おそらくInteger型の誤りと思われ、ほっけ()の「U+29E3D(数値では171581)」を指定すると2バイトの65535を超えるためエラーになります。
このように、ヘルプなどでは「Unicodeの文字コードはChrWを使う」と書いてあっても、実際には変換できない文字があります。
構文
以下の各関数は定義内容をそのまま書いていますが、引数でLong型になっているものはおそらくInteger型の誤りと思われます。
1 2 3 4 5 6 |
Function Chr(CharCode As Long) Function Chr$(CharCode As Long) As String Function ChrB(CharCode As Byte) Function ChrB$(CharCode As Byte) As String Function ChrW(CharCode As Long) Function ChrW$(CharCode As Long) As String |
CharCode | 文字コードを指定します。数値での指定でも、16進数形式の「&Hxxxx」の指定でも構いません。 |
サンプルコード
以下はChr、ChrB、ChrWの各関数を使って「1」と「あ」を表示するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub ChrTest() Dim s '// "1"を表示 s = Chr(49) Debug.Print "Chr(49):" & s s = ChrB(49) & ChrB(0) Debug.Print "ChrB(49) & ChrB(0):" & s s = ChrW(49) Debug.Print "ChrW(49):" & s '// "あ"を表示 s = Chr(&H82A0) Debug.Print "Chr(49):" & s s = ChrW(&H3042) Debug.Print "ChrW(49):" & s End Sub |