「あぁ、また文字化けしてる…」
職場で、システムからダウンロードしたCSVファイルを開いた瞬間、画面に並ぶ謎の記号。上司からは「これ、今日中に集計しておいて」と頼まれ、手作業で1つずつ「名前を付けて保存」から文字コードを変える作業。気づけば時計の針は1時間進んでいる……。
そんな経験はありませんか?
実は、VBAの定番ツールである「FSO(FileSystemObject)」のTextStreamは非常に便利である反面、現代の標準規格である「UTF-8」形式の読み書きが苦手という弱点があります。
私も入社1年目の頃、これを知らずに「コードは合ってるはずなのに、なぜ!?」と3時間ほどモニターの前で悪戦苦闘した経験があります。
でも、大丈夫です。この記事を読めば、その壁をたった数分で突破できるようになります。
FSOの「限界」を知る
FSOのOpenTextFileメソッドは、直感的にファイルを操作できる上に処理も高速です。
しかし、この方法で正常に扱えるのは、基本的には「Shift-JIS」か「Unicode(UTF-16)」のみとなります。
現代のWebシステムやクラウドサービスから出力されるデータは、その多くが「UTF-8」形式を採用しています。
これをFSOで無理やり開こうとするのは、「日本語しか話せない人に、アラビア語の小説を読ませる」ようなもの。当然、意味不明な記号(文字化け)が出てくるわけです。
壁を壊す秘密兵器「ADODB.Stream」
「それなら、VBAでUTF-8を扱うのは諦めるしかないのか……」と言えば、決してそんなことはありません。
代わりに「ADODB.Stream」という標準オブジェクトを使います。これは、さまざまな文字コードを自在に相互変換できる「万能な翻訳機」のような存在になります。
コピペで動く!UTF-8対応テンプレート
以下のコードをVBAのエディタに貼り付けてみてください。
特別な事前準備(参照設定)なしでも動く「後期バインディング」方式で書いています。
Sub ReadWriteUTF8()
' --- 変数の準備 ---
Dim reader As Object
Dim writer As Object
Dim textContent As String
Dim inputPath As String
Dim outputPath As String
' ファイルパスを指定(自分の環境に合わせて変えてください)
inputPath = "C:\temp\input_utf8.csv"
outputPath = "C:\temp\output_utf8.txt"
' --- 1. UTF-8ファイルを読み込む ---
Set reader = CreateObject("ADODB.Stream")
With reader
.Type = 2 ' テキスト形式を指定
.Charset = "UTF-8" 'UTF-8を指定
.Open
.LoadFromFile inputPath
textContent = .ReadText ' 中身をまるごと変数に入れる
.Close
End With
' --- 2. 読み込んだデータを少し加工(例:文末に追記) ---
textContent = textContent & vbCrLf & "【処理完了】" & Now
' --- 3. UTF-8ファイルとして書き出す ---
Set writer = CreateObject("ADODB.Stream")
With writer
.Type = 2
.Charset = "UTF-8"
.Open
.WriteText textContent
.SaveToFile outputPath, 2 ' 2は「上書き保存」
.Close
End With
MsgBox "作業が終わりました!"
End Sub
最後に
今回紹介したように、VBAのツールやオブジェクトにはそれぞれ「得意・不得意」があります。
実務の現場ではこうした「最適な道具を選ぶ知識」があるかどうかが、定時で帰宅できるか、深夜まで残るかの分かれ道になります。私自身も昔は失敗の連続でしたが、ひとつずつ適切な「道具」の扱い方を覚えることで、今では定時退社が当たり前の日常になりました。
一緒にがんばっていきましょう!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント