VBAでUTF-8のテキスト読み込み時の文字化け対策

Blog Admin
Blog Admin

Excelマクロでテキストファイルを読み込む処理を書きました。
Shift JIS形式のファイルはうまく処理できたのですが、UTF-8形式のファイルは文字化けしてしまいました。

VBA

Excel VBA
UTF-8のテキストファイル

ExcelでUTF-8は文字化けしてしまうのですね。
文字コードを指定すれば解決できるので、その方法で対策しました。

付け焼刃的な対策も試したのですが。。
どうにも上手くいきませんでした。
大した書き換え量ではないので、処理ごと変更です。

Line Inputだと文字化けする問題

ExcelとUTF-8は、あまり相性がよくないようです。
何もせずに扱おうとすると、文字化けします。

Excel VBAはなんとなくでも暗黙変換してくれる便利なプログラミングだと思っていたのですが。。
ファイルの読み込みはダメでした。。
文字コードは難しいですね。
最近は厳格化されてきているような気もします。

S-JISは問題ないがUTF-8は無理らしい

これまではShift JIS形式のファイルを扱っていました。
かなり前に書いたコードを流用してしまえば済むようなものだったわけです。

ところが最近、UTF-8形式のファイルを扱う処理を書くことになりました。
Googleのサービスからダウンロードしてきたテキスト形式(XML形式)のファイルがUTF-8だったのです。
あまり深く考えずに処理しようとしたら、めちゃくちゃな結果になってしまって、びっくり仰天でした。。

読み込み後の文字コード変換も試したが

文字コードが怪しいことは明白だったわけです。
確認したら「UTF-8」だったわけですし。。

付け焼刃的に、読み込んだ文字列の文字コードを変換してみようとも思ったのですが、そもそもよい処理がありません。

最初から処理全体を書き換えてしまったほうが早かったですね。。
ずいぶんと時間を使ってしまいました。

ADODB.Streamで解決

書いたコードのデフォルメはこちらです。

Dim i As Long
i = 1
Dim CO As Object
Set CO = CreateObject("ADODB.Stream")
With CO
    .Charset = "UTF-8"
    .LineSeparator = -1                             ' -1: CRLF
    .Open
    .LoadFromFile ★ファイル名★
    Do Until .EOS
        ★シート★.Cells(i, 1) = .ReadText(-2)      ' -2: 1行ずつ
        i = i + 1
    Loop
    .Close
End With
Set CO = Nothing

ADODB.Streamのメソッドを使っていきます。
先に文字コードを指定します。いっしょに改行コードも指定できるのですが、こちらは指定しなくても大丈夫でした。

Openしてから1行ずつ読み込んで、処理が終わったらCloseです。

オブジェクトの直接指定でも大きな問題にはならない

コードをなるべく圧縮したいような場合は、オブジェクトを直接指定してもよいわけですが。。
あまり好きではないのですよね。

Dim i As Long
i = 1
With CreateObject("ADODB.Stream")
    .Charset = "UTF-8"
    .LineSeparator = -1                             ' -1: CRLF
    .Open
    .LoadFromFile ★ファイル名★
    Do Until .EOS
        ★シート★.Cells(i, 1) = .ReadText(-2)      ' -2: 1行ずつ
        i = i + 1
    Loop
    .Close
End With

メモリー解放などはあまり考えなくてもよいのですが、どうしても気持ち悪いのです。
実際、テストで何度も実行していくと、処理が極端に重くなることがありましたし。

この投稿を書いたのは・・・
Blog Admin

ガジェットが大好きで、ほぼ毎月何かしら調達しております。
無駄遣い扱いされたくないのと、何かの役に立つかと思い、記録を書くことにしたのでした。

お出かけのときには、スマホを複数台とタブレットとパソコンを持ち歩きます。
両手首にはスマートウォッチです。
こんなスタイルで生活している中での備忘録を書いています。

「Blog Admin」をフォローしてみる
Excel関連
「Blog Admin」をフォローしてみる

ご意見やご感想などお聞かせください! コメント機能です。

タイトルとURLをコピーしました