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
:列幅の自動調整を無効にします。TextFileCommaDelimiter
とTextFileTabDelimiter
:区切り文字をカンマまたはタブに設定します。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オブジェクトを使用することで、データの取り込みを効率的に行い、文字コードや区切り文字を柔軟に対応できるように設計されています。
このマクロは、以下を参考にしています。感謝いたします。