「csvファイル」を「シート」へ読み込む
このプロシージャは、引数として、「csvファイル名」と「シート名」を指定すると、csvデータが、指定のシートに、読み込まれす。
引数に、Rangeアドレスを設定すると、このアドレスが先頭になりますが、省略した場合は、”A1″が先頭になります。
次の引数に、「シート名」を設定すると、そのシートにcsvデータは読み込まれて、省略した場合は、新規シートに読み込まれます。csvファイルに見出しがない場合に、見出しのみのシートを作成しておいて、そのシートにcsvデータを読み込むときに使用できます。
'*******
'* CSVファイルをシートへ読み込む。20230707
'* https://excel-vba.work/2021/01/03/%E3%80%90vba%E3%80%91csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B7%E3%83%BC%E3%83%88%E3%81%B8%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80/
'* csvFile:csvファイル名、フルパス
'* csvSheetName:CSVファイルを読み込むシート名
'* FirstRange:先頭のRange。設定していないときは、"A1"
'* csvSheetNameFormat:ひな形になるシート名。これが設定されていない場合、新規作成
Sub csv_to_sheet(ByVal csvFile As String, ByVal csvSheetName As String, _
Optional ByVal FirstRange As String = "A1", Optional csvSheetNameFormat As String = "")
Dim Sheet As Worksheet
Dim csvSheet As Worksheet
Dim i As Long
Dim n As Variant
Dim arrDataType(255) As Long
'既にシート「csv」が存在する場合は削除
For Each Sheet In ThisWorkbook.Worksheets
If Sheet.Name = csvSheetName Then
'確認メッセージを非表示
Application.DisplayAlerts = False
'シート削除
Worksheets(csvSheetName).Delete
'確認メッセージを表示
Application.DisplayAlerts = True
End If
Next
If csvSheetNameFormat = "" Then
'シート「csv」を新規作成
Set csvSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Else
'シート「csvSheetNameFormat」をコピー
Worksheets(csvSheetNameFormat).Copy after:=Worksheets(Worksheets.Count)
Set csvSheet = ActiveSheet
End If
' シート名指定
csvSheet.Name = csvSheetName
'読み込むファイルの形式を【文字列】と指定するための配列を作成
For i = 0 To 255
arrDataType(i) = xlTextFormat
Next
'「QueryTableオブジェクト(=クエリと接続)」を作成
With csvSheet.QueryTables.Add(Connection:="TEXT;" + csvFile, Destination:=Range(FirstRange))
'区切り文字に「カンマ区切り」を指定
.TextFileCommaDelimiter = True
'文字コードに「UTF-8」を「65001」指定
'Shift_JISの場合は「932」を指定します。
.TextFilePlatform = 932
'読み込み開始行を指定
.TextFileStartRow = 1
'読み込むファイルの形式を指定
.TextFileColumnDataTypes = arrDataType
'読み込み実行
.Refresh BackgroundQuery:=False
'名前(後続で削除できるように名前を設定)
.Name = "仮テーブル"
'作成された「QueryTableオブジェクト(=クエリと接続)」を削除
.Delete
End With
'上記で作成されてしまう名前定義(仮テーブル)を削除
For Each n In ActiveWorkbook.Names
If n.Name = csvSheetName & "!" & "仮テーブル" Then
n.Delete '
End If
Next
End Sub
このプロシージャーは、「【VBA】CSVファイルをシートへ読み込む」を参考にしています。
以下が、使用例です。
Sub テスト、CSVファイルをシートへ()
Call csv_to_sheet(ThisWorkbook.Path & "\sample.csv", "TEST3")
End Sub
実行すると、以下の通り、シート「TEST3」にcsvファイルが読み込まれす。
次は、Rangeアドレスを引数で指定した例です。
Sub テスト、CSVファイルをシートへ1()
Call csv_to_sheet(ThisWorkbook.Path & "\sample.csv", "TEST3", "B2")
End Sub
実行すると、以下の通り、”B2”セルが先頭になります。
次に、ひな形シートを引数に指定した例です。
Sub テスト、CSVファイルをシートへ2()
Call csv_to_sheet(ThisWorkbook.Path & "\sample.csv", "TEST3", "A2", "TEST3format")
End Sub
シート「TEST3format」は、以下。
実行すると、以下の通り、シート「TEST3format」の”B1”セルが先頭になり、csvファイルが読み込まれます。
以下、2023年9月25日追記
タブ区切りのCSVファイルに対応できるように改造したマクロが以下です。引数に「Tab」を設定すると、タブ区切り対応になります。引数を省略すると、コンマ区切りになります。
'*******
'* CSVファイルをシートへ読み込む。20230707
'* https://excel-vba.work/2021/01/03/%E3%80%90vba%E3%80%91csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B7%E3%83%BC%E3%83%88%E3%81%B8%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80/
'* csvFile:csvファイル名、フルパス
'* csvSheetName:CSVファイルを読み込むシート名
'* FirstRange:先頭のRange。設定していないときは、"A1"
'* csvSheetNameFormat:ひな形になるシート名。これが設定されていない場合、新規作成
'* Delimiter:コンマ区切りの場合、設定不要。タブ区切りのときは、"Tab"
Private Sub csv_to_sheet(ByVal csvFile As String, ByVal csvSheetName As String, _
Optional ByVal FirstRange As String = "A1", _
Optional csvSheetNameFormat As String = "", _
Optional Delimiter As String = "Comma")
Dim Sheet As Worksheet
Dim csvSheet As Worksheet
Dim i As Long
Dim n As Variant
Dim arrDataType(255) As Long
'既にシート「csv」が存在する場合は削除
For Each Sheet In ThisWorkbook.Worksheets
If Sheet.Name = csvSheetName Then
'確認メッセージを非表示
Application.DisplayAlerts = False
'シート削除
Worksheets(csvSheetName).Delete
'確認メッセージを表示
Application.DisplayAlerts = True
End If
Next
If csvSheetNameFormat = "" Then
'シート「csv」を新規作成
Set csvSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Else
'シート「csvSheetNameFormat」をコピー
Worksheets(csvSheetNameFormat).Copy after:=Worksheets(Worksheets.Count)
Set csvSheet = ActiveSheet
End If
' シート名指定
csvSheet.Name = csvSheetName
'読み込むファイルの形式を【文字列】と指定するための配列を作成
For i = 0 To 255
arrDataType(i) = xlTextFormat
Next
'「QueryTableオブジェクト(=クエリと接続)」を作成
With csvSheet.QueryTables.Add(Connection:="TEXT;" + csvFile, Destination:=Range(FirstRange))
Select Case Delimiter
Case "Comma"
'区切り文字に「カンマ区切り」を指定
.TextFileCommaDelimiter = True
Case "Tab"
' タブ区切り
.TextFileTabDelimiter = True
End Select
'文字コードに「UTF-8」を「65001」指定
'Shift_JISの場合は「932」を指定します。
.TextFilePlatform = 932
'読み込み開始行を指定
.TextFileStartRow = 1
'読み込むファイルの形式を指定
.TextFileColumnDataTypes = arrDataType
'読み込み実行
.Refresh BackgroundQuery:=False
'名前(後続で削除できるように名前を設定)
.Name = "仮テーブル"
'作成された「QueryTableオブジェクト(=クエリと接続)」を削除
.Delete
End With
'上記で作成されてしまう名前定義(仮テーブル)を削除
For Each n In ActiveWorkbook.Names
If n.Name = csvSheetName & "!" & "仮テーブル" Then
n.Delete '
End If
Next
End Sub
“「csvファイル」を「シート」へ読み込む” に対して1件のコメントがあります。