CSVファイルをブックで開かずに読み込むには?

Question 40.1   Previous Next
詳細は こちら 500連発を購入しました。
ファイルを開かずに、Cドライブのファイル名2-23.Da2(CSV形式)ファイルを、すでに開いているシートのB2セルに貼り付ける方法を教えてください。
Answer   Copyright (C) 2001.3.16 永井善王
回答に入る前に確認させてください。
質問では「ファイルを開かずに、・・(CSV形式)ファイルを、・・」とありますが、「CSVファイルをブックで開かずに」と解釈してよろしいでしょうか。なぜかと言うと、CSVファイルを読むためには、そのCSVファイルを開いておくことが必要です。

開く方法にはいろいろあって一般的には、Excelの[ファイル]メニュー[開く]で「テキスト形式」を指定して開きます。そうするとブック形式で開いてしまいますが、それを避けたいので「ファイルを開かずに」と表現されたのかなと思います。

よって、Openステートメントを使う方法で回答を進めます。Openステートメントは、ファイルを開いて(ブック形式ではない)、入出力できるようにしてくれます。

Openステートメントの構文

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

構文の中で斜体で書かれた部分は、指定項目です。くわしく知りたければ、こちら を見てください。
これを質問環境に当てはめると、次のようなコードになります。(フォルダを指定することも可能です)
    Open "C:\2-23.da2" For Input As #1

このようにしてファイルを開いておけば入出力が可能になるので、当然、読み取ることができます。CSVファイルを読み取るには、一般的に Input # ステートメントが使われます。

Input # ステートメントの構文

Input #filenumber, varlist

指定項目の filenumber には、Openステートメントで指定したファイル番号を、必ず指定します。
varlist には、ファイルから読み込んだデータを格納するための変数を、必要なだけ指定します。一般的には、1件分のデータを構成する項目(フィールド)数と一致します。質問には項目数が書かれていないので仮に 3項目とすると、次のようなコードになります。
    Input #1, D(1), D(2), D(3)
この場合、文字列データは文字列型(String)、数値データは数値データ型として格納され、その他のデータ型も格納方法が決まっています。また、入力データ内のダブルクォーテーション("") は無視されます。

読み取ったデータを 「B2セル
(から順に)に貼り付ける方法」に入ります。左の( )書きは、回答者が付け加えました。もしも 「B2セルだけに貼り付ける」ならば、回答が変ります。
コードの書き方には、いろいろありますが、一例をあげておきます。
    Cells(2, 2) = D(1)              '第1項目をB2セルへ
    Cells(3, 2) = D(2)              '第2項目をB3セルへ
    Cells(4, 2) = D(3)              '第3項目をB4セルへ

CSVファイルには通常、データが何件も入っています。しかし、Input # ステートメントは、その内の 1件だけを読み取ります。読み取る順番は先頭からです。そのため、すべてのデータを読み取るには繰り返し処理を行います。そうなるとデータの終わりを検出することが必要になります。

EOF関数の構文

EOF(filenumber)

引数のfilenumberには、Openステートメントで指定したファイル番号を、必ず指定します。

EOFは End of fileの略で、ファイル上に、終わりを示すマークが書かれていると理解しておきましょう。EOFを検出するまで処理を繰り返すためのコードを、次のように例示します。
    Do Until EOF(1)                 'EOFでない間は
        '(ここで必要な処理を行う)
    Loop                            'ループする(繰り返す)

一通り解説しましたが、まとめると下記のようになると思います。ファイルを閉じるための Closeステートメント、読み取ったデータをワークシートの次の行に格納するコードなども見られます。
'------------------------------------------------------------------------------
Private Sub CSVファイルをブックで開かずに読み取る()
Dim D(3) As String                          '読み取ったデータを格納するための変数
Dim 行 As Integer                           '貼り付けるセルの行を示すカウンタ
Dim 列 As Integer                           '   〃    列   〃

    Worksheets("Sheet1").Activate           '貼り付け用ワークシートをアクティブにする
        Cells.Clear                         'すべてのセルをすべてクリアする
    Open "C:\2-23.da2" For Input As #1    'CSVファイルをシーケンシャル入力モードで開く
    Do Until EOF(1)                         'EOFでない間は
        行 = 行 + 1                         '行カウンターに 1 加える
        Input #1, D(1), D(2), D(3)          'CSVファイルを読み取る
        For 列 = 1 To 3             '列カウンタを1から始めて3以内なら(反復時に1加える)
            Cells(行, 列) = D(列)            '読み取ったデータをセルにセットする
        Next                                'For..Nextする(繰り返す)
    Loop                                    'Doループする(繰り返す)
    Close #1                                'ファイルを閉じる
End Sub
'------------------------------------------------------------------------------
感の良い人は気が付かれたかも知れませんが、上記コードのように Input # ステートメントで読み取るファイルは固定長、つまり、項目数が同じでなければなりません。
CSVファイルの中には、まれに、項目数が変動するものもあるようです。そうした場合には、Line Input # ステートメントを使うことになるでしょう。 Line Input # ステートメントは、行単位で 1件分のデータを読み取ってくれます。

Excel VBA Macro