• ベストアンサー

<csv>複数条件で検索・抽出し、別シートに順次保存したい

hotosysの回答

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.3

1ファイルが65536行より少なくて、全部で65536行を超えない場合です。 65536行を超える場合は・・・Excel2007を用意するのをお勧めします。(ただし使い勝手で苦労するかも知れませんが) Sub sample() Dim dataFolder As String Dim dataSheet As Worksheet Dim tempSheet As Worksheet Dim workLastRow As Long Dim dataLastRow As Long Dim dataFile As String Set dataSheet = Sheets("Sheet1") 'データ集計シート dataFolder = "c:\data\" 'csvデータのあるフォルダ Application.ScreenUpdating = False Set tempSheet = Worksheets.Add dataSheet.Cells.Delete dataSheet.Range("A1:E1") = Array("日付", "時刻", "緯度", "経度", "回数") dataFile = Dir(dataFolder & "*.csv", vbNormal) Do While dataFile <> "" tempSheet.Cells.Delete With tempSheet.QueryTables.Add(Connection:="TEXT;" & dataFolder & dataFile, Destination:=tempSheet.Range("A1")) .TextFileStartRow = 1 .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = True '空白区切りで無い場合はいらない .TextFileTabDelimiter = True 'TAB区切りで無い場合はいらない .Refresh End With workLastRow = tempSheet.Range("A" & Rows.Count).End(xlUp).Row tempSheet.Range("F2:F" & workLastRow).Formula = "=IF(AND(C2>141.4,C2<146.6,D2>35.6,D2<38.7),1,0)" '検索条件(C2:緯度 D2:経度) tempSheet.Range("A1:F" & workLastRow).AutoFilter Field:=6, Criteria1:="1" dataLastRow = dataSheet.Range("A" & Rows.Count).End(xlUp).Row tempSheet.Range("A2:E" & workLastRow).Copy Destination:=dataSheet.Range("A" & dataLastRow + 1) dataFile = Dir Loop Application.DisplayAlerts = False tempSheet.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub p.s. csvの1行目に見出し(「日付,時刻,緯度,経度,回数」)がある場合です。(質問のデータにはあるので) 質問のデータが空白(TAB?)区切りにも見えるので、それでも分けるようにしてます。

calpisfizz
質問者

お礼

なんとか解読できました! いろいろな処理の方法があるのですね、びっくりの連続でした。 処理時間も早い気がします! ただ「1」のみを抜き出すはずが、オートフィルタで該当無しのファイル(「0」のみのファイル)では、そのファイル内のすべてのデータを抜き出しているようです。いろいろ調べて下記のようにif文で制限をかけましたが、まだ「0」も含んだ形でしか抽出できていません。なにか対策はないのでしょうか。おんぶに抱っこですいません・・ tempSheet.Range("A1:F" & workLastRow).AutoFilter Field:=6, Criteria1:="1" If tempSheet.Range("A1:F" & workLastRow).SpecialCells(xlCellTypeVisible).Count >= 2 Then dataLastRow = dataSheet.Range("A" & Rows.Count).End(xlUp).Row tempSheet.Range("A2:F" & workLastRow).Copy Destination:=dataSheet.Range("A" & dataLastRow + 1) End If

calpisfizz
質問者

補足

詳細な回答ありがとうございます。 自分のPCは2007なのですが、残念ながら動かすPCが2003なのです。 たしかにどのデータにも見出しがあり、出力したデータの一番上にひとつあれば一番いいなと思っています。なおカンマ区切りです(説明不足ですみません)。 なにやらすごいコードのようですが、つたない知識しか無く、ゆっくりと解読している状態です。がんばってみます。

関連するQ&A

  • エクセルVBAで複数CSVを抽出、ブックへの出力

    エクセルVBAで複数のCSVファイルからファイル名と 任意のセル8箇所を自作した計算シートに抽出。 別ブックにCSVファイル名 計算結果4種類を出力する。 というvbaを作りたいのですがどうすればよいでしょうか? CSVファイルが1700ほどあり、大変困っています。 申し訳ありませんがご教授願います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー 詳細 CSV読み込みセル8箇所:B2、D2、F2~P2 自作計算シートへの貼り付け箇所:G3~G10 計算結果セル抽出箇所:C8~F4 出力の理想系は CSVファイル名、計算結果1、2、3、 4の順で file01 ○○ ○○ ○○ ○○ file02 ○○ ○○ ○○ ○○ ・・・ ・・ のようになれば大変嬉しいです。 お力をお貸しください よろしくお願いいたします。

  • エクセルで複数の条件範囲に合う行を別シートに抽出

    エクセルの関数で複数の条件範囲に合う行だけをを別シートに抽出したいのですが、 どうしても方法が分かりません。 誰か教えて頂けないでしょうか? 検索は範囲です。 宿泊日○○○○○○○○~○○○○○○○○(例20111110~20240204) 人数 ○人~○人 (○の中に数字が入ります) 西暦日付と人数が両方一致している行を別シートに抽出したいです。 バージョンは2007.2010両方とも問題ないです。 Sheet1    A     BCDEFGHIJKLMN   O 1 宿泊日                 人数 2 20100223               20 3 20110103               5 4 20111118               9 5 20120505               13 6 20121010               7 8 20120224               32 9 20121121               28 Sheet2    A      B    C   D    E   FGHIGKLMN    O 1 検索 2 宿泊日 20110101 ~ 20121111 3 人数     8    ~   30     人 4 5 宿泊日                                  人数 6 20111118                                   9 7 20120505                                  13 Sheet1、A列の宿泊日とO列の人数の範囲が一致するものを、 Sheet2の検索から、行ごと抽出(複数)し、Sheet2に反映する関数を教えて頂けないですか? ちなみにSheet1は常に更新され、入力をする事が出来ませんので、 Sheet1に手を加えることのなく、Sheet2のみに関数を入れて処理出来る関数でお願いします。 いろいろ検索して探しましたが、複数抽出する方法がわかりませんでした。 よろしくお願いいたします。

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • エクセルで複数の条件範囲に合う行を別シートに抽出

    エクセルの関数で複数の条件範囲に合う行だけをを別シートに抽出したいのですが、 どうしても方法が分かりません。 誰か教えて頂けないでしょうか? 検索は範囲です。 宿泊日○○○○○○○○~○○○○○○○○(例20111110~20240204) 人数 ○人~○人 (○の中に数字が入ります) 西暦日付と人数が両方一致している行を別シートに抽出したいです。 バージョンは2007.2010両方とも問題ないです。 Sheet1    A     BCDEFGHIJKLMN   O 1 宿泊日                 人数 2 20100223               20 3 20110103               5 4 20111118               9 5 20120505               13 6 20121010               7 8 20120224               32 9 20121121               28 Sheet2    A      B    C   D    E   FGHIGKLMN    O 1 検索 2 宿泊日 20110101 ~ 20121111 3 人数     8    ~   30     人 4 5 宿泊日                                  人数 6 20111118                                   9 7 20120505                                  13 Sheet1、A列の宿泊日とO列の人数の範囲が一致するものを、 Sheet2の検索から、行ごと抽出(複数)し、Sheet2に反映する関数を教えて頂けないですか? いろいろ検索して探しましたが、複数抽出する方法がわかりませんでした。 よろしくお願いいたします。

  • 複数ブックにあるシートを1つのブック束ねるマクロを汎用的に改良したい

    【質問編です。回答#1に、元コードを掲示いたいます】 以下は、1つの新規ブックに、特定フォルダにある不特定多数の ブックのSheet1を次々と束ねるマクロで、別の掲示板で教わりました。 よく使うので、大幅に汎用性をもたせたいのです。 (要望1) 束ねた際に、シート名をブック名にセットしたい。 (例:C:\temp\に、Book1.xls、Book2.xls、Book3.xls とあったら、  束ねられたシート名はBook1、Book2、Book3をシート名) (要望2)CSVやTXTを束ねる場合、8行目のxlsをcsvに書き換えなければ ならないので、ここは、その都度ダイアログで聞いて欲しい。 (規定値にxlsが入力されたInputBoxとか、XLS、CSVを選択させるラジオボタン等。) (要望3)7行目の代わりに↓のような「フォルダの参照」ダイアログを表示し、 毎回7行目を書き換えないで済むようにしたい。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_120.html その他、このような仕様ならより汎用性が高いだろうと思われるもので 多機能化いただくのはとってもうれしいです。 どうぞ、よろしくお願い致します。

  • 条件に合うシートを串刺し集計して別のブックに抽出する方法

     ご覧いただきありがとうございます。「条件に合うシートを串刺し集計して別のブックに抽出する方法」を教えてください。  毎月、1件の請求につき1枚のシート、計80枚程度のシートを含む請求○月.xlsというブックを作っています。  現在は、その後の入金や未収の管理は、手作業で別ブック(入金○月.xls や 未収○月.xls)にシートを移すという非効率的な方法に頼っているのですが、この請求4月.xls や 請求5月.xls の各シートに「入金済み」のフラグを立てるなどして、これらのブックから、入金○月.xls が(半)自動的に生成されるようにしたいのです。  言い換えれば、入金された月別に 請求○月.xls からデータを別ブックに抽出したいのです。  具体的には、   請求4月.xls シート1、シート2、・・・、シート80、合計額シート(請求計)   請求5月.xls シート1、シート2、・・・、シート80、合計額シート(請求計)         (入金のあった分のシートを串刺し集計して抽出)         ↓         ↓   入金6月.xls 請求4月入金6月シート、請求5月入金6月シート 上記のように抽出したいと思っています。(串刺し集計のほか、シートを抽出する方法もお教えいただければ幸いです)  なにとぞご指導よろしくお願いいたします。

  • 複数シートからデータを抽出したい

    教えてください。 複数のシートから同じデータを抽出したいのです。 各々シートの行、列データは等しくない状態となっております。 4行目から○○を検索し、一致するものがあれば”固定のB列”と一致した列を抽出する、をシート2、3と繰り返して統合されたシートを完成させる、という流れにしたいのですが最終行の取得、そこから続きにコピーというイメージまではわかるのですが固定のB列と一致した列を抽出させる方法がわからないのです。 どのような処理で実行できるでしょうか?

  • 条件に合う行を別シートに抽出

    エクセルで条件に合う行を別シートに抽出したいです。  出荷確認シートとします。     A    B   C    D    E    K    M   N   O     P   抽出列  No.  件名  工事店  出荷  確認  担2  担3  名称   作業列・・・・OKで番号 30行 OK 101-1 ふじ  あああ        OK     松田  みかん    1            以降     101-2 ふじ  あああ              松田  りんご                OK 102-1 ビル  いいい       OK     伊藤  いちご      2            OK 103-1 神社  ううう         OK     神田  アイス     3               103-2 神社  えええ               神田  レモン                    ・  ・    ・       ・      ・    ・     ・         ・  ・    ・       ・      ・    ・     ・        OK   ・  ・    ・             OK    ・     ・       4 上記がSheet1に入力されています。 条件1  ・Sheet1K列 確認でOKを入力された行をSheet2に抽出したいのです。       B   C     D    E    M    N    O            No.  件名  工事店  出荷   担2   担3  名称          101-1 ふじ  あああ            松田   みかん        102-1 ビル  いいい           伊藤   いちご              103-1 神社  ううう             神田   アイス  条件2  ・Sheet1K列 随時OKを入力された行をSheet2に追加           101-1 ふじ  あああ         松田   みかん        101-2 ふじ  あああ         松田   りんご       102-1 ビル  いいい        伊藤   いちご             103-1 神社  ううう         神田  アイス       103-2 神社  えええ          神田  レモン             条件3  ・出荷を確認後はその行を削除しますので、残りのOK分をSheet2に抽出後したもの       101-1 ふじ  あああ         松田  みかん         101-2 ふじ  あああ         松田  りんご       103-1 神社  ううう          神田  アイス とSheet2に表示させたいです。 A抽出列には=IF(B30="","",TEXT(B30,"OK"))を入力し、Sheet1P作業列がK列に OKを入力されるたびに番号が記入され、順序を行頭から若番として、A抽出列とP作業列を参照等 しながらと頭の中ではイメージしていますが・・・。 過去の分を検索したら、似たようなので逆のパターンがありました。 エクセルは2000です。文字位置が上手く合ってないですが 皆様のお知恵をお願いいたします。

  • 複数のExcelブックから特定シートのセル範囲抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル範囲を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 このサイトで殆どよく似た回答を読んだのですがうまくいきません。VBA初心者です。 よろしくお願いします。 【前提】 ・実行する端末のOSはWindows 10 ExcelはOffice365 ProPlus ・対象フォルダはネットワーク接続フォルダ  この中に、複数のExcelブック(xlsx、xlsm)があります。 ・抽出したい対象は、各ブック内の「台帳」シートの「A3:Cの最終行」で  複数のブックの中には「台帳」シートが含まれていないブックも混在しています。 【抽出一覧作成イメージ】 ・「集約.xlsm」ブックの「集計」シートの2行目から抽出した結果を一覧表示する。 ・「集約.xlsm」ブックにマクロは登録する ・表示はA列に抽出元ブック名(=ファイル名)、B列からD列に抽出元「A3:Cの最終行」セルの値。 ・「A3:Cの最終行」セルの値を「集約.xlsm」ブックの「集計」に貼り付ける際には「値で貼り付ける」が望ましい。

  • エクセル マクロ 条件付csvデータ抽出

    マクロ初心者ですが難易度の高い仕事を任され困っています。 ディスクトップのAというファイル(C:¥Users¥Desktop¥A)にタイトルが「店名」+「-」+「日付(yyyymmddhhmm)」のcsvファイルが大量にあります。 sheet1のセルA1に「店名」を入力し、sheet1のセルA2に「抽出対象開始期間(yyyymmdd)」を入力、sheet1のセルA3に「抽出対象終了期間(yyyymmdd)」を入力し、該当するcsvファイルのデータをsheet2のA2から順に抽出したい(該当なしの際は該当なしを表示したい)のですがご教授お願いします。 ※csvファイル名が日付(yyyymmddhhmm)となっている為、抽出条件(yyyymmdd)では重複する可能性がありますが、重複する全てのデータを抽出したい。 長文で申し訳ありませんがよろしくお願いします。