VBAに限らず、プログラミング言語でテキストファイル(csvを含む)を扱うには、文字コードやエンコードというのを意識する必要があります。
ここでは、Shift-JIS、UTF-8、Unicodeといった、文字コード・エンコードがらみでよく出てくる用語について、ご説明いたします。
また、テキストファイルを扱う際に意識しておきたい改行コードについても、併せて言及いたします。
文字コードとは
はじめに
文字コードとは、コンピュータ上で文字を扱うために、文字に割り当てられた固有の番号のことです。
コンピュータでは2進数しか扱えないため、文字を数字(2進数の集まり)に置き換えて扱っています。
このときの文字⇒数字への置き換えの方法に、何種類かのルールがあるため、文字を書き込んだときのルールで読み込まないと、いわゆる文字化けを起こしてしまい、文字を読み込めません。
先ほど、『文字コードとは、文字に割り当てられた番号』と述べましたが、一般的には、『文字⇒数字への置き換えルールの名称』を「文字コード」と呼ぶことが多いです。
また、「文字コード」というのは広義の分類であり、正確には「符号化文字集合」 と 「文字符号化方式」を総称して、「文字コード」と呼びます。
この説明は非常に難しいのですが(と言うか私もちゃんと理解できていないと思います・・・)ざっくり言うと、以下のような感じです。
- 符号化文字集合:文字の種類についてのルール
- 文字符号化形式:テキストファイルの保存方法についてのルール
「エンコード」と言うことも多いです
符号化文字集合の代表例
ASCII | 英数字・記号を扱うための規格。ANSI(米国規格協会)が定めた。 |
JIS X 0201 | 英数字・記号に加え、半角カナを扱えるようにした規格。JIS(日本産業規格)が定めた。 |
JIS X 0208 | 日本語(全角ひらがな・カタカナ・漢字)を扱うための規格。JIS(日本産業規格)が定めた。 |
Unicode | 日本語、ロシア語、ギリシャ語、記号……など、世界中のほとんど全ての文字をカバーできるようにした規格。 当初は2バイトで表そうとしたが、世界中の文字を収録するには2バイトでは足りなかった。 そのため、4 バイトで表される文字(サロゲートペアと呼びます)もある。 JIS X 0208では扱えない「㉑」などの記号や、「𠮷」などの文字(サロゲートペア)を扱える。 |
文字符号化形式(エンコードの種類)の代表例
Shift_JIS | JIS X 0201とJIS X 0208を扱うためにMicrosoftが開発した方式。 |
UTF-8 | Unicodeを扱う方式(ASCIIも包括する)。英数字は1バイト、日本語は3~4バイトの可変長で表現する。 Webサイトで広く使われており、Windows11のメモ帳ではデフォルトで扱う方式になった。 |
UTF-16 | Unicodeを扱う方式(ASCIIも包括する)。2~4バイトの可変長で表現する。 |
Unicodeでしか扱えない文字の制約
Visual Basic Editorで扱えない
Visual Basic Editorにて、㉑のようにUnicodeでしか扱えない文字を入力しようとすると、下図のように「?」に化けてしまいます。

VBAのDir関数で扱えない
指定されたフォルダ内のファイル名を返す「Dir関数」ですが、ファイル名にUnicodeでしか扱えない文字(㉑など)が含まれると、これまた「?」に化けてしまいます。
※そもそもVisual Basic Editorで扱えない文字なので、他にも扱えないVBA関数があるかもしれません。
例:「C:\work」フォルダに、「サンプル㉑.txt」 というファイルを置いておく


VBAにてDir関数を実行
Sheets("Sheet1").Range("A1") = Dir("C:\work\サンプル*")

「㉑」が「?」に化けて出力された

回避方法
ちょっと面倒ですが、以下のように「FileSystemObject」というのを使うと、㉑のような文字も扱えます。
ざっくりですが、コメントに説明を書いておきました。
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを作成
Dim objFolder As Object
Set objFolder = objFso.GetFolder("C:\work") 'フォルダをObject変数にSet
Dim objFile As Object 'ファイル情報取得用のObject変数
Dim Ix1 As Integer: Ix1 = 1 'Excelの行番号カウント用
For Each objFile In objFolder.Files 'フォルダ内のファイルを1つずつ取得
Sheets("Sheet1").Cells(Ix1, 1) = objFile.Name 'ファイル名を出力
Ix1 = Ix1 + 1
Next

「㉑」が化けずに出力された

「BOM」について
「BOM」とは?
Unicodeで書かれたテキストファイルの先頭に付ける、「このファイルはUnicodeで書かれています」ということを示す3バイトの目印データのことです。
BOMあり/なしでのExcelとAccessでの扱い
BOMが無いCSVファイルは、Excelで開いたときに文字化けが起こります。
一方で、BOMが有るCSVファイルは、Accessでインポートできません。
つまり、下表のようになります。
BOM | Excel | Access |
---|---|---|
あり | ○(開ける) | ×(インポート不可) |
なし | ×(開けない) | ○(インポート可) |
BOMの付け外しをVBAで行う方法
かなり長くなりますので(と言ってもソースのコピペで対応可能ですが)、「大体でIT」様の下記サイトをご覧いただければと思います。
エンコードの種類の判別方法
テキストファイルにはエンコードの種類を完全に判別する仕組みはありません(BOM付きを除く)。
「XXというバイトは、文字コードYYYにしか出現しないから、エンコードの種類はYYYだ!」と判別するしかありません。
「じゃあ具体的にどうやるの?」ということですが、こちらもかなり長くなりますので、「ddxb-0x41」様のQiitaの下記記事をご覧いただければと思います。
ちなみに、テキストエディタでファイルを開くと、自動判定されたエンコードの種類と、BOMの有無が表示されます。
以下は、Windows 11のメモ帳の例です。

なお、Windows 11のメモ帳以外で、システム開発でよく使われるエディタ(VS Code、サクラエディタ、秀丸エディタ、など)では、エンコードの種類と、BOMの有無を変更できる機能が備わっています。
改行コードについて
最後に、改行コードの違いについてご説明いたします。
「改行」を表す文字コードには、下表の通り3種類があります。
OSによって、扱う文字コードが違うのですが、「Excelのセル内改行については、vbLfが使われる」ことを、知っておくと良いです。異なる改行コードが混在するファイルを扱うときに、ハマりやすいポイントです。
VBAでの定数名 | 16進でのコード値 | VBAのChr関数を 使った表記方法 | 用途 |
---|---|---|---|
vbCrLf | 0x0D + 0x0A の2バイトの組合せ | Chr(13) & Chr(10) | Windows OSで使われている。 |
vbCr | 0x0D | Chr(13) | MacOS 9以前で使われている。 |
vbLf | 0x0A | Chr(10) | Unix, Linux, MacOS(9以降), Androidで使われている。 また、Excelのセル内改行も、このコードである。 |
コメント