<CSV to Sheet> 「CSV」を「シート」へ。複数の文字コート・区切り文字に対応。QueryTablesを使用。

タイトルのマクロは、以下です。

'*******************************
'* QueryTableオブジェクトを使用して、高速にCSVをシートに取り込む。20241115改
'* filePath:ファイルパス名
'* rng:取り込むシートの先頭のRange
'* charSet:文字コード。Shift_JIS, UTF-8, UTF-7 に対応。
'*          デフォルト:Shift_JIS
'*          対応不可:Unicode, JIS, euc-jp
'* delimiter:区切り文字。Comma, Tab に対応。デフォルト:Comma
'* https://qiita.com/tiechel/items/40dd7cd7cf632bd6f41e
Sub csv_to_sheet_QueryTables(ByVal filePath As String, ByVal rng As Range, _
        Optional ByVal charSet As String = "Shift_JIS", _
        Optional ByVal delimiter As String = "Comma")
    
    On Error GoTo ErrorHandler
    Application.ScreenUpdating = False
    
    '文字列の書式用に配列を作成
    Dim Tcount(255) As Long
    Dim i As Long
    For i = 0 To 255                    ' 256列まで対応
        Tcount(i) = xlTextFormat        ' 文字列の書式を指定
    Next

    ' ワークシートオブジェクトを作成し、データをクリア
    Dim ws As Worksheet
    Set ws = rng.Parent
    ws.Cells.Clear

    ' QueryTablesオブジェクトを使用してcsvファイルを読み込む
    With ws.QueryTables.Add(Connection:="text;" & filePath, Destination:=rng)
        
    '932     Shift_JIS
    '65001       UTF -8
    '1200        Unicode
    '65000       UTF -7
    '50220       JIS
    '51932       euc -jp
        
        ' 文字コードの指定
        Select Case charSet
            Case "Shift_JIS"
                .TextFilePlatform = 932     'SHIFTJIS
            Case "UTF-8"
                .TextFilePlatform = 65001   'UTF-8
            Case "Unicode"
                MsgBox "「" & charSet & "」は対応不可です。マクロを終了します"
                End
                .TextFilePlatform = 1200    'Unicode、対応不可
            Case "UTF-7"
                .TextFilePlatform = 65000   'UTF-7
            Case "JIS"
                MsgBox "「" & charSet & "」は対応不可です。マクロを終了します"
                End
                .TextFilePlatform = 50220   'JIS、対応不可
            Case "euc-jp"
                MsgBox "「" & charSet & "」は対応不可です。マクロを終了します"
                End
                .TextFilePlatform = 51932   'euc-jp、対応不可
            Case Else                            ' 該当なしの場合
                .TextFilePlatform = 932     'SHIFTJIS
        End Select
        
        ' 区切り文字を指定
        If delimiter = "Comma" Then
            .TextFileCommaDelimiter = True      ' コンマ区切り
            .TextFileSpaceDelimiter = False     ' 空白
            .TextFileSemicolonDelimiter = False ' セミコロン
            .TextFileTabDelimiter = False       ' タブ
            .TextFileOtherDelimiter = ""        ' その他区切り
        Else
            .TextFileCommaDelimiter = False     ' コンマ
            .TextFileSpaceDelimiter = False     ' 空白
            .TextFileSemicolonDelimiter = False ' セミコロン
            .TextFileTabDelimiter = True        ' タブ区切り
            .TextFileOtherDelimiter = ""        ' その他区切り
        End If
        
        .AdjustColumnWidth = False '列の幅を自動計算しない
        .TextFileStartRow = 1       ' 取込開始行
        .TextFileParseType = xlDelimited    ' 区切り文字によって、固定長でなく
        .TextFileTextQualifier = xlTextQualifierDoubleQuote ' 文字列の引用符:"
        .TextFileConsecutiveDelimiter = False   ' 連続した区切り文字は1文字として扱う
        ' 項目の型を指定
        .TextFileColumnDataTypes = Array(Tcount)  ' 全ての項目を文字列にする
        
        .Refresh BackgroundQuery:=False ' シートにデータを出力
        .Delete     ' QueryTablesオブジェクトを削除
    End With

    ws.Activate     ' ワークシートをアクティブにする

GoTo Finally:
ErrorHandler:
    MsgBox "エラーが発生しました" & vbCrLf & Err.Description & "(" & Err.Number & ")", vbExclamation
Finally:
    Application.ScreenUpdating = True
End Sub

このVBAマクロは、QueryTablesオブジェクトを利用して、指定されたCSVファイルを指定のシートの範囲に高速に取り込むためのものです。このコードの詳細を以下に解説します。


機能の概要

  1. 高速CSVインポート:
    CSVファイルを読み込むために、ExcelのQueryTablesオブジェクトを使用しており、大量データでも効率的に処理します。
  2. 柔軟な文字コード対応:
    デフォルトではShift_JISを使用しますが、UTF-8UTF-7などを指定可能。ただし、UnicodeJISeuc-jpは対応外。
  3. 区切り文字の指定:
    デフォルトでカンマ区切りを使用しますが、タブ区切りにも対応します。
  4. 列データ型の統一:
    すべての列を文字列型として読み込むため、データの予期しない型変換を防ぎます。
  5. クリアでエラー耐性のあるコード設計:
    エラーハンドリングを含み、エラー発生時に適切にユーザーに通知します。

コードの主要な部分とその詳細説明

パラメータ

  • filePath: インポートするCSVファイルのフルパス。
  • rng: データを取り込む開始セル(例: Sheet1.Range("A1"))。
  • charSet: 文字コード(オプション)。デフォルトはShift_JIS
  • delimiter: 区切り文字(オプション)。デフォルトはカンマ。

主な処理の流れ

  1. 初期設定とエラーハンドリング:
    • Application.ScreenUpdatingFalseにして画面更新を一時停止。処理を高速化します。
    • エラーハンドリングのためのErrorHandlerラベルを設定。
  2. データ型の設定:Dim Tcount(255) As Long For i = 0 To 255 Tcount(i) = xlTextFormat Next
    • 各列(最大256列)のデータ型を文字列(xlTextFormat)に固定。
  3. 既存データのクリア:
    ws.Cells.Clear
    • 指定範囲のシートの内容をすべてクリア。
  4. QueryTablesオブジェクトの生成と設定:With ws.QueryTables.Add(Connection:="text;" & filePath, Destination:=rng)
    • 指定されたCSVファイルを、指定セル(rng)を起点として読み込む設定を開始。
  5. 文字コードと区切り文字の指定:
    • charSetに応じて適切なコードページを設定。
    • デフォルトのカンマ区切りまたはタブ区切りを設定。
  6. データインポート設定:
    • すべてのデータを文字列として読み込むためにTextFileColumnDataTypesを設定。
    • データの自動調整(列幅など)を無効化。
  7. データの読み込みと後処理:.Refresh BackgroundQuery:=False .Delete
    • データをシートに反映し、使用したQueryTablesオブジェクトを削除。
  8. エラー処理:On Error GoTo ErrorHandler MsgBox "エラーが発生しました" & vbCrLf & Err.Description & "(" & Err.Number & ")", vbExclamation
    • エラー発生時にエラーメッセージを表示。
  9. 画面更新再開:
    Application.ScreenUpdating = True

使用時の注意点

  1. サポート外の文字コード:
    UnicodeJISeuc-jpの文字コードには対応していないため、これらを指定するとメッセージボックスを表示して処理を終了します。
  2. データ型の統一:
    すべてのデータを文字列として取り込むため、数値として扱いたいデータは後で型変換が必要になる場合があります。
  3. CSVフォーマットの確認:
    区切り文字や文字コードが適切でないとデータが正しく読み込まれない可能性があります。

このマクロは、大量のCSVデータを効率的に取り込みたい場合に非常に便利です。また、エラーハンドリングや柔軟なオプション設定により、汎用性が高い構成になっています。

使用例の説明

' ファイル名・文字コード・区切り文字を指定して、csvをシートに取り込む
Sub 使用例()
    ' ファイルパス名
    Dim filePath As String
    filePath = "H:\temp\sample5.csv"
    
    Dim rng As Range
    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
    ' 文字コード
    Dim charSet As String
    charSet = "Shift_JIS"
    ' 区切り文字
    Dim delimiter As String
    delimiter = "Comma"
    
    ' QueryTableオブジェクトを使用して、高速にCSVをシートに取り込む
    Call csv_to_sheet_QueryTables(filePath, rng, charSet, delimiter)
End Sub
  • filePath にCSVファイルのパスを指定し、rng にデータを取り込むセル範囲を指定します。
  • csv_to_sheet_QueryTables を呼び出し、必要に応じて文字コードと区切り文字を指定します。

このマクロは、大量のデータを高速にExcelシートに取り込むために非常に便利です。QueryTablesオブジェクトを使用することで、データの取り込みを効率的に行い、文字コードや区切り文字を柔軟に対応できるように設計されています。

ただし、データの中に改行が入っているcsvには対応していません。

このマクロは、以下を参考にしています。感謝いたします。

https://qiita.com/tiechel/items/40dd7cd7cf632bd6f41e

Follow me!