【Excel VBA】CSVファイルをUTF-8で出力する方法|文字化けを防ぐADODB.Streamの使い方
みなさんこんにちは。
VBAでCSVを出力した際、日本語が文字化けした経験はないでしょうか。原因の一つは、出力側と読み込み側の文字コードの違いです。
今回は、ADODB.StreamでCSVをUTF-8出力する方法をご紹介します。
通常のCSV出力で文字化けする理由
Open ~ For OutputとPrint #による出力では、Windows側の文字コードが使われ、UTF-8で読み込むと文字化けする場合があります。
文字コードを指定できるADODB.Streamを使いましょう。
今回使用するExcelデータ
Sheet1のA1~C4に、次のように入力してください。
| セル | 内容 |
|---|---|
| A1~C1 | 商品コード / 商品名 / 備考 |
| 2行目 | A001 / りんご / 青森県産 |
| 3行目 | A002 / みかん / 甘い, おすすめ |
| 4行目 | A003 / ぶどう / 限定商品 |

ADODB.StreamでUTF-8のCSVを出力する
A~C列を、ブックと同じフォルダへsample_utf8.csvとして出力します。ブックは先に保存してください。
Option Explicit
Sub ExportUtf8Csv()
Dim ws As Worksheet
Dim stm As Object
Dim lastRow As Long, r As Long, c As Long
Dim csvText As String, lineText As String
Dim cellText As String, filePath As String
'出力元のシートを指定する
Set ws = ThisWorkbook.Worksheets("Sheet1")
'ブックを保存していない場合は終了する
If ThisWorkbook.Path = "" Then
MsgBox "先にExcelファイルを保存してください。"
Exit Sub
End If
'A列の最終行を取得する(A~C列を出力)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'1行目から最終行までCSV文字列を作成する
For r = 1 To lastRow
lineText = ""
'各行のA~C列をカンマ区切りにする
For c = 1 To 3
'セルの値を文字列に変換する
cellText = CStr(ws.Cells(r, c).Value2)
'セル内のダブルクォーテーションを二重化する
cellText = Replace(cellText, """", """""")
'2列目以降の前にカンマを付ける
If c > 1 Then lineText = lineText & ","
'値をダブルクォーテーションで囲む
lineText = lineText & """" & cellText & """"
Next c
'1行分を改行付きで追加する
csvText = csvText & lineText & vbCrLf
Next r
'参照設定不要の遅延バインディングでStreamを作成
Set stm = CreateObject("ADODB.Stream")
stm.Type = 2 '2:テキスト型
stm.Charset = "utf-8" 'UTF-8を指定する
stm.Open
'CSV文字列を書き込み、既存ファイルは上書きする
stm.WriteText csvText
filePath = ThisWorkbook.Path & "\sample_utf8.csv"
stm.SaveToFile filePath, 2 '2:上書き保存
stm.Close
Set stm = Nothing
'保存したファイルの場所を表示する
MsgBox "CSVを出力しました。" & vbCrLf & filePath
End Sub
コードのポイント
stm.Type = 2でテキスト型に設定し、stm.Charset = "utf-8"で文字コードを指定します。WriteTextで書き込み、SaveToFileで保存する流れとなります。
各項目を引用符で囲み、"を二重化するため、カンマや改行を含むセルもCSVに出力できます。

出力結果とBOMの注意点
マクロ実行後、sample_utf8.csvをVSCodeなどのテキストエディターで開き、日本語が正しく表示されるか確認してください。

この方法で出力すると通常はUTF-8(BOM付き)となります。取り込み先によってはBOMなしが必要なので、仕様を確認してください。
コードはA列の最終行を基準にA~C列を出力します。日付などは必要に応じて変換してください。
最後に
いかがでしたでしょうか。今回はADODB.StreamでCSVをUTF-8出力する方法をご紹介しました。文字コードは読み込み側と合わせてください。少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
