文字コードから文字を取得する、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つとして持っておいてください。
なお、実行例に出てきた「芠」は「ゆきのした」と読む植物です。
こちらもついでに覚えてしまってください。