アプリケーションとしてのVBA Excel(エクセル) VBA の役立つ Tips の紹介

アプリケーションとしてのVBA

CSVファイルの読み込み

CSVファイルの読み込み


  CSVとは、Comma Separated Value の略で 、項目間をカンマで区切ったテキストファイル
  のことを指します。

  他のシステムで作成されたデータをExcelに取り込む場合や、Excelで作成したデータを
  他のシステムに引き渡す場合などに使われるデータ形式です。

  ここで説明するサンプルは、1行の項目数がどの行でも同じでないと正しく読み込めま
  せん。

  ファイルの読み込み用のステートメントを下の表にまとめました。

Get読み込む位置を指定できます。ランダムにアクセスできます。
Input読み込む文字数を指定します。改行も読めます。
Input #カンマで区切られた1単語づつ読み込みます。
Line Input #1行読み込みます

  1行の項目数は、Function GetItemNum で自動で判定するようにしています。

  1行の区切りは改行で認識するのですが、Input # を使用してカンマで区切られた単語
  を1つづつ読んでいたのでは改行が読めません。かといって Input でちまちまと
  読んでいては時間がかかります。

  そこで、最初の1行だけ Line Input # を使って読んで、1行の中のカンマを数えて
  います。

  読み込んだデータは配列に入れて、セル(表)に一気に代入しています。

  example18 をダウンロードして動作を確認してください。

Sub CSV_Read()

    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim csvline() As String
    Dim i, Rowcnt, ColumNum As Integer
    Dim ch1 As Long
    
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    '操作したいファイルのパスを取得します
    FileNamePath = SelectFileNamePath(FileType, Prompt)

    If FileNamePath = False Then    'キャンセルボタンが押された
        End
    End If
    
    '1行あたりの項目数を取得します
    ColumNum = GetItemNum(FileNamePath)
    
    'csvlineを1行あたりの項目数で再割り当てます
    ReDim csvline(1 To ColumNum)
    
    '空いているファイル番号を取得します
    ch1 = FreeFile
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1
    
    'エラーが発生したらファイルを閉じます
    'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、
    '色々なCSVがあるようなので入れておきます
    On Error GoTo CloseFile
    
    '表の行番号の初期化 1行目から読み込んだデータを入力します
    Rowcnt = 1
    Do While Not EOF(ch1)           'ファイルの終端かどうかを確認します。
    
        For i = 1 To ColumNum
            Input #ch1, csvline(i)  '1行の項目数だけ読み込みます
        Next
        '配列渡しでセルに代入 この方が早い
        Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline()
        
        Rowcnt = Rowcnt + 1
    Loop
    
CloseFile:
    'ファイルを閉じます
    Close #ch1

End Sub

Function GetItemNum(FileNamePath) As Integer
    Dim ch1 As Long
    Dim textline As String
    
    '空いているファイル番号を取得します
    ch1 = FreeFile
    
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1

    Line Input #ch1, textline       '1行だけ読み込みます。
    
    Close #ch1
    
    GetItemNum = 1
    '1行中のカンマの数を数えます
    Do
        GetItemNum = GetItemNum + 1
        textline = Mid(textline, InStr(textline, ",") + 1)
    Loop Until InStr(textline, ",") = 0
    
End Function

Function SelectFileNamePath(FileType, Prompt) As Variant
    SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt)
End Function


  上記の方法は、1行の中のカンマを数える方法ですが、かっこ悪いですね。

  もっとスマートに読み込む方法を教えていただいたので紹介します。


Sub CSV_Read2()

    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim textline, csvline() As String
    Dim Rowcnt, ColumNum As Integer
    Dim ch1 As Long
    
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    '操作したいファイルのパスを取得します
    FileNamePath = SelectFileNamePath(FileType, Prompt)

    If FileNamePath = False Then    'キャンセルボタンが押された
        End
    End If
    
    
    '空いているファイル番号を取得します
    ch1 = FreeFile
    
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1
    
    'エラーが発生したらファイルを閉じます
    'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、
    '色々なCSVがあるようなので入れておきます
    On Error GoTo CloseFile
    
    '表の行番号の初期化 1行目から読み込んだデータを入力します
    Rowcnt = 1
    
    Do While Not EOF(ch1)      'ファイルの終端かどうかを確認します。
    
        '1行読み込みます
        Line Input #ch1, textline
        
        'ダブルクォーテーションを削除します
        'カンマ+ダブルクォーテーションで区切られている CSVファイル
        'などは適時追加してください
        textline = Replace(textline, """", "")
        
        'カンマで分離します
        csvline() = Split(textline, ",")

        '配列渡しでセルに代入
        Range(Cells(Rowcnt, 1), _
              Cells(Rowcnt, UBound(csvline()) + 1)) = csvline()
        
        Rowcnt = Rowcnt + 1
    Loop

CloseFile:
    'ファイルを閉じます
    Close #ch1

End Sub


Copy (C) 2005   アプリケーションとしてのVBA   All Rights Reserved.