Loading

ROUTE

ルートゼロの
アクティビティ

VBAでUTF-8 CSVを読み込む|文字化けの直し方

3

CSVをExcelで開いたら、名前や住所が「文字化け」していませんか。原因の一つは、ファイルの文字コードとExcelが読み取る文字コードの不一致です。UTF-8 のCSVなら、VBAの `Workbooks.OpenText` で `Origin:=65001` を指定する方法があります。最初にファイルの種類を確かめてから試しましょう。

最初に確認:文字化けとUTF-8とは

文字コード は、文字をファイルのバイト列へ対応付ける決まりです。同じCSVでも、UTF-8で保存されたものを別の文字コードとして開くと、日本語が読めない記号に変わることがあります。

Microsoftの案内では、UTF-8でBOM付きのCSVは通常の開き方で認識される場合があり、BOMがないファイルは「データの取得」から文字コードを指定する方法が紹介されています。環境やExcelの版によって画面の項目名が異なることがあります。

用語解説:BOM(Byte Order Mark)
ファイルの先頭に付くことがある短い印です。UTF-8のCSVで、読み取る側が文字コードを判断する手掛かりになります。

症状 最初に確認すること
日本語だけ文字化け 実際のファイルがUTF-8か、文字コードの選択が合っているか
カンマで列が分かれない 区切り文字がカンマか、タブなど別の形式か
00123が123になる Excelが数値として変換していないか(先頭ゼロを文字列で保持する)

まず画面で読み込んで原因を分ける

  1. 元のCSVをコピーし、修正や再保存はコピーに対して行います。
  2. Windows版などのExcelでは「データ」→「データの取得」→「テキスト/CSVから」を開きます。
  3. 読み込み画面で「ファイルの配信元」や文字コードをUTF-8に指定し、日本語が正しく見えるか確認します。
  4. 区切り記号がカンマで、列が期待どおりに分かれるかを確認してから読み込みます。

画面で正しく表示できれば、CSVの内容そのものよりも、取り込み時の文字コード指定が原因である可能性が高まります。逆に画面でも読めない場合は、ファイルがUTF-8ではない可能性や、元ファイルがすでに破損している可能性を疑います。


VBAでUTF-8 CSVを開くコード

次はWindows版Excelのデスクトップアプリで試すVBA例です。`Origin:=65001` はUTF-8のコードページを指定し、`Comma:=True` はカンマ区切りを示します。`FieldInfo` は1列目を文字列として読み込む設定です。作業前に元CSVを別名でバックアップしてください。

Sub ImportUtf8Csv()
    Dim filePath As Variant
    filePath = Application.GetOpenFilename("CSV Files (*.csv),*.csv")
    If VarType(filePath) = vbBoolean Then Exit Sub

    Workbooks.OpenText FileName:=CStr(filePath), _
        Origin:=65001, _
        DataType:=xlDelimited, _
        TextQualifier:=xlTextQualifierDoubleQuote, _
        Comma:=True, _
        FieldInfo:=Array(Array(1, xlTextFormat))
End Sub

ExcelのVBAエディターで標準モジュールに貼り付けて実行すると、ファイル選択後にCSVが新しいブックとして開かれます。`GetOpenFilename` はファイルを選ぶだけで、直接データを書き換えません。実行先での表示は、ご自身のExcelの版とファイルで確かめてください。

用語解説:コードページ65001
UTF-8に割り当てられる識別番号です。OpenTextの `Origin` 引数では数値で文字コードを指定できます。


サンプルCSVで試すときの注意

UTF-8で次の2行のCSVを保存し、Excelで開いた結果を確認します。`00123` は会員IDなどを想定した文字列です。

社員番号,氏名
00123,佐藤

日本語「佐藤」が正しく表示され、1列目が `00123` のまま残れば目的に沿った結果です。`FieldInfo:=Array(Array(1, xlTextFormat))` は1列目を文字列扱いしますが、他の列の先頭ゼロも保ちたい場合は、その列についても文字列指定を追加してください。

Excelが自動変換したあとで保存してしまうと、元のゼロや文字コード情報を回復できないことがあります。実験では元CSVを編集・上書きしないようにしましょう。

解決しないときのチェックリスト

  • 実際のCSVがUTF-8か。元ファイルをテキストエディターの文字コード表示で確認します。
  • 区切り文字がカンマか。タブ区切りならOpenTextの `Tab:=True` などを使います。
  • 二重引用符で囲まれた値や改行を含むCSVか。単純な文字分割では正しく扱えません。
  • Excelの版・OSが異なっていないか。OpenTextの動きは環境で検証します。
  • 列の表示が文字化けではなく、数値変換や日付変換の問題ではないか。

UTF-8のCSVなら常にOrigin 65001で直りますか?

いいえ。ファイル自体が別の文字コードだったり、破損していたり、複雑なCSV構造だったりする場合は別の原因も考えます。

文字列として保存したい列が複数ある場合は?

`FieldInfo` に対象列を追加し、Excelの自動変換を避ける設計にします。列位置は実際のCSVに合わせてください。

(VBAの基礎については『VBA配列の使い方完全ガイド』をご参照ください)

(VBAエラー確認については『VBA「実行時エラー13 型が一致しません」5つの原因』をご参照ください)

次の学習と公式資料

最初は画面操作で文字コードの違いを理解し、次にVBAで同じCSVを読み込んでみてください。複数CSVを扱う段階では、ファイルを順番に取り込む方法や、取込後のデータ型と空白行の扱いを学ぶと応用しやすくなります。

(VBA引数の原典については『Microsoft Learn:Workbooks.OpenText』をご参照ください)

(Excelでの手動読み込みについては『Microsoft Support:CSV UTF-8ファイルを正しく開くには』をご参照ください)

まずは2行の練習用CSVで、日本語と先頭ゼロの両方が残るか確認してください。

ルートゼロの採用情報を見る

RANKINGranking-icon

すべてを開示している会社です

ポジティブな面もネガティブな面も、包み隠さず誠実にお答えします。
気になることがあれば、面談の際にすべてオープンにお話します。