• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVファイルの特定列だけを呼び出し)

CSVファイルの特定列だけを呼び出し

このQ&Aのポイント
  • VBA初心者によるCSVファイルの特定列の呼び出しに関する質問です。
  • CSVファイルから2列分だけを取り出すマクロを作成する際に、opentextやarrayを使用しましたがうまくいかなかったため、他の方法を探しています。
  • 大量のデータを読み込む際に効率的な方法や、特定の列をコピーして新しいブックに貼り付ける方法についてのアドバイスをお待ちしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

先頭行にフィールド名がなく "Text;HDR=NO" と指定した場合 フィールド名は、F1、F2....というように「F+列番号」 がフィールド名として自動的に付くようです Dim CN As New ADODB.Connection '参照設定 Microsoft ActiveX Data Objects 2.8 Library Dim RS As ADODB.Recordset CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Text;HDR=NO" CN.ConnectionString = "C:\" 'C:\ にBook1.csvが有るものとしています。 CN.Open Set RS = CN.Execute("SELECT F3, F5 FROM Book1.csv")    '3列目、5列目を抽出 Range("A1").CopyFromRecordset RS RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing

yamanami111
質問者

お礼

すいません。 下で書いた補足部分の疑問も無事解決出来ました。 回答くださった皆様、ありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

Sub 抽出()   Dim CN As New ADODB.Connection '参照設定 Microsoft ActiveX Data Objects 2.8 Library   Dim RS As ADODB.Recordset   Dim strSQL As String   CN.Provider = "Microsoft.Jet.OLEDB.4.0"   CN.Properties("Extended Properties") = "Text;HDR=YES"  '←1行目はフィールド名なのでYES   CN.ConnectionString = "C:\" 'Cドライブ内のファイル   CN.Open '[空港]フィールドで ’『SIN』『KUL』が含まれるデータだけを取得 strSQL = "SELECT * FROM sample.csv" & " WHERE 空港 Like '%SIN%' or 空港 Like '%KUL%'" Set RS = CN.Execute(strSQL) Range("A1").CopyFromRecordset RS RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub

すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

> ネットでさがしているうちに、読み込む列が少ないならcsvから特定の列をコピーして、それを新しいブックに貼り付け、すればいいみたいな記述をみたのですが、参考になるコードが見つかりませんでした。 10列×1万行くらいならその方が手っ取り早いでしょうね。 以下のサンプルではCSVファイルの4列目と8列目をSheet1のA列とB列にコピーしています。 Sub Sample()   Application.ScreenUpdating = False   Workbooks.Open Filename:="C:\test.csv"   Range("D:D").Copy Destination:=ThisWorkbook.Sheets("Sheet1").Range("A:A")   Range("H:H").Copy Destination:=ThisWorkbook.Sheets("Sheet1").Range("B:B")   ActiveWindow.Close   Application.ScreenUpdating = True End Sub

yamanami111
質問者

お礼

mt2008様 ありがとうございます!とても分かりやすかったです。 こちらを参考にさせていただいても、理想通りに動きました!

すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

ADOを使って特定の2列、1万行を読み込みました。 速さは保証できませんが、お試し下さい。 Sub test()   Dim CN As New ADODB.Connection '参照設定 Microsoft ActiveX Data Objects 2.8 Library   Dim RS As ADODB.Recordset   Dim v(1 To 10000, 1 To 2), i As Long   CN.Provider = "Microsoft.Jet.OLEDB.4.0"   CN.Properties("Extended Properties") = "Text;HDR=NO"   CN.ConnectionString = "C:\" 'C:\ にBook1.csvが有るものとしています。   CN.Open   Set RS = CN.Execute("SELECT * FROM Book1.csv")   Do Until RS.EOF     i = i + 1     v(i, 1) = RS.Fields(0) '1列目と     v(i, 2) = RS.Fields(3) '4列目を抜き出しました     RS.MoveNext   Loop   Range("A1").Resize(10000, 2).Value = v   RS.Close: Set RS = Nothing   CN.Close: Set CN = Nothing End Sub 先頭にフィルド名画あれば ・・・・・"Text;HDR=YES" ・・・・・・・・・・・   Set RS = CN.Execute("SELECT 列名1, 列名2 FROM Book1.csv")   Range("A1").CopyFromRecordset RS で一気に読み込めると思いますが

yamanami111
質問者

お礼

ありがとうございました! 理想通りにいきました。早さも問題なかったです。 フィールド名はついていましたが、列を並び替えたかったので 最初に教えていただいたコードでいきました。 (今後CSVが大きくなることを考え、限界レコード数を増やしました)

yamanami111
質問者

補足

更に、11列目の中で特定の値が書かれたものだけを抽出したいのですが 自分でコードを書いてみたら、作動しませんでした。 (エラーではなく、普通に動いて結果は全件出てしまう、という形です) やりたいこと。 12列目(フィールド名:空港の列でSIN、KULが入ったレコードだけを表示) //////////が自作で付け足した部分です。 不具合の原因がお分かりでしたら、教えてください。 (こういう場合、新しく質問を投稿した方がよかったのでしょうか?  不調法ですいません) よろしくお願いします。 ******************************************************* Sub 抽出()    Dim CN As New ADODB.Connection '参照設定 Microsoft ActiveX Data Objects 2.8 Library    Dim RS As ADODB.Recordset    Dim v(1 To 65000, 1 To 2), i As Long    CN.Provider = "Microsoft.Jet.OLEDB.4.0"    CN.Properties("Extended Properties") = "Text;HDR=NO"    CN.ConnectionString = "C:\"  'Cドライブ内のファイル    CN.Open   /////////////////////////////////////    '実行するSQLの指定    Dim strSQL As String    '全件取得    strSQL = "SELECT * FROM sample.csv"   ’『SIN』『KUL』が含まれるデータだけを取得     strSQL = "SELECT * FROM sample.csv" & "WHERE [空港] = 'SIN*','KUL*'"  ////////////////////////////////////

すると、全ての回答が全文表示されます。
回答No.1

csvファイルは、データの区切り記号にルールを持たせたtextファイルですから、こういう処理には表計算ソフトよりも文字列を処理するツールを使う方が簡単で高速処理が可能です。 UNIX/Linuxには、grep、sedといったコマンドがあります。スクリプト処理言語にawk、perlというツールもあります。 Windowsに移植されていて、無償で使えます。 私なら、awkで数行のスクリプトファイルを書き、バッチファイルで再利用可能にしますね。 ファイルから読み込んだ行数から、行カウンタが指定した数値と一致していたら、その行を出力するが、不一致なら何もしないで次の行を読むようにすればよいのです。

yamanami111
質問者

お礼

chikuma_kayaker様 ありがとうございます。 現在はまだVBAでてこずってる段階ですが、勉強いたします!

すると、全ての回答が全文表示されます。

関連するQ&A