こんにちは、小栁です。
今回は、ExcelVBAで直面する「文字コード」問題について取り上げたいと思います。
やりたいこと
特殊な文字を扱うとその後のプログラムでトラブルの原因になるため、初めにシンプルな文字に変換したいというわけです。
困っていること
問題が起こる原因
機種依存文字とは
そもそも機種依存文字とは何でしょうか。
それは、特定のPCの種類やOSに依存するせいで、想定したように表示できない文字のことです。
文字を表すデータをコンピューターがうまく読み取れず、「文字化け」を起こしてしまいます。
ちなみに、「機種依存文字」と「環境依存文字」は同じ意味です。
機種依存文字として代表的なものを挙げると、
などがあります。
機種依存文字の仕組み
そもそもなぜOSによって使える文字が違うのでしょうか。
その原因は「文字コード」です。
「Shift-JIS」「UTF-8」などといった規格ですが、この規格によって同じデータでも違う文字として認識してしまいます。
「Shift-JIS」にしかない文字は「UTF-8」だと表示できない、「UTF-8」にしかない文字は「Shift-JIS」だと表示できないというように、文字コードの違いによって使えない文字があります。「・」や「?」に変換されることが多いです。
文字コードは使っているパソコンのOSやソフトによって異なります。
また、今回の問題のやっかいなところは、「Shift-JIS」の中にも種類があると発覚したことで、
WindowsのShift-JISと、MacのShift-JISでは一部の特殊文字の文字コードが違っていたのです。
それらに対応させるために、以下のような方法を使いました。
Asc関数で文字コードを調べる
まずは、OSごとに文字コードが違うのであれば、条件分岐で対応することにします。
それぞれのOSでの文字コードを調べます。
Shift_JISの文字コードを調べるには、「Asc関数」を使います。
Microsoftドキュメント【Asc関数】
これを使えば、知りたい文字の文字コードを取得することができます。
WindowsとMacで文字コードは異なるためそれぞれの環境でこの関数を実行して調べる必要があります。
「ウォッチ」に表示された5ケタの数値は、16進数の文字コードを10進数に変換したものです。
半角の文字列は0 ~ 255の範囲、全角の文字列は-32768 ~ 32767の範囲の数値で表します。
例えば、マル囲みの数字の各OSでの文字コードはこのようになります。
Chr関数で文字コードを文字に変換する
次に、文字コードを文字に変換する「Chr関数」を使用します。
これは、指定したShift_JISの文字コードに対応する文字を指定する関数です。
Microsoftドキュメント【Chr関数】
「①」「②」「③」を変数「maru1」「maru2」「maru3」として宣言し、
Asc関数で求めた文字コードをOSの判別をしたうえでChr関数に代入します。
こうすれば、Shift_JISにしか対応していないコード入力画面に機種依存文字を直接入力することなく、機種依存文字を扱うことができるようになります。
ローマ数字や他の文字でも同じように各OSでの文字コードを調べて変数に代入していきます。
まとめ
Excel VBAにレガシーな印象を持たれる方も多いですが、職場の事情などでソフトウェアのインストールに制限があるような場合でも導入が容易なのがよいところです。
複雑な環境構築もなく、ローカル環境で実行できるので気軽にプログラムを学ぶことができます。
初心者にもおすすめできるのでぜび学んでみてください。
Excel/ExcelVBAでのお困りごとなどありましたらお気軽にご相談ください。