【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です」と文字コードを明示して読み込むことがポイントとなります。

Workbooks.OpenTextでUTF-8を指定してCSVを読み込む
UTF-8のCSVを文字化けさせずに読み込む場合は、Workbooks.OpenTextを使用して文字コードを指定します。
Originに65001を指定することで、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

Origin:=65001がポイント
今回のコードで特に重要なのが、次の部分となります。
Origin:=65001
Originには読み込むテキストファイルの文字コードに対応するコードページを指定することができます。
UTF-8の場合はコードページ番号が65001となるため、これを明示することでExcelにUTF-8としてCSVを読み込ませることができます。

ExcelのデータをUTF-8のCSVとして保存する
次に、ExcelのシートにあるデータをUTF-8形式のCSVとして保存する方法をご紹介します。
UTF-8形式で保存する場合は、SaveAsのFileFormatにxlCSVUTF8を指定します。
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形式へ変更してしまうことを防ぐため、業務で使用する場合にも扱いやすい方法かと思います。

xlCSVとxlCSVUTF8の違い
CSVを保存する際に注意したいのが、xlCSVとxlCSVUTF8の違いです。
xlCSV:通常のCSV形式として保存xlCSVUTF8:UTF-8形式のCSVとして保存
外部システムへの取り込みなどで「UTF-8のCSVを指定してください」といった要件がある場合は、xlCSVUTF8を使用するようにしてください。
先頭の0が消える場合には注意
文字化けとは別の問題になりますが、CSVをExcelで読み込む際には「001234」のような値が数値として認識され、先頭の0が削除される場合があります。
社員番号や商品コードなど、先頭の0を残す必要がある列については、FieldInfoを使用して文字列として読み込むなど、列のデータ型についても確認するようにしてください。
まとめ
いかがでしたでしょうか。
UTF-8のCSVをVBAで扱う場合は、読み込み時と保存時の両方で文字コードを意識することが重要となります。
- 読み込み時は
Workbooks.OpenTextのOrigin:=65001を指定する - 保存時は
FileFormat:=xlCSVUTF8を指定する - 元のExcelブックを変更したくない場合は対象シートを別ブックへコピーしてからCSV保存する
CSVの文字化けで困っている方は、まず読み込むCSVファイルの文字コードを確認したうえで、今回ご紹介した方法を試してみてください。
少しでもお役立ていただければ幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
