【ExcelVBA】CSVファイルを読み込む方法とは?高速化方法も徹底解説!

こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。

皆さんは、VBAでCSVファイルを読み込む方法について知っていますか?外部データをCSVファイルから読み込んで使うケースは、よくありますよね。

そこで今回は、

  • CSVファイルを読み込む方法とは
  • Openメソッドを使ったCSVファイル読み込み方法
  • QueryTablesメソッドを使ったCSVファイル読み込み方法
  • CSVファイルを高速に読み込む方法
  • といった基礎的なことから、応用的な方法まで、徹底的に解説します!

    目次

    CSVファイルを読み込む2つの方法とは

    はじめに、CSVファイルを読み込む方法について解説します。

    CSVファイルを読み込む方法は、大きくわけて2つの方法があります。

    • Openメソッド
    • QueryTableメソッド


    それぞれ詳しく解説しますね。

    Openメソッドを使う方法

    まずは、Openメソッドを使う方法について解説します。

    Openメソッドの使い方は次のとおりです。

    読み込むCSVファイルデータ:

    No,Name
    1,侍エンジニア1
    2,侍エンジニア2
    3,侍エンジニア3

    Openメソッドを使ったサンプルコード:

    Sub Test()
        Dim n As Integer, i As Integer
        Dim str1 As String, str2 As String, str3 As String
        
        n = 1
        Open ThisWorkbook.Path & "test1.csv" For Input As #n
        
        Do While Not EOF(n)
            i = i + 1
            Input #n, str1, str2
            Cells(i, 1).Value = str1
            Cells(i, 2).Value = str2
        Loop
        
        Close #n
    End Sub

    実行結果:

    Openメソッドでファイルパスを指定してCSVファイルを開き、「Do While Not EOF(n) ~ Loop」でデータの行数分読み込み処理をしています。

    処理の中では、「Input #n, str1, str2」のように実際に取得するデータの列数分「Input #n」以降でカンマ区切りで変数を指定することで値を取得し、「Cells(i, 1).Value = str1」のように取得した値をセルに書き込むサンプルです。

    このように、取得したデータを1行ずつ読み込んで処理するのがOpenメソッドの特徴です。

    Openメソッドの詳しい使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

    【VBA入門】OpenメソッドでテキストファイルやCSVの読み込み
    更新日:2024年4月29日

    QueryTablesメソッドを使う方法

    次に、QueryTablesメソッドを使う方法について解説します。

    QueryTablesメソッドの使い方は次のとおりです。

    読み込むCSVファイルデータ:

    No,Name
    1,侍エンジニア1
    2,侍エンジニア2
    3,侍エンジニア3

    QueryTablesメソッドを使ったサンプルコード:

    Sub Test()
      Dim wsImport As Worksheet
      Set wsImport = Worksheets("CSV読み込み") 'CSVデータを取り込み用シート
      
      '読み込むファイル
      Dim strFilePath As String
      strFilePath = ThisWorkbook.Path & “test1.csv"
        
      Dim queryTb As QueryTable
      Set queryTb = wsImport.QueryTables.Add(Connection:="TEXT;" & strFilePath, _
                                             Destination:=wsImport.Range("A1")) ' CSV を開く
      With queryTb
          .TextFilePlatform = 932          ' 文字コードを指定
          .TextFileParseType = xlDelimited ' 区切り文字の形式
          .TextFileCommaDelimiter = True   ' カンマ区切り
          .RefreshStyle = xlOverwriteCells ' セルに書き込む方式
          .Refresh                         ' データを表示
          .Delete                          ' CSVファイルとの接続を解除
      End With
    End Sub

    実行結果:

    「wsImport.QueryTables.Add(Connection:=”TEXT;” & strFilePath, Destination:=wsImport.Range(“A1”))」の処理のConnectionでCSVファイルを指定し、DestinationでCSVファイルを読み込んだデータを書き込む位置を指定しています。

    その後、「With queryTb ~ End With」の処理で読み込み形式を指定してデータをインポートしています。

    このように、簡単に指定したファイルのデータをインポートすることができます。

    また、今回はCSVファイルだったので「TextFileCommaDelimiter = True」でカンマ区切りを指定していましたが、「TextFileTabDelimiter = True」を指定すればタブ区切りのファイルもインポートすることができます。

    QueryTablesメソッドの詳しい使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

    【ExcelVBA入門】QueryTablesメソッドで高速にファイルを読み込む方法
    更新日:2024年4月29日

    Openメソッド・QueryTablesメソッドどちらがいいの?

    ここまで読んだ方は、次のような疑問を持っているのではないでしょうか。

    OpenメソッドとQueryTablesメソッドどっちを使えばいいんだろう・・・

    正直言うと、どちらもCSVファイルを読み込むことができるので、データの量が少ない時はどちらでも構いません。

    ただ、Openメソッドは1行ずつデータを読み込むため大量のデータを読み込むときは速度が遅くなってしまいます。そのため、QueryTablesメソッドを使うのがおすすめです! ちなみに、処理速度はTimer関数を使えば簡単に確認することができます。

    速度確認方法:

    Dim startTime As Double
    Dim endTime As Double
    Dim processTime As Double
      
    '開始時間取得
    startTime = Timer
      
      
    'メイン処理
      
      
    '終了時間取得
    endTime = Timer
     
    '処理時間計算
    processTime = endTime - startTime
    

    開始時にstartTime、終了時にendTimeに時刻を入れて、「endTime – startTime」をすることで処理時間を確認するサンプルです。

    このように、簡単に処理時間を計測することができます。

    Timer関数の詳しい使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

    【ExcelVBA入門】処理時間を計測するためのTimer関数の使い方とは
    更新日:2024年4月29日

    まとめ

    今回は、CSVファイルを読み込む方法について解説しました。

    外部データを取り込んでExcelで使うケースはよくあります。使い方も簡単なので、ぜひ使ってみてくださいね!

    この記事を書いた人

    北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

    Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
    侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

    目次