【VBA】CSVファイルを読み込む

エクセルVBAで使用するコードの備忘録。VBAで指定したCSVファイルを読み込むコード。

スポンサーリンク

CSVファイル

CSVファイルを読み込もうとしている方の中にはあまりいないかもしれませんが、念のためCSVファイルがどのようなファイルなのか簡単に説明しておきます。

CSVとは「Comma-Separated Values」の略で「コンマで区切られた値」という意味になります。読んで字のごとく格納されている値がコンマで区切られているデータファイルがCSVファイルと呼ばれています。実際にWindowsのメモ帳などでお手元のCSVファイルを開いてみると、データがコンマで区切られたテキストが出てくると思います。

それ以上の細かな内容については知る必要はないと思います。最低限理解しておく必要があるのは、CSVファイルというのは「コンマでデータが区切られたファイル」だということです。

QueryTables.Add関数を使用する方法

CSVファイルを読み込む方法の一つは、QueryTables.Add関数を使用する方法です。QueryTableオブジェクトは外部のデータソースからのテーブル(表)をあらわすオブジェクトです。本来はSQLサーバーなどのデータソースを利用することを想定したオブジェクトですが、データソースとしてCSVファイルを指定してそのデータを読み込みます。柔軟性はありますが、後述のWorkbooks.OpenText関数を使用する方法と比べて若干コードが煩雑になる印象です。

QueryTables.Add関数自体は下記の引数を最低限してしてやれば利用できます。

  • Connection: 接続するデータソースを示す文字列
  • Destination: データを返す領域の左上を示すRangeオブジェクト

引数Connectionはデータソースがテキストファイルの場合は「TEXT;[ファイル名]」というように、ファイルパスの前に”TEXT;”を追加した文字列を指定します。

QueryTables.Add関数の戻り値として追加されたデータテーブルを示すQueryTableオブジェクトが返されるので、そのオブジェクトに対してどのようにデータを読み込むかを指定してデータをロード(Refresh)してやります。

データ読み込みの設定(クエリ)として指定できる内容は多岐にわたるためここでは深く説明しません。詳細が知りたい方はこちらのマイクロソフトのページをご参照ください。

サンプルコード

下記サンプルコードではCSVファイルをQueryTables.Add関数を使って開いています。QueryTables.Add関数を使用するワークシートとDestinationとして指定するRangeオブジェクトのワークシートは同一のものを使用してください。

データをロードした後には、接続を解除(Delete)しておきます。QueryTables.Add関数を使用する方法は、データをただロードするのではなく、データソースとエクセルワークシートを接続するプロセスです。そのため、接続を切らなければ読み込んだデータソース(CSVファイル)が変更されると、それに応じてQueryTableとして接続しているデータも変更されます。これはこれで使い勝手は良いのですが、CSVファイルを読み込むという趣旨から外れるので、下記のサンプルコードでは接続を解除する一文(Delte)を入れてあります。

なお、コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

Public Sub OpenCsvFile1()
    
    '--- データを読み込むワークシート ---'
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("[シート名]")
    
    '--- CSVファイルのパス ---'
    Dim csvPath As String
    csvPath = "[CSVファイルのパス]"
    
    '--- Connection文字列 ---'
    Dim connectionStr As String
    connectionStr = "TEXT;" & csvPath
    
    '--- QueryTableオブジェクト ---'
    Dim qt As QueryTable
    Set qt = ws.QueryTables.Add(connection:=connectionStr, Destination:=ws.Range("A1"))
    
    '--- 読み込み設定 ---'
    qt.TextFileCommaDelimiter = True

    '--- データを更新して接続を切る ---'
    qt.Refresh
    qt.Delete
    
End Sub

Workbooks.OpenText関数を使用する方法

CSVファイルを読み込む方法としては、Workbooks.OpenText関数を使用する方法も考えられます。この関数は、CSVファイルを読むために特別に用意された関数ではなく、テキストファイルを細かく設定を指定して読み込むための関数です。そのためコンマで区切られたファイルだけでなく、スペースやタブなどで区切られたファイルを読み込む際に使用することもできます(詳細はこちらのマクロソフトのページを参照)。そのため、とてもたくさんの引数がありますが、今回はCSVを読み込む場合に限定して説明していきます。

最低限必要な引数は以下の2つです。

  • FileName: CSVファイルのパスを指定
  • Comma: 区切り文字がCommaなのでTrue

今回はCSVファイルを開くので引数CommaをTrueとします。ちなみにスペースで区切られたファイルの場合は引数SpaceをTrueとします。スペース以外にも任意の区切文字を指定することが可能です(詳細はこちらのマクロソフトのページを参照)。

留意点としてはWorkbooks.OpenText関数を使用してCSVファイルを開くと必ず新しいWorkbookにCSVファイルが読み込まれる点です。読み込んだ後のCSVデータを操作するには、新しく開かれたWorkbookオブジェクトを取得してデータにアクセスする必要があります。

サンプルコード

下記サンプルコードではCSVファイルをWorkbooks.OpenText関数を使って開いています。開いた後にデータを処理するため、新たに開かれたWorkbookを取得するコードも参考に記載しています。ファイルのフルパスからファイル名だけを取得する方法に関する詳細はこちらをご参照ください。

なお、コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

Public Sub OpenCsvFile2()
    
    '--- CSVファイルのパス ---'
    Dim csvPath As String
    csvPath = "[CSVファイルのパス]"
    
    '--- CSVファイルのファイル名 ---'
    Dim csvFileName As String
    csvFileName = Mid(csvPath, InStrRev(csvPath, "\") + 1)
    
    '--- CSVファイルを開く ---'
    Call Workbooks.OpenText(Filename:=csvPath, comma:=True)
    
    '--- CSVファイルを開いたブックを格納する変数 ---'
    Dim wb As Workbook
    Set wb = Workbooks(csvFileName)
    
End Sub