和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字コードから文字を取得する - Chr/ChrW/ChrB関数

文字コードから文字を取得する、Chr関数シリーズを解説します。

Chr関数シリーズには、

  • Shift-JISでの文字コードから文字を取得するChr関数
  • Unicodeでの文字コードから文字を取得するChrW関数
  • 1バイトの文字コードからバイト単位で文字を取得するChrB関数

の3つがあります。

実行例

Range("A1") = Chr(49) ' 1
Range("A1") = ChrW(49) ' 1
Range("A1") = ChrB(49) ' 1

Range("A1") = Chr(65) ' A
Range("A1") = ChrW(65) ' A
Range("A1") = ChrB(65) ' A

Range("A1") = Chr(-32096) ' あ
Range("A1") = ChrW(-32096) ' 芠
Range("A1") = ChrB(-32096) ' 「オーバーフローしました」エラー

Range("A1") = ChrW(12991) ' ㊿
Range("A1") = Chr(12991) ' 2 ※ Shif-JIS非対応のコードは文字化けと同現象
Dim 文字コード As Long
文字コード = Asc("A")

Dim i As Long
For i = 0 To 25
    Debug.Print Chr(文字コード + i) ' A~Zが順に出力される
Next

解説

Chr関数シリーズは文字コードから文字を取得する関数です。

数値以外を渡した場合は「型が一致しません」エラーを返します。



Chr関数は引数を「Shift-JISの文字コード」として文字を取得し、
ChrW関数は引数を「Unicodeの文字コード」として文字を取得します。

※ ChrB関数はまず使用しない関数ですので解説は割愛します。


ChrW関数の方が対応範囲は広いのですが、「あ」と「芠」で分かる通り、
Chr関数の対応範囲であってもChrW関数と結果が異なることがあります。

このため、常にChrW関数を使えばよいという訳ではありませんので、
対応する文字コードによって関数を使い分けてください。


また、今回は実行例に「Range("A1")」を使っていた理由として、
MsgBoxやDebug.PrintはUnicode文字に対応していません。

ChrW関数でないと生成できない文字をMsgBoxなどに表示させても、
「?」と表示されるだけとなります。


ChrW関数の利用目的の多くはこの「VBEで扱えない文字をセルに出力する」処理で、
セルに㊿などを出力する場合は、

Range("A1") = ChrW(12991)

このように記載する必要があります。


この12991という文字コードを調べたいときは、
その文字をセルに入力した状態で、イミディエイトウィンドウに

?AscW(Selection)

と入力するのが簡単です。


AscW関数はChrW関数と逆の動きをする関数で、
文字から文字コードを取得する関数です。

ChrW関数に渡す文字コードを調べるときにはAscW関数を使用してください。


それ以外の使用用途としては、文字コードが規則正しく並んでいることを利用し、

Dim 文字コード As Long
文字コード = Asc("A")

Dim i As Long
For i = 0 To 25
    Debug.Print Chr(文字コード + i) ' A~Zが順に出力される
Next

このように文字を計算やループで扱うことができます。


例えば何らかのランク付けされたデータで、
「AランクとCランクが何ランク離れているか」
などを計算する場合も

?Asc("C") - Asc("A") ' 2が表示される

こんな風にも扱えます。

まあSランクが出てきておじゃんになるのが関の山ですが、
引き出しの1つとして持っておいてください。


なお、実行例に出てきた「芠」は「ゆきのした」と読む植物です。
こちらもついでに覚えてしまってください。