編集

【ExcelVBA】UTF-8のCSVをExcelのシートに取り込む

2025/03/26
Excel#004 UTF-8のCSVをExcelのシートに取り込む

今回は、UTF-8のCSVをExcelのシートに取り込むコードをご紹介します。Excelファイル同士であれば、単純にコピー&貼り付けでも十分ですが、UTF-8のCSVはExcelで単純に開くと文字化けなどを起こして素直に読み込めません。

動作としては、参照ボタンを押してファイルを選択した後、読み込み開始ボタンを押すことで新しいシートにCSVデータを書き出す処理を行います。

なお、参照ボタンのファイルの選択ダイアログツールについては下記の記事をご参照ください。

【ExcelVBA】ファイル選択ダイアログを表示させる | ともゆきの独り言(雑記ブログ)

【ExcelVBA】ファイル選択ダイアログを表示させる | ともゆきの独り言(雑記ブログ)

ExcelVBAでファイル選択ダイアログを表示して、選択したファイルパスを表示させる処理の備忘録です。今回はユーザーインターフェースの部分になるため、簡単な画面設計も含めてご紹介いたします。

画面設計

画面設計

  • シート名:設定情報
  • セルD4:「入力ファイル」として名前付け
  • 参照ボタン:ファイル選択のマクロの登録
  • 読み込み開始ボタン:CSV取り込みのマクロの登録

入力データ

入力データ

ファイル名:テストデータ.csv

形式はUTF-8(BOM付き)のカンマ区切りです。全ての項目がダブルクォーテーションで囲まれていないパターンです。単価のところのみ「”」で囲まれています

処理実行結果

処理実行結果

金額のカンマでズレることなく取り込めています。

UTF-8 CSV取り込み - ソースコード(ExcelVBA)

Option Explicit
Private ObjADO As ADODB.Stream 'Microsoft ActiveX Data Objects X.X Library
Private ObjFSO As FileSystemObject 'Microsoft Scripting Runtime
──────────────────────────────────────────────────────────────────────────────
Sub MainProcess()

    Set ObjADO = New ADODB.Stream
    Set ObjFSO = New FileSystemObject
    
    Dim WS As Worksheet
    Dim CSVFile As String
    Set WS = ThisWorkbook.Worksheets("設定情報")
    CSVFile = WS.Range("入力ファイル")

    Call CSVImport(CSVFile)

End Sub
──────────────────────────────────────────────────────────────────────────────
Sub CSVImport(ByRef filePath As Variant)
   
    'レコード数取得
    Dim csvRow As Long
    With ObjFSO.OpenTextFile(filePath, 8)
        csvRow = .Line
        .Close
    End With
    Set ObjFSO = Nothing
    
    '新規シート作成
    Dim newWS As Worksheet
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "CSV"
    Set newWS = ActiveSheet
    
    'CSV取り込み
    Dim readString As String
    Dim tmp As Variant
    Dim i As Long
    Dim j As Long
    ReDim Arry(0 To csvRow, 100)
    ObjADO.Type = 2 'テキストのデータ型を指定(1:adTypeBinary…バイナリデータ/2:adTypeText…テキストデータ)
    ObjADO.Charset = "utf-8" '文字コードを指定(UTF-8/Shift_JIS/euc-jp/ISO-2022-JP/Unicode など)
    ObjADO.LineSeparator = -1 '改行コードを指定(13:adCR/-1:adCRLF/10:adLF)
    ObjADO.Open 'Streamのオープン
    ObjADO.LoadFromFile (filePath) 'ファイル読み込み
    Do While Not ObjADO.EOS
        readString = ObjADO.readText(-2) 'テキストを1行読み込む
        readString = replaceColon(readString)  '受け取った文字列のカンマをコロンに置き換える(ダブルクォーテーションで囲まれているカンマは置き換えない)
        tmp = Split(Replace(replaceColon(readString), """", ""), ":") 'strLineをコロンで区切り配列に格納
        For j = 0 To UBound(tmp)
            Arry(i, j) = tmp(j)
        Next j
        i = i + 1
    Loop
    ObjADO.Close 'Streamのクローズ
    Set ObjADO = Nothing

    '配列の転記
    Range("A1:CR" & csvRow + 1) = Arry
    
End Sub
──────────────────────────────────────────────────────────────────────────────
Function replaceColon(ByVal str As String) As String

    Dim strTemp As String
    Dim quotCount As Long
    Dim l As Long
    For l = 1 To Len(str)  'strの長さだけ繰り返す
        strTemp = Mid(str, l, 1) 'strから現在の1文字を切り出す
        If strTemp = """" Then   'strTempがダブルクォーテーションなら
            quotCount = quotCount + 1   'ダブルクォーテーションのカウントを1増やす
        ElseIf strTemp = "," Then   'strTempがカンマなら
            If quotCount Mod 2 = 0 Then   'quotCountが2の倍数なら
                str = Left(str, l - 1) & ":" & Right(str, Len(str) - l)   '現在の1文字をコロンに置き換える
            End If
        End If
    Next l
    replaceColon = str

End Function

UTF-8 CSV取り込み - ポイント

  1. 実行にはツールの参照設定から「Microsoft ActiveX Data Objects X.X Library」「Microsoft Scripting Runtime」にチェックを入れてください。
  2. CSV取り込み、ダブルクォーテーションの置き換え処理の詳細は下記Webサイト様(いつも隣にITのお仕事:高橋先生)をご参照ください。いつも大変お世話になっております。

▼UTF-8のCSV取り込み
文字化けよさようなら!エクセルVBAでUTF-8のCSVを読み込む方法

文字化けよさようなら!エクセルVBAでUTF-8のCSVを読み込む方法

エクセルVBAのLine Input命令でUTF-8のCSVファイルを取り込むと文字化けを起こします。今回は、ADODB.Streamを使ってUTF-8のCSVファイルを取り込む方法についてお伝えします。

▼データにカンマが含まれている場合のCSV取り込み
エクセルVBAでデータにカンマが含まれてしまっているCSVを取り込む

エクセルVBAでデータにカンマが含まれてしまっているCSVを取り込む

エクセルVBAで様々なタイプのCSVを取り込んでいきます。今回は、意外と多いパターンであるデータの中にカンマが含まれている場合のCSVをエクセルVBAで取り込む方法についてお伝えしていきます。