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

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
メモリー解放などはあまり考えなくてもよいのですが、どうしても気持ち悪いのです。
実際、テストで何度も実行していくと、処理が極端に重くなることがありましたし。
ご意見やご感想などお聞かせください! コメント機能です。