【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 / ぶどう / 限定商品
Excel VBAでUTF-8形式のCSVファイルを出力するための商品コードと日本語データ

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などのテキストエディターで開き、日本語が正しく表示されるか確認してください。

Excel VBAのADODB.Streamで出力したCSVファイルをVSCodeで開きUTF-8の文字コードを確認した画面

この方法で出力すると通常はUTF-8(BOM付き)となります。取り込み先によってはBOMなしが必要なので、仕様を確認してください。

コードはA列の最終行を基準にA~C列を出力します。日付などは必要に応じて変換してください。

最後に

いかがでしたでしょうか。今回はADODB.StreamでCSVをUTF-8出力する方法をご紹介しました。文字コードは読み込み側と合わせてください。少しでも参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA