Excel/VBA

TOP

CSVファイルをエクセルへ読み込みを行う方法

CSVファイルをエクセルへ読み込みを行う方法の説明画像です

※当記事で使用しているデータは全て架空のサンプルデータです

目次

CSVファイル読み込み

CSVのファイルを読み込むにはOpenメソッドを使用することが一般的です。

Openメソッドは使用方法は下記のとおりです。

CSVファイルをエクセルへ読み込みを行う方法の説明画像です

下記のサンプルコードはCSVのファイルパスを指定してCSVのデータをエクセルに取り込んでいます。

サンプルコード


Sub CSV取り込み()

    Dim ImportWS As Worksheet
    Dim CSV_Path As String
    Dim FileNumber As Long
    Dim LineData As String
    Dim CSV_Arr As Variant
    Dim CntRow As Long
    
    'CSVを取り込むシートを指定する
    Set ImportWS = Worksheets("CSV")
    
    With ImportWS
        
        'ワークシート内のセルから取り込むCSVのパスを取得する
        CSV_Path = "C:\Users\○○\Desktop\SAMPLE.csv"
    
        'ファイル番号の取得
        FileNumber = FreeFile
        
        'CSVファイルをオープン
        Open CSV_Path For Input As FileNumber
        
        '最初に記入する行番号を指定
        CntRow = 1
        
        'ファイルの内容を1行ずつ読み込む
        Do While Not EOF(FileNumber)
            
            Line Input #FileNumber, LineData
            
            '読み込んだデータを配列に変換
            CSV_Arr = Split(LineData, ",")
            
            'セルに記入
            .Range(.Cells(CntRow, "A"), .Cells(CntRow, UBound(CSV_Arr) + 1)).Value = CSV_Arr
            
            CntRow = CntRow + 1
            
        Loop
    
        ' ファイルを閉じる
        Close FileNumber
    
    End With
    
    MsgBox "CSVの取り込みが完了しました"
    
End Sub
        

実行結果

CSVファイルをエクセルファイルに読み込むことが出来ました。
エクセルから転記を行うときと同様に、WorkBooks.Open(CSVのファイルパス)として読み込むことも出来ますが、上記の方法で読み込みを行うと、より高速に読み込みを行うことができます。

実行結果を表した画像です

文字化け対策

読み込むCSVによっては文字コードが『UTF-8』になっている場合は、上記の方法でエクセルに取り込むと下記のように文字化けを起こしてしまいます。

CSV読み込み時に文字化けをしている画像

対策としては文字コードがUTF-8の場合は、文字コードを指定してCSVファイルの読み込みを行います。
※注意
下記のコードはAsc関数を使用し特殊文字が含まれていないかどうかで判断しているため、場合によっては正しく判断できない場合もあります。 ツールを作成する場合は、どの文字コードのCSVファイルを使用するかをあらかじめ決めておくことをお勧めいたします。

サンプルコード


Sub CSV取り込み()

    Dim ImportWS As Worksheet
    Dim CSV_Path As String
    Dim BoolUTF_8 As Boolean
    Dim FileNumber As Long
    Dim LineData As String
    Dim FileContent As String
    Dim LineArr As Variant
    Dim CSV_Arr As Variant
    Dim CntRow As Long
    Dim stream As Object
    Dim LoopArr As Long
    
    
    'CSVを取り込むシートを指定する
    Set ImportWS = Worksheets("CSV")
    
    With ImportWS
        
        'ワークシート内のセルから取り込むCSVのパスを取得する
        CSV_Path = "C:\Users\○○\Desktop\SAMPLE_UTF-8.csv"
        
        '下記で作成した関数(BoolEncode)で文字コードがUTF-8かそれ以外かを判断する
        BoolUTF_8 = BoolEncode(CSV_Path)
        
        '文字コードがUTF-8の場合は文字コードを指定して読み込みを行う
        If BoolUTF_8 Then
            
            'ADODB.Streamオブジェクトを作成する
            Set stream = CreateObject("ADODB.Stream")
            
            'ストリームの設定
            stream.Type = 2 'テキストモード
            stream.Charset = "UTF-8" '文字エンコーディングをUTF-8に設定
            stream.Open
            
            'ファイルをストリームに読み込む
            stream.LoadFromFile CSV_Path
            
            'ファイルの内容を文字列として取得
            FileContent = stream.ReadText
            
            'ストリームを閉じる
            stream.Close
            
            '上記で読み込んだCSVのデータを改行ごとに配列に格納
            LineArr = Split(FileContent, vbCrLf)
            
            '最初に記入する行番号を指定
            CntRow = 1
            
            'CSVデータを1行ずつ繰り返す
            For LoopArr = LBound(LineArr) To UBound(LineArr)
                
                Debug.Print LineArr(LoopArr)
                
                'カンマ(,)区切りで配列に格納する
                CSV_Arr = Split(LineArr(LoopArr), ",")
                
                'セルに記入する
                .Range(.Cells(CntRow, "A"), .Cells(CntRow, UBound(CSV_Arr) + 1)).Value = CSV_Arr
                CntRow = CntRow + 1
                
            Next LoopArr
            
            '最初に記入する行番号を指定
            CntRow = 1
            
            'リソースの解除
            Set stream = Nothing
        
        'それ以外は上記の「CSVファイル読み込み」で説明した通りの処理を行う
        Else
            'ファイル番号の取得
            FileNumber = FreeFile
            
            'CSVファイルをオープン
            Open CSV_Path For Input As FileNumber
            
            '最初に記入する行番号を指定
            CntRow = 1
            
            'ファイルの内容を1行ずつ読み込む
            Do While Not EOF(FileNumber)
                
                Line Input #FileNumber, LineData
                
                '読み込んだデータを配列に変換
                CSV_Arr = Split(LineData, ",")
                
                'セルに記入
                .Range(.Cells(CntRow, "A"), .Cells(CntRow, UBound(CSV_Arr) + 1)).Value = CSV_Arr
                
                CntRow = CntRow + 1
                
            Loop
        
            ' ファイルを閉じる
            Close FileNumber
        End If
        
    End With
    
    MsgBox "CSVの取り込みが完了しました"
    
End Sub


'読み込まれるCSVファイルの文字コードがUTF-8かどうかを判断する関数(UTF-8の場合はTrue,それ以外はFalse)
Private Function BoolEncode(arg_csv_path As String) As Boolean
    
    BoolEncode = False
    
    Dim FileNumber As Long
    Dim textLine As String
    Dim byteCount As Long
    Dim i As Long
    
    'ファイル番号の取得
    FileNumber = FreeFile
    
    'CSVファイルをオープン
    Open arg_csv_path For Input As FileNumber
    
    'ファイルの最後までループ
    Do While Not EOF(FileNumber)
        '1行ずつ読み込む
        Line Input #FileNumber, textLine
        
        '各行の文字をチェックする
        For i = 1 To Len(textLine)
            '文字コードが127より大きい場合、ANSIではない可能性がある
            If Asc(Mid(textLine, i, 1)) > 127 Then
                BoolEncode = True
                Exit Do '1つでも見つかったらループを終了
            End If
        Next i
    Loop
    
    ' ファイルを閉じる
    Close FileNumber
    
    
End Function
        

実行結果

上記の判断を行うことで文字化けせずに読み込みが行えました。

実行結果を表した画像です

CSVを読み込む場合は、指定したファイルが本当に存在するかを確認する処理を入れることをお勧めします。 ファイルの存在確認を行う場合は、こちらの記事をご参考ください。

関連記事