• 締切済み

CSVファイルの指定列だけを読み込んでEXCELに表示したい

EXCELのVBAの .ActiveSheet.QueryTables.Add メソッドを利用する方法で、 (不可能ならば別な方法でもお願いします。) CSVファイルを読み取って、シートに書き込みたいと思ったのですが、 その際、CSVファイル全体ではなくて、特定番目の列だけを読み取って、書き込むことは出来ないでしょうか。 その特定の列の指定を複数にすることも出来ますでしょうか。 もし複数でも可能でしたら、EXCELに書き込むときに、 一列目、二列目、と詰めて書くのではなく、間に空列をはさんだりして、 バラバラに好きな位置の列に、読み取ったそれぞれの列を、書き込むことは出来るでしょうか。

みんなの回答

  • TTak
  • ベストアンサー率52% (206/389)
回答No.3

accessdb_userさんこんにちは。 データソースに新規にCSVのソースを追加することによって可能です。例えば、マイドキュメントにCSVファイルがあり、データベースの先頭をセルA1に置くとして、次のようになるはずです。 ActiveSheet.QueryTables.Add(Connection:=Array(Array("ODBC;DefaultDir=C:\My Documents;Driver={Driver da Microsoft para arquivos texto (*.txt; *.csv)};DriverId=27;Extensions=txt,csv,tab,a"), Array("sc;FIL=text;MaxBufferSize=2048;MaxScanRows=25;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), Destination:=Range("A1")) 手動で言えば、外部データの取り込みで、新規データソースを作成し、アクセスするデータベースの種類に対応するドライバに Driver da Microsoft para arquivos texto (*.txt; *.csv) を選択するということです。これによって、クエリーが使えますから、 > 特定番目の列だけを読み取って、書き込むことは出来 ます。また、MSクエリーの他の機能も使えます。複数の列の取り込みも可能です。 取り込む列の選択は、上記AddメソッドのCommandTextプロパティの値として、Array関数に格納して使います。 .CommandText = Array("SELECT XXX.AAA, XXX.BBB& vbCrLf & "FROM XXX.csv XXX" ) のようになります。XXXはファイル名、AAA,BBBはフィールド名です。 クエリーを使った場合、空白の列を入れることはできないようです。データ取り込み後にInsertメソッドやCopy、Pasteメソッドで列挿入や入れ替えをすれば良いと思われます。 一度、自動記録すると解りやすいと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

テストデータとして下記を作りました。 ファイル名をaa1.csvで保存しました。 5,大島,大阪,商業,a1 23,古河,豊橋,商業,b1 34,恩田,岐阜,普通,d1 45,寒川,福島,国際,c1 67,桐井,新潟,工業,c2 13,青井,久留米,普通,a2 そしてVBEのModule1に Sub test01() i = 1 Open "aa1.csv" For Input As #1 While Not EOF(1)  Input #1, a, b, c, d, e  ' MsgBox a & "," & b & "," & c & "," & d & "," & e  Worksheets("sheet1").Cells(i, 1) = b  Worksheets("sheet1").Cells(i, 2) = d  i = i + 1 Wend Close #1 End Sub テスト済み。項目数(フィールド数)だけa,b,c,・・・を設定してください。そして何番目の項目かを選んでください。このテストでは2、4番の2つを選択した。 その項目数だけWorksheets("sheet1").Cells(i, xx) = xを増やしてください。xxはA列を1としてB列を2とする列順序数です。xは取り出してシート列にセットする変数名(項目データ)です。

accessdb_user
質問者

お礼

ご解答ありがとうございました。 とても明快でわかりやすいソースとご説明で、よくわかりました。 プログラムするときに参考にさせていただきます。 でも、セルに一つずつ書き込むのでは、処理が遅くなってしまうようなのです。 一気に書き込めればいいのですが・・・

  • taka2456
  • ベストアンサー率29% (36/122)
回答No.1

データが以下のようになってるとします 名前,生年月日,性別 mike,19920503,male tiger,19950304,male linda,19790403,female Open "CSVファイルの場所" For Input As #1 i = 1 Do Until EOF(1) Line Input #1, tmp hairetu = Split(tmp, ",")   'カンマで区切られたものをばらして                  '配列にいれます '1行目を読んだ状態では                  ’hairetu(0)="名前",                  ’hairetu(1)="生年月日",                  ’hairetu(2)="性別"となってます Cells(i, 4) = hairetu(2) ’配列3番目(性別)をD列に出力します   Cells(i,6)=hairetu(0) '配列1番目(名前)をG列に出力します i = i + 1 Loop Close #1 こんな回答しかできませんでした きっともっといいやり方があるとおもいますので他の方の意見を参考に してください

accessdb_user
質問者

お礼

セルに一つずつ書いていくと、なぜかやたら処理に時間がかかってしまうようなので、 CSVを一気に読み込みたいと思っていたんです。しかし、列を分けて読み込むのは難しいでしょうか。 でも、ファイル入出力に慣れていなかったので、ためになりました。ありがとうございました。