「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

本サイトに関連ある記事一覧

Follow me!

「csvファイル」を「シート」へ読み込む” に対して1件のコメントがあります。

コメントを残す