【Excel VBA】UTF-8のCSVを文字化けさせずに読み込み・保存する方法

みなさんこんにちは。

Excel VBAを使用してCSVファイルを読み込んだときに、日本語が文字化けしてしまった経験をしたことがある方も多いかと思います。

CSVファイルにはShift-JISやUTF-8など複数の文字コードがあり、Excel側で想定している文字コードとCSVファイルの文字コードが一致していない場合、文字化けが発生することがあります。

そこで今回は、Excel VBAを使用してUTF-8のCSVを文字化けさせずに読み込む方法と、ExcelのデータをUTF-8形式のCSVとして保存する方法についてご紹介したいと思います。

この記事はこんな人におすすめ

  • UTF-8のCSVをExcel VBAで読み込みたい方
  • CSVを開くと日本語が文字化けして困っている方
  • ExcelのデータをUTF-8形式のCSVとして保存したい方
  • CSVの文字コードを指定して処理を自動化したい方

UTF-8のCSVで文字化けが発生する原因

CSVファイルは、見た目が同じ「.csv」であっても、ファイル内部では異なる文字コードが使用されている場合があります。

特に日本語環境ではShift-JIS系の文字コードで作成されたCSVも多く、UTF-8で作成されたCSVをExcelが別の文字コードとして解釈すると、日本語部分が文字化けしてしまうことがあります。

そのため、VBAからUTF-8のCSVを開く場合は、Excelに対して「このCSVはUTF-8です」と文字コードを明示して読み込むことがポイントとなります。

UTF-8のCSVをShift-JISとして読み込み日本語が文字化けしたExcel画面
【画面キャプチャー①】UTF-8のCSVを通常の方法で開き、日本語が文字化けしている状態

Workbooks.OpenTextでUTF-8を指定してCSVを読み込む

UTF-8のCSVを文字化けさせずに読み込む場合は、Workbooks.OpenTextを使用して文字コードを指定します。

Origin65001を指定することで、UTF-8としてCSVを読み込むことができます。

Sub OpenUtf8Csv()

    ' 読み込むCSVファイルのフルパスを格納する変数
    Dim csvPath As String

    ' Excelファイルが保存されているフォルダ内の
    ' sample_utf8.csvを読み込み対象として指定
    csvPath = ThisWorkbook.Path & "\sample_utf8.csv"

    ' 指定したCSVファイルが存在するか確認
    ' ファイルが存在しない場合はメッセージを表示して処理を終了
    If Dir(csvPath) = "" Then
        MsgBox "CSVファイルが見つかりません。" & vbCrLf & csvPath
        Exit Sub
    End If

    ' CSVファイルをUTF-8として開く
    ' Origin:=65001 を指定することで文字コードをUTF-8として読み込む
    ' DataType:=xlDelimited で区切り文字形式のファイルとして指定
    ' TextQualifier:=xlTextQualifierDoubleQuote でダブルクォートを文字列の囲み文字として指定
    ' Comma:=True でカンマ区切りのCSVとして読み込む
    Workbooks.OpenText _
        Filename:=csvPath, _
        Origin:=65001, _
        DataType:=xlDelimited, _
        TextQualifier:=xlTextQualifierDoubleQuote, _
        Comma:=True

End Sub
Excel VBAのWorkbooks.OpenTextでOriginに65001を指定してUTF-8のCSVを読み込むコード画面
【画面キャプチャー②】Workbooks.OpenTextでOrigin:=65001を指定しているVBAコード

Origin:=65001がポイント

今回のコードで特に重要なのが、次の部分となります。

Origin:=65001

Originには読み込むテキストファイルの文字コードに対応するコードページを指定することができます。

UTF-8の場合はコードページ番号が65001となるため、これを明示することでExcelにUTF-8としてCSVを読み込ませることができます。

Excel VBAでUTF-8のCSVを文字化けせずに正常に読み込めた画面
【画面キャプチャー③】UTF-8のCSVを文字化けせずに読み込めた状態

ExcelのデータをUTF-8のCSVとして保存する

次に、ExcelのシートにあるデータをUTF-8形式のCSVとして保存する方法をご紹介します。

UTF-8形式で保存する場合は、SaveAsFileFormatxlCSVUTF8を指定します。

Sub SaveSheetAsUtf8Csv()

    ' UTF-8形式で保存するCSVファイルのフルパスを格納する変数
    Dim csvPath As String

    ' CSVとして保存するシートを格納する変数
    Dim targetSheet As Worksheet

    ' CSV保存用に一時的に作成されるブックを格納する変数
    Dim csvBook As Workbook

    ' Excelファイルが未保存の場合は保存先フォルダを取得できないため処理を終了
    If ThisWorkbook.Path = "" Then
        MsgBox "先にExcelファイルを保存してください。"
        Exit Sub
    End If

    ' CSVとして保存する対象シートを指定
    Set targetSheet = ThisWorkbook.Worksheets("Sheet1")

    ' Excelファイルと同じフォルダにUTF-8形式のCSVを保存
    csvPath = ThisWorkbook.Path & "\output_utf8.csv"

    ' 対象シートを新しいブックへコピー
    ' 元のExcelブックをCSV形式へ変更しないための処理
    targetSheet.Copy

    ' コピーによって作成された新しいブックを取得
    Set csvBook = ActiveWorkbook

    ' 既存ファイルの上書き確認メッセージを一時的に非表示
    Application.DisplayAlerts = False

    ' 新しいブックをUTF-8形式のCSVとして保存
    ' xlCSVUTF8を指定することでUTF-8のCSVとして出力
    csvBook.SaveAs _
        Filename:=csvPath, _
        FileFormat:=xlCSVUTF8, _
        Local:=True

    ' CSV保存用に作成した一時ブックを閉じる
    ' すでにSaveAsで保存済みのため追加保存は行わない
    csvBook.Close SaveChanges:=False

    ' Excelの確認メッセージ表示を元に戻す
    Application.DisplayAlerts = True

    ' 保存完了をメッセージで通知
    MsgBox "UTF-8形式でCSVを保存しました。" & vbCrLf & csvPath

End Sub

この方法では対象シートを一度新しいブックへコピーしてからCSVとして保存しています。

元のExcelファイル自体をCSV形式へ変更してしまうことを防ぐため、業務で使用する場合にも扱いやすい方法かと思います。

Excel VBAでxlCSVUTF8を指定してUTF-8形式のCSVを保存するコード画面
【画面キャプチャー④】SaveAsでFileFormat:=xlCSVUTF8を指定しているVBAコード

xlCSVとxlCSVUTF8の違い

CSVを保存する際に注意したいのが、xlCSVxlCSVUTF8の違いです。

  • xlCSV:通常のCSV形式として保存
  • xlCSVUTF8:UTF-8形式のCSVとして保存

外部システムへの取り込みなどで「UTF-8のCSVを指定してください」といった要件がある場合は、xlCSVUTF8を使用するようにしてください。

先頭の0が消える場合には注意

文字化けとは別の問題になりますが、CSVをExcelで読み込む際には「001234」のような値が数値として認識され、先頭の0が削除される場合があります。

社員番号や商品コードなど、先頭の0を残す必要がある列については、FieldInfoを使用して文字列として読み込むなど、列のデータ型についても確認するようにしてください。

まとめ

いかがでしたでしょうか。

UTF-8のCSVをVBAで扱う場合は、読み込み時と保存時の両方で文字コードを意識することが重要となります。

  • 読み込み時はWorkbooks.OpenTextOrigin:=65001を指定する
  • 保存時はFileFormat:=xlCSVUTF8を指定する
  • 元のExcelブックを変更したくない場合は対象シートを別ブックへコピーしてからCSV保存する

CSVの文字化けで困っている方は、まず読み込むCSVファイルの文字コードを確認したうえで、今回ご紹介した方法を試してみてください。

少しでもお役立ていただければ幸いです。

開発依頼について

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

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

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

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

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

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

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

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

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

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

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

コメントを残す

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

CAPTCHA