QueryTableオブジェクトを使用して、高速にCSVをシートに取り込む

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

'*******************************
'* QueryTableオブジェクトを使用して、高速にCSVをシートに取り込む。20240514
'* filePath:ファイルパス名
'* rng:取り込むシートの先頭のRange
'* charSet:文字コード。Shift_JIS, UTF-8, Unicode, JIS, UTF-7, euc-jp に対応。デフォルト:Shift_JIS
'* 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)
        ' 文字コードの指定
        If charSet = "Shift_JIS" Then
            .TextFilePlatform = 932 'SHIFTJIS
        Else
            .TextFilePlatform = 65001 'UTF-8
        End If
        
        .AdjustColumnWidth = False '列の幅を自動計算しない
        
        ' 区切り文字を指定
        If delimiter = "Comma" Then
            .TextFileCommaDelimiter = True 'コンマ区切り
        Else
            .TextFileTabDelimiter = True
        End If
        
        ' 項目の型を指定
        .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

マクロの概要

  • Sub csv_to_sheet_QueryTables
    • 引数
      • filePath:CSVファイルのパス
      • rng:データを取り込むシートの先頭のセル範囲
      • charSet:文字コード(オプション、デフォルトは “Shift_JIS”)
      • delimiter:区切り文字(オプション、デフォルトは “Comma”)

コードの解説

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

エラーハンドリングと画面更新の停止を設定しています。エラーが発生した場合は ErrorHandler へジャンプします。

    '文字列の書式用に配列を作成
    Dim Tcount(255) As Long
    Dim i As Long
    For i = 0 To 255                    ' 256列まで対応
        Tcount(i) = xlTextFormat        ' 文字列の書式を指定
    Next

256列まで対応するために、すべての列を文字列形式で処理するための配列を作成します。

    ' ワークシートオブジェクトを作成し、データをクリア
    Dim ws As Worksheet
    Set ws = rng.Parent
    ws.Cells.Clear
  • データを取り込む前に、指定されたセル範囲のシートを取得し、シート全体をクリアします。
    ' QueryTablesオブジェクトを使用してcsvファイルを読み込む
    With ws.QueryTables.Add(Connection:="text;" & filePath, Destination:=rng)
        ' 文字コードの指定
        If charSet = "Shift_JIS" Then
            .TextFilePlatform = 932 'SHIFTJIS
        Else
            .TextFilePlatform = 65001 'UTF-8
        End If
        
        .AdjustColumnWidth = False '列の幅を自動計算しない
        
        ' 区切り文字を指定
        If delimiter = "Comma" Then
            .TextFileCommaDelimiter = True 'コンマ区切り
        Else
            .TextFileTabDelimiter = True 'タブ区切り
        End If
        
        ' 項目の型を指定
        .TextFileColumnDataTypes = Array(Tcount)  ' 全ての項目を文字列にする
        
        .Refresh BackgroundQuery:=False ' シートにデータを出力
        
        .Delete     ' QueryTablesオブジェクトを削除
    End With
  • QueryTable オブジェクトを作成し、CSVファイルを指定されたセル範囲に読み込みます。
    • Connection:CSVファイルのパスを設定します。
    • Destination:データの挿入先を指定します。
    • TextFilePlatform:文字コードを設定します。デフォルトは Shift_JIS(932)ですが、UTF-8(65001)もサポートします。
    • AdjustColumnWidth:列幅の自動調整を無効にします。
    • TextFileCommaDelimiterTextFileTabDelimiter:区切り文字をカンマまたはタブに設定します。
    • TextFileColumnDataTypes:すべての列を文字列形式に設定します。
    • Refresh:データをシートに出力し、バックグラウンドクエリを無効にします。
    • Delete:QueryTableオブジェクトを削除します。
    ws.Activate     ' ワークシートをアクティブにする

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

End Sub

処理が終わったら、指定されたシートをアクティブにし、エラーが発生した場合はエラーメッセージを表示します。最後に、画面更新を再有効化します。

使用例の説明

' ファイル名・文字コード・区切り文字を指定して、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オブジェクトを使用することで、データの取り込みを効率的に行い、文字コードや区切り文字を柔軟に対応できるように設計されています。

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

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

Follow me!