【エクセルVBA】テキストファイルを読み込む(文字コード、改行コードを指定)(ADODB – Stream)

エクセルにテキストファイルを読み込むマクロを作ったけど、正しく読み込めているファイルもあれば、うまくいかないファイルもあるなぁ。

全然違う文字になっていたり、全行が一つのセルに読み込まれてしまったり。。
何が違うんだろう?

テキストエディタでファイルを開くと「文字コード」と「改行コード」が表示されると思うけど、ファイルごとに違ってたりしてない?

確かに、違っていますね。

正しく読み込めるファイルは、文字コードが「SJIS」で、改行コードが「CRLF」となっています。

うまくいかないファイルは、文字コードが「UTF-8」だったり、改行コードが「LF」だったりですね。

それが原因ね。
テキストファイルの読み込み方法によって、正しく認識できる文字コードや改行コードが異なるから、うまく読み込めないことがあるってことね。

んー、そうなんですか。。

文字コードや改行コードによらず、ファイルを正しく読み込むにはどうしたらいいんでしょう?

文字コードと改行コードを指定して読み込む方法があるから、その方法を使えばいいと思うよ。

はじめに

VBAでテキストファイルを読み込む時に困るのが、文字コードが「UTF-8」だったり、改行コードが「LF」の場合が多いのではないでしょうか。

テキストファイルの読み込みには「Open ~ Line Input」や「FileSystemObject – OpenTextFile」がよく使われるかもしれませんが、これらの方法で「UTF-8」のファイルを読み込むと文字化けしてしまいます。

また、Windowsでテキストファイルを扱う場合、その文字コードは「SJIS」の場合が多いのではないかと思いますが、数年前からメモ帳のデフォルト文字コードとして「UTF-8」が採用されました。

そうなると、今後は「UTF-8」のテキストファイルを扱う機会が増えるてくるのかもしれません。(テキストエディタにメモ帳を使うことはあまりないかもしれませんが)

ということで、この記事では「文字コード」「改行コード」を指定して、テキストファイルを読み込む方法を紹介します。

ソースコード

文字コードと改行コードを指定して、エクセルにテキストファイルを読み込みます。

'-----------------------------------------------------------------------
'指定のシートにテキストファイルを読み込む
'-----------------------------------------------------------------------
Sub ReadTextFile(ByRef ws As Worksheet, ByVal filePath As String, ByVal fileCharSet As String, ByVal fileLineSeparator As Long)

    With CreateObject("ADODB.Stream")          'Streamを生成
        .Charset = fileCharSet                 '文字コードを設定("UTF-8"、"EUC-JP"、"Shift-JIS"、"ISO-2022-JP"(JIS)など)
        .LineSeparator = fileLineSeparator     '改行コードを設定(-1:CRLF、10:LF)
        .Open                                  'Streamをオープン
        .LoadFromFile filePath                 'テキストファイルをStreamに読み込み
        
        Dim i As Long: i = 1
        Do Until .EOS                          'Streamの最後までループ
            ws.Cells(i, 1) = .ReadText(-2)     'Streamから1行読み込み(-1:すべて読み込み、-2:1行読み込み)
            i = i + 1
        Loop
        .Close                                 'Streamをクローズ
    End With

End Sub

テストコード

文字コードと改行コードが、それぞれ以下のようなテキストファイルを用意し、エクセルに読み込んでみます。

  • UTF-8、LF
  • EUC、CRLF
  • Shift-JIS、CRLF
  • JIS、LF
Sub Test()
    'UTF-8、LF
    Call ReadTextFile(ThisWorkbook.Worksheets("UTF-8"), "C:\00_myenv\10_macro\01_test\UTF-8_LF.txt", "UTF-8", 10)

    'EUC、CRLF
    Call ReadTextFile(ThisWorkbook.Worksheets("EUC"), "C:\00_myenv\10_macro\01_test\EUC_CRLF.txt", "EUC-JP", -1)

    'Shift-JIS、CRLF
    Call ReadTextFile(ThisWorkbook.Worksheets("Shift-JIS"), "C:\00_myenv\10_macro\01_test\Shift-JIS_CRLF.txt", "Shift-JIS", -1)

    'JIS、LF
    Call ReadTextFile(ThisWorkbook.Worksheets("JIS"), "C:\00_myenv\10_macro\01_test\JIS_LF.txt", "ISO-2022-JP", 10)
End Sub

実行結果

左側が読み込んだテキストファイル、右側がエクセルに読み込んだ結果です。

いずれも文字化けなどせず、正しく読み込めています。

UTF-8、LF
テキストファイル(UTF-8、LF)
実行結果(UTF-8)
EUC、CRLF
テキストファイル(EUC、CRLF)
実行結果(EUC)
Shift-JIS、CRLF
テキストファイル(Shift-JIS、CRLF)
実行結果(Shift-JIS)
JIS、LF
テキストファイル(JIS、LF)
実行結果(JIS)

説明

ソースコードの説明はコメントの通りです。

「ADODB.Stream」を使えば、文字コードと改行コードを指定できるため、文字化けしないで済みます。

メソッドやプロパティの詳細については、マイクロソフトのサイトを参照ください。

また、「テキストファイルの出力」でも文字コードや改行コードの指定をしたい場合は、こちらの記事を参照ください。

まとめ

文字コードと改行コードを指定して、テキストファイルをエクセルに読み込む方法の紹介でした。

文字コードにより読み込み方法を使い分けるのも煩わしいので、今回の方法一択でもよいのでは?と思います。

遭遇する機会は少ないかもしれませんが、「EUC」や「JIS」のファイルにも対応できますし、ついでに改行コードにも対応できますし。

以上、ご覧いただきありがとうございました。