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

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

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

はじめまして。VBA初心者です。 質問させてください。 横に十列、縦に1万レコードのcsvデータがあり、このうちの2列分だけをエクセルシートに取り出すマクロが必要になりました。 外部データ呼び出し後、列を削除、というのを作ってみましたが、僕の力量不足にためか、改変ポイントがよくわかりませんでした。 opentextを使ってarrayで読み込む、というのもやってみましたが、結構時間がかかってスムーズにはいきませんでした。 ネットでさがしているうちに、読み込む列が少ないならcsvから特定の列をコピーして、それを新しいブックに貼り付け、すればいいみたいな記述をみたのですが、参考になるコードが見つかりませんでした。 そういうことは可能なんでしょうか?また、大量のデータを読み込む時に一番早い方法はどんなものでしょうか?

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

  • ベストアンサー
  • 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

  • 16384列を超えるCSVファイルについて

    xcelのVBAマクロ初心者のため、ぜひお知恵をお貸しください。 16384列をこえ、Excel上で全てのデータが参照できないCSVファイルがあり、(行は千程度) 一行目は文字列でかかれています。 例: a b C(以降は二万件) 1 ¥イチゴ¥トチオトメ ¥米¥ササニシキ 2 100 200 3 200 500 (4以降は1000行ほど) 1行目の文字列データを識別して別シートに一覧を表示するマクロを作成したいのですが、 (たとえば、¥米のグループのみを別シートに一覧表示する) こちらのマクロを作成する際、どういったやり方で行えばいいか全く思い付きません。 まず、この表示できないCSVファイルをどのようにすればうまくいくのでしょうか? 色々かんがえたのですが、まず、テキスト化させると、一行目、二行目がまとまってしまい、識別することができません。 表示可能な列数に分割することや、表示が可能なワードやアクセスにインポートする等はできるのでしょうか。 セキュリティのため、フリーソフトの類いは使えない状態です。 Excelは2016です。よろしくお願いします。

  • 項目内改行があるCSVの書式設定ができません

    お世話になります。 現在、Excel2010のVBAを使って、ある項目内に改行CRLFを含むCSVを Excelシートにコピーして加工するマクロを作成しようとしています。 CSV1レコードの例) "001","b","c","d[CR][LF] e[CR][LF] f[CR][LF] g","h" 4項目名に改行が含まれますが、1レコードあたり5項目のCSVです。 CSVをExcelに取り込むには様々な方法があると思いますが、改行を含んでいても正しく取り込める方法として、 現在は下記のようにOpenText関数を使用して読み込みを行い、シートへ貼り付けています。 Workbooks.OpenText fileName:=取り込みたいファイルの名称, StartRow:=1, _ DataType:=xlDelimited, TextQualifier:=xlTextQualifierDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _ Comma:=True, Space:=False, Other:=False, _ FieldInfo:=Array(Array(1, xlTextFormat), Array(2, xlTextFormat), _ ・・・・・・・・・・・・・・ このとき、CSVの取込自体はできるのですが、FieldInfoで指定した書式指定 (ここでは文字列をあらわすxlTextFormat)が無視されてしまい、 Excelに取り込んだときには文字列でなく標準の書式になっています。 つまり上記の例では1項目目の"001"が桁落ちして1となってしまいます。 ネットで調べたところ、OpenText関数では拡張子csvのファイルを読み込む際には FieldInfo指定が無効となるとありました。そこでファイルの拡張子を.txtに変えてみたところ、 今度は項目内改行が認識されず、行区切りの改行とみなされてしまって、項目取り込みがずれてしまいます。 なんとか、桁落ちせず、なおかつ項目内改行も正しく認識できるような方法はないでしょうか。 OpenText関数以外の方法でもかまいませんので、有識者の方々にご教授いただければ、 と思っております。 よろしくお願いします。

  • CSVファイルを全て文字列型で開く

    CSVファイルをEXEL2000で参照する際に全ての項目を文字列型で表示したいと思います。 「外部データの取り込み―>テキストファイルのインポート」 ではなくて、SendToやマクロなんかを使ってなにか良い方法があればと思うのですがなかなか思いつかないので、アドバイス等ありましたらお願い致します。 (要はユーザーさんにCSVをダブルクリックで開いて欲しくないのです。「001」 -> 「1」とかになってしまうから。)

  • VBAでCSVを文字列として取り込む方法

    VBAでCSVを文字列として取り込む方法を教えてください。 下記のようにCSVファイルを取り込んでいます。 Array関数を使用していますが、どうしても文字列として認識してくれません。 Sub CSV取り込み() Dim xlAPP As Application ' Applicationオブジェクト Dim strFILENAME As String ' OPENするファイル名(フルパス) 'Applicationオブジェクト取得 Set xlAPP = Application '「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) 'キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), _ Array(4, 2), Array(6, 2)) Workbooks.Open Filename:=strFILENAME ActiveWorkbook.Sheets(1).Cells.Copy _ Destination:=ThisWorkbook.Worksheets("sheet1").Range("A1") End Sub この書式ではCSVを文字列として取り込めないのでしょうか? どなた様かご教示ください。 よろしくお願いいたします。

  • CSVファイルの特定列を新たなCSVファイルに変換

    ruby 初心者の50代のサラリーマンです。 若い人にrubyがいいだろうと言われて挑戦していますが、なかなか分かりません。 どなたか、教えてください。 大きなCSVファイルがあって、 1行目は項目名が入っていて不要です。 2行目以降、 各行2列目にレコード名、 各行8列目に欲しいデータが入っています。 データは29行毎に1レコード分になっています。 レコード名は各行で重複しています。つまり、 試験日,サンプルA,***,・・・・・,観測値1,・・・・・・ 試験日,サンプルA,***,・・・・・,観測値2,・・・・・・ 試験日,サンプルA,***,・・・・・,観測値29,・・・・・・ 試験日,サンプルB,***,・・・・・,観測値1,・・・・・・ 試験日,サンプルB,***,・・・・・,観測値2,・・・・・・ 試験日,サンプルB,***,・・・・・,観測値29,・・・・・・ というデータです。 それを、 サンプルA,観測値1,観測値2,・・・・・,観測値29 サンプルB,観測値1,観測値2,・・・・・,観測値29 サンプルC,観測値1,観測値2,・・・・・,観測値29 と直してcsvファイルに保存し直したいのです。 どなたか、rubyプログラムの書き方を指南して下さい。

    • ベストアンサー
    • Ruby
  • CSVファイルへの文字列データの書き出しについて

    OS:WindowsXP、Excel:2003 です。 Excelマクロ(VBA)で、あるデータをCSVファイルに出力しているのですが、 文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 CSVへ書き出すときは、そういう仕様になっているということは分かったのですが、 処理の都合上、どうしてもダブルクォーテーションで囲まずに書き出ししたいと思っています。 そういう場合にはどのようにすれば良いのか教えて下さい。 ちなみに、書き出しは「Write」を使っています。

  • Excelマクロで同じブックにCSVを読み込むには

    Excelの指定したシートにCSVファイルを読み込ませたいのですが 以下のVBAマクロを実行すると新しいブックが起動して 新しいブックの方にCSVファイルが読み込まれてしまうのですが これをVBAマクロを実行しているブックの指定のシート(例えばSheet3など)に 読み込ませたいのですがどのように記述すればよいのでしょうか。 よろしくお願いします(Excel2010) Sub Macro1()  ChDir "C:\test"  Workbooks.Open Filename:= "test1.csv" End Sub

  • CSVデータから日付を正確に読み込めません

    ユーザーフォームのテキストボックスでCSVファイルを指定し、レポート用のBookに貼付けしようとするのですが、 以下のように日付がおかしくなってしまいます。 ご教授願えませんでしょうか? CSVデータ       Xlsデータ 日付(A列)      日付(A列) 2008/4/1        2001/8/4 2008/4/2        2002/8/4 2008/4/3    ⇒   2003/8/4 2008/4/4        2004/8/4 2008/4/5        2005/8/4 (B列からQ列までは数値データとなっております。) 現在、入力しているVBAは下記のような記述です。 ' "CSVデータ"をExcelで開く Workbooks.OpenText TextBox2.Value, Local:=True Cells.Select Selection.Copy Windows("Report.xls").Activate Sheets("元データ").Select Cells.Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows(2).Activate ActiveWindow.Close SaveChanges:=False

  • 複数ブックの特定セル列を新しいブックへ集約したい

    お願い致します。 下記の操作をVBAで行いたいと思っています。 下記画像サンプルにあるように、複数ブック(同じ階層)に同じ配列のデータがあります。 こちらの、黄色く色付けしている(実際は色付けされていません)複数列を新たなブックの1シートへ抽出したいと考えています。 列のデータ量は、各ブックごとに違っていますので、11列のデータを基準に抽出できればと思います。 複数シートを1つのシートに纏めCSVで出力するとこまではVBAで出来たのですが、 複数ブックのシート指定列を抽出して1つの違うブックへ纏めることが出来ないでいます。 どうぞご教授よろしくお願いいたします。

  • ExcelのOpenTextで作ったシートのコピー

    Excel2010のVBAでテキストファイルを読み込むと新しいブックに読み込まれるので、新しいブックのシートをVBAのコードがあるブックにコピーしたいのですが CSVファイル読み込み時に使う Workbooks.Open の場合には  Dim wb As Workbook  Set wb = Workbooks.Open(Filename:="C:\test\test1.csv")  wb.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1")  wb.Close False のような感じでコピーすることができたのですが テキストファイル読み込み時に使う Workbooks.OpenText の場合には  Dim wb As Workbook  Set wb = Workbooks.OpenText Filename:= _    "C:\test\test1.txt", _    Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _    xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _    , Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), _    Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 2), _    Array(9, 2)), TrailingMinusNumbers:=True  wb.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1")  wb.Close False とすると、OpenTextの箇所で「Workbooks.OpenText Functionまたは変数が必要です」というコンパイルエラーが発生します。Set wb = Workbooks.OpenText (Filename:=・・・・True)のように括弧でくくっても同様のエラーがでてしまいます。 Microsoft Office 14.0 Object Libratyの参照設定はチェックされています。 Workbooks.OpenText Filename:= _・・・=Trueの部分はマクロの記録の機能で生成したコードです。 このような場合、どのように記述すればよいのでしょうか。 よろしくお願いします。

専門家に質問してみよう