| すぐマク YNxv9141 | Home | Search | Contents | Gallery | Introduction | Service | Support | What's New! |
| CSVファイルをブックで開かずに読み込むには? |
|
|
|||||
500連発を購入しました。ファイルを開かずに、Cドライブのファイル名2-23.Da2(CSV形式)ファイルを、すでに開いているシートのB2セルに貼り付ける方法を教えてください。 |
|
|||
|
回答に入る前に確認させてください。 質問では「ファイルを開かずに、・・(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件分のデータを読み取ってくれます。 |
| http://www.happy500z.com/ | Home | Contents | Gallery | Introduction | Service | Support | What's New! |