<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ファイルを指定のシートの範囲に高速に取り込むためのものです。このコードの詳細を以下に解説します。
機能の概要
- 高速CSVインポート:
CSVファイルを読み込むために、ExcelのQueryTables
オブジェクトを使用しており、大量データでも効率的に処理します。 - 柔軟な文字コード対応:
デフォルトではShift_JIS
を使用しますが、UTF-8
やUTF-7
などを指定可能。ただし、Unicode
やJIS
、euc-jp
は対応外。 - 区切り文字の指定:
デフォルトでカンマ区切りを使用しますが、タブ区切りにも対応します。 - 列データ型の統一:
すべての列を文字列型として読み込むため、データの予期しない型変換を防ぎます。 - クリアでエラー耐性のあるコード設計:
エラーハンドリングを含み、エラー発生時に適切にユーザーに通知します。
コードの主要な部分とその詳細説明
パラメータ
filePath
: インポートするCSVファイルのフルパス。rng
: データを取り込む開始セル(例:Sheet1.Range("A1")
)。charSet
: 文字コード(オプション)。デフォルトはShift_JIS
。delimiter
: 区切り文字(オプション)。デフォルトはカンマ。
主な処理の流れ
- 初期設定とエラーハンドリング:
Application.ScreenUpdating
をFalse
にして画面更新を一時停止。処理を高速化します。- エラーハンドリングのための
ErrorHandler
ラベルを設定。
- データ型の設定:
Dim Tcount(255) As Long For i = 0 To 255 Tcount(i) = xlTextFormat Next
- 各列(最大256列)のデータ型を文字列(
xlTextFormat
)に固定。
- 各列(最大256列)のデータ型を文字列(
- 既存データのクリア:
ws.Cells.Clear
- 指定範囲のシートの内容をすべてクリア。
QueryTables
オブジェクトの生成と設定:With ws.QueryTables.Add(Connection:="text;" & filePath, Destination:=rng)
- 指定されたCSVファイルを、指定セル(
rng
)を起点として読み込む設定を開始。
- 指定されたCSVファイルを、指定セル(
- 文字コードと区切り文字の指定:
charSet
に応じて適切なコードページを設定。- デフォルトのカンマ区切りまたはタブ区切りを設定。
- データインポート設定:
- すべてのデータを文字列として読み込むために
TextFileColumnDataTypes
を設定。 - データの自動調整(列幅など)を無効化。
- すべてのデータを文字列として読み込むために
- データの読み込みと後処理:
.Refresh BackgroundQuery:=False .Delete
- データをシートに反映し、使用した
QueryTables
オブジェクトを削除。
- データをシートに反映し、使用した
- エラー処理:
On Error GoTo ErrorHandler MsgBox "エラーが発生しました" & vbCrLf & Err.Description & "(" & Err.Number & ")", vbExclamation
- エラー発生時にエラーメッセージを表示。
- 画面更新再開:
Application.ScreenUpdating = True
使用時の注意点
- サポート外の文字コード:
Unicode
、JIS
、euc-jp
の文字コードには対応していないため、これらを指定するとメッセージボックスを表示して処理を終了します。 - データ型の統一:
すべてのデータを文字列として取り込むため、数値として扱いたいデータは後で型変換が必要になる場合があります。 - 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には対応していません。
このマクロは、以下を参考にしています。感謝いたします。