• 締切済み

Excel VBA による特定Recordの抽出

VBAの初心者です。 各コマンドの意味もよく理解してないため、原因が判りません・・・。 ■特定情報を抽出するVBAの結果が合致しません。  ・Record数が「5000件」あるExcelFileから、Field:3に「1」が入力されているRecordを抽出するVBAを作りました。  ・ExcelsheetでFilterにより抽出するとField:3には「1」が「839件」入力されています。   しかし、実際に作成したVBAを走らせてみると「800件」しか抽出できません。 ■下記が作成したVBAです。 -------------------------------------------- 1)Private Sub task_Select2() Range("F1").Select Selection.AutoFilter Field:=6, Criteria1:="=1", Operator:=xlAnd Rows("3:5503").Select Range("B3").Activate Selection.Delete Shift:=xlUp Selection.AutoFilter Field:=6 ActiveWindow.LargeScroll Down:=-13 Range("B1").Select End Sub 2)Private Sub backup_task2() 'バックアップ用コピー処理 Dim Model As String, fName As String Model = ActiveSheet.Name fName = Model & "_wo" Worksheets(Model).Copy After:=Worksheets(Model) ActiveSheet.Name = fName Worksheets(Model).Activate End Sub 3)Private Sub task_Select3() Selection.AutoFilter Field:=3, Criteria1:=">1", Operator:=xlAnd Rows("3:10000").Select Range("B3").Activate Selection.Delete Shift:=xlUp Selection.AutoFilter Field:=3 ActiveWindow.LargeScroll Down:=-25 Range("B1").Select End Sub 4)Sub A_Main_task() '動作用メイン処理 Application.Run "backup_task" Application.Run "task_Loop" Application.Run "CommentMix" End Sub 5)Private Sub backup_task() 'バックアップ用コピー処理 Dim model As String, fName As String Model = ActiveSheet.Name fName = Model & "_copy" Worksheets(Model).Copy After:=Worksheets(Model) ActiveSheet.Name = fName Worksheets(Model).Activate End Sub -------------------------------------------- 1)でField:6に情報が入力されてないRecordを削除。 3)でField:3に「1」以外が入力されているRecordを削除。 ●1)の「Rows("3:5503").Select」でRecord「5000件」なら問題ないと思いましたが、   1)の結果は「4770件」でした。(5000件になると思ったのですが・・・) ・5000件以上のRecordを処理させようと思い、「Rows("3:5503").Select」の範囲を単純に増やしても1)の結果が減ってしまいます。 ◎Record数が「2700件」程度の情報は問題なく目的数の情報を抽出できました。 ●来週18日の月曜日中になんとか作成したい資料なのです。   お手数ですが宜しくお願いします。

みんなの回答

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

ステップ実行して デバッグのステップイン F8 で実際に思うようなフィルターになっているのか確認してみてはいかがですか。 こちらではC列0から4までのデータで10000行でもちゃんと1のデータだけが残りましたよ。 ところで 1)Selection.AutoFilter Field:=3, Criteria1:="=0", Operator:=xlAnd 2)Selection.AutoFilter Field:=3, Criteria1:="<>1", Operator:=xlAnd 2回同じフィールドにフィルターをかけていますが "=0"は"<>1"に含まれますから2)のコードだけでいいのではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

フィルターの▼が付いているセルの先頭がA列としたら Field:3はC列になります(B列が先頭ならD列)がそこが対象として結果はあっていますか?

Teufelheim
質問者

お礼

新期や月末/月初の処理が多忙になり、お礼の入力が遅れてしまい申し訳ありません。 当該作業に注力できない状況になってしまったため、集計可能なレコード数を複数回に分けて集計することで処理しました。 参考となる情報、ありがとうございました。

Teufelheim
質問者

補足

迅速な返答、ありがとうございます。 ■補足記載の内容が間違ってした。 ---------------------------------------------------------------- C. 1)のRows("3:5503")を("3:5503")に変更し、「7974件」のデータを集計した    ところ、3)の抽出結果は「1件」でした・・・。     ↓   「1)のRows("3:5503")を("3:10000")に変更」 ---------------------------------------------------------------- ●Cellの先頭は「A列=Field:1」、「C列=Field:3」で合ってます。   ・抽出Dataの参照列は、「C列」です。  修正したVBAによる集計結果は、下記の通りです。  【3,804件でRecord空欄無し】 ※正常抽出Data  ************************  下記に修正 1)Selection.AutoFilter Field:=3, Criteria1:="=0", Operator:=xlAnd Rows("3:5503").Select Range("B3").Activate Selection.Delete Shift:=xlUp Selection.AutoFilter Field:=3 3)Private Sub task_Select3() Selection.AutoFilter Field:=3, Criteria1:="<>1", Operator:=xlAnd Rows("3:10000").Select Range("B3").Activate Selection.Delete Shift:=xlUp Selection.AutoFilter Field:=3 ActiveWindow.LargeScroll Down:=-25 Range("B1").Select  ************************  A. DataRecord総数= 3,804件  B. 1)でのRecord削除結果= 3.804件  C. 3)でのRecord削除結果= 678件  ・・・・・ 「1」の入力数  D. 元Dataの「Field:3(C列)」でのFilter結果= 678件  ⇒目的Dataの抽出に成功!  【7,974件でRecord空欄無し】 ※1件しか抽出せず  ************************* 1)のRows("3:5503")を("3:10000")に変更  *************************  A. DataRecord総数= 7,974件  B. 1)でのRecord削除結果= 7,974件  C. 3)でのRecord削除結果= 1件  ・・・・・ 最初のRecordのみ  D. 元Dataの「Field:3(C列)」でのFilter結果= 1,232件    ※「1」の入力数=1,232件   ・Rows("3:10000")で項目Recordの1行目と必ずDataの入っている    2行目のRecord以下の3列目から集計対象にしているため、2行目    の集計範囲外Recordのみ抽出しています。  ⇒目的Dataの抽出に失敗  ●とりあえず、5000件を超えるデータは、5000件以下に分けて集計を  行えば、目的のDataを抽出できました。   ・初心者には難しいですね・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

> 1)でField:6に情報が入力されてないRecordを削除。 Field:=6, Criteria1:="=1" ですのでField:6が1と等しい行を削除していますが、それでいいのでしょうか。 > 3)でField:3に「1」以外が入力されているRecordを削除。 1以外だと通常 Criteria1:="<>1" と指定されると思われます。 ですので > ●1)の「Rows("3:5503").Select」でRecord「5000件」なら問題ないと思いましたが、 >   1)の結果は「4770件」でした。(5000件になると思ったのですが・・・) 1)の前提が違うのではないでしょうか。

Teufelheim
質問者

補足

お世話になります。 早速のご指摘、ありがとうございました。 この部分は、退職者が作成したため確認を取れませんが、「Field:=6」には 「1」が入力されることが無いため、「=1」で入力されていないRecord(空欄) を削除する意図だと思います。 「Field:=3」には「1~4」の数値のみが入力されるため、「>1」で「2~4」を削除し、 「1」を抽出することが意図だと思います。 【修正内容】  A.「Field:=6」は、年月「yyyymm」が入力されています。   ・これを「Field:=3」(1~4の数値入力Field」に修正し、「=0」に変更して入力    の無いRecord削除を意図しました。  B. 3)の削除記述を「<>1」に修正しました。  これにより、5000件以下のデータ集計は、正常に抽出できました。  (Field:3に入力された「1」のデータ739件を正常に抽出)  C. 1)のRows("3:5503")を("3:5503")に変更し、「7974件」のデータを集計した    ところ、3)の抽出結果は「1件」でした・・・。    ※本来、Field:3には「1」の入力されたデータが1232件存在します。    A及びBの修正では、根本的な解決になっていない様子です。

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

関連するQ&A

  • オートフィルタで抽出したデータをVBAで貼り付けしたい

    質問させていただきます。 エクセルで仕入帳を作っています。 各取引先ごとに1枚のシートになっているのですが、 該当する月をオートフィルタで抽出して、そのデータを1枚のシートに貼り付けていき、各月ごとにデータをまとめたいと思っています。 ユーザーフォームで月を入力してオートフィルタで抽出しているのですが、データのないシートの場合不要な部分までコピー&ペーストされてしまいます。 これを回避するにはどのようにコードをかけばいいのでしょうか。 よろしくお願い致します。 現在はこのようなコードで抽出しています。 Private Sub CommandButton1_Click() Application.ScreenUpdating = False Worksheets("sheet2").Select Range("H1:H17").Select Range("H17").Activate Selection.AutoFilter Field:=8 Rows("2:2").Select Rows("2:500").Select Selection.ClearContents RowIndex = 3 '行番号の初期値設定 Do While Worksheets("目次").Cells(RowIndex, 1).Value <> "" '拾ったセルの値が空でない間ループ内の処理をする 検索値 = UserForm1.TextBox1.Text DataSheetName = Worksheets("目次").Cells(RowIndex, 1).Value Worksheets(DataSheetName).Select Range("A2").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=13, Criteria1:=検索値 & "月分" Set tbl = ActiveCell.CurrentRegion tbl.Offset(2, 0).Resize(tbl.Rows.Count - 2, tbl.Columns.Count).Select Selection.Copy Worksheets("sheet2").Select IRow = Range("A" & Rows.Count).End(xlUp).Row Range("A" & IRow + 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Worksheets(DataSheetName).Select Selection.AutoFilter Field:=13 RowIndex = RowIndex + 1 '行番号カウントアップ Loop Application.ScreenUpdating = True Worksheets("sheet2").Select Range("A2").Select Unload UserForm1 End Sub

  • Excel2003VBA

    お世話になっております。 手作業マクロの記録で下記作業を行い、一部修正をして一度はうまく動作していたのですが 1点 問題が御座いまして独自に色々試していたのですが、どうにもうまくいかないので どなたかご教授いただけませんでしょうか。 Sub ●●用() ' ' ●●用 Macro ' 12月1月の店舗を抽出し新しいブックに移動する。 ' Selection.AutoFilter Field:=3, Criteria1:="=12月", Operator:=xlOr, _ Criteria2:="=1月" Selection.AutoFilter Field:=8, Criteria1:="(店名)" Range("A4:W2076").Select Selection.Copy Sheets.Add ActiveSheet.Paste Application.CutCopyMode = False Worksheets("Sheet1").Select Worksheets("Sheet1").Move Workbooks("営業部まとめ.xls").Sheets("全件表示").Activate Selection.AutoFilter Field:=3 Selection.AutoFilter Field:=8 Range("A5").Select ActiveWorkbook.Save End Sub まず、 >Worksheets("Sheet1").Move ここだけあれば >Worksheets("Sheet1").Select こっちは必要ないでしょうか? あと、上記の中で > Worksheets("Sheet1").Select この部分なのですが、毎回「Sheet1」とは限らないので「アクティブシート」にしたいと思い色々試してみましたが 全てエラーとなり、結局元にもどしてしまいました。 > Worksheets("Sheet1").Move あと出来ればこれも移動させた後でデスクトップに名前を付けて保存までしたいのですが どのようなコードを追加すればよろしいでしょうか。 宜しくお願い致します。

  • 違う列で、2つの抽出条件を満たすには

    OSはXPで、Excel2003を使用しています。 下記のマクロですと、Key列に任意の文字があって、Key2列に任意の文字が入っていなくても抽出されますが、 その逆、Key列に任意の文字がなくて、Key2列に任意の文字が入っている場合は抽出されません。 前者の場合も、後者の場合も抽出される様にするには、どの様にすれば良いか教えて下さい。 ***** Sub test() Dim Key As String Dim Key2 As String Key = Application.InputBox("抽出列の番号を入れて下さい") Key2 = Application.InputBox("抽出列の番号を入れて下さい") Worksheets.add After:=ActiveSheet, Count:=1 ActiveSheet.Name = "BBBB" Sheets("AAAA").Activate Range("A1").Select Selection.AutoFilter Selection.AutoFilter Field:=Key, Criteria1:="*" Selection.AutoFilter Field:=Key2, Criteria1:="*" Selection.CurrentRegion.Copy Sheets("BBBB").Activate Range("A1").PasteSpecial Paste:=xlAll Selection.CurrentRegion.Select End Sub ******* 説明不足な所がございましたら追記致します。 何卒よろしくお願い致します。

  • VBA関数

    PC ほぼ素人です。ネットで調べて、下記のコードを作成できました。 バージョンは2007 Sub 抽出() Worksheets("Sheet5").Activate Worksheets("Sheet5").Range(Cells(1, 1), Cells(328, 18)).Clear With Worksheets("Sheet3").Range("A8") .AutoFilter Field:=1, Criteria1:=Worksheets("Sheet3").Range("a2") ''(1) .AutoFilter Field:=2, Criteria1:=Worksheets("Sheet3").Range("b2") ''(1) .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("Sheet5").Range("A1") ''(2) .AutoFilter ''(3) End With Worksheets("Sheet5").Activate End Sub Sheet5に抽出後、そのデータを書き換え Sheet3へ戻したいのですが可能なのでしょうか?      A  B      C     D      E      F      G   1  月  日   得意先   前回    数量    今回    数量   2  3   5    A商事   1月15日   2     2月5日   3   抽出後、Sheet3には、ABDEFGを戻したいのです。 説明不足かもしれませんが、どうか宜しくお願い致します。   

  • エクセルマクロVBAについて

    エクセルマクロVBAについて、こんなこと出来ますか? ■A列からAS列の1行目にヘッダー情報をもつデータベース ■A列に担当者名 ■A列にオートフィルタをかけて各担当ごとにデータを抽出したものを別シートに貼り付けて自動印刷したい ■担当者は都度変わるので、Criteria1:="xxx"というようには直接書けない(担当名を自動で抽出したい) ■担当者の数も都度変わる ■補足 一行のデータを特定の雛形に転記する必要があるので別シートに出したいです ちなみに、アナログで記録したコードは以下です。 Sub test1() Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="山田" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="斉藤" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="田中" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub これ、担当者の抽出を自動でなんとかなりませんか?

  • Excelマクロでオートフィルターからコピペ

    ファイルのB列の値から0以外の値をオートフィルターで抽出し、値を、別のファイルのD列の一番下に貼りつけるマクロを作っていますがうまくいきません。 今作ったのは Sub macro1() If ActiveSheet.AutoFilterMode = False Then Range("A:G").Select Selection.AutoFilter Else Selection.AutoFilter Range("A:G").Select Selection.AutoFilter End If Selection.AutoFilter Field:=2, Criteria1:="<>0", Operator:=xlAnd Range("A1").Select Range("B2", Range("B2").End(xlDown)).Select Selection.Copy Windows("貼りつけるファイル名").Activate Cells(Rows.Count, 4).End(xlUp).Offset(1).Select ActiveSheet.Paste End Sub です。 フィルターで0以外の値を抽出しコピーまではできていますが、貼りつけるところでエラーがでます。 Microsoft Visual Basic 400 というエラーです。 何が悪いのか分かりません・・・。 分かる方いましたらご教授ください。よろしくお願いします。

  • VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えて

    VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えてください。 A列、C列に日付が入っていて、A列は空白以外のセルを表示し、かつC列は、開始日、終了日で抽出したいのですが、うまくいきません。 With Worksheets("sheet").Activate 開始日 = ">=" & TextBox1.Text 終了日 = "<=" & TextBox2.Text .Range("A1:N200").AutoFilter Field:=1, Criteria1:="<>" .Range("A1:N200").AutoFilter Field:=3, _ Criteria1:=開始日, Operator:=xlAnd, _ Criteria2:=終了日

  • VBA フォームを使って、期間でレコードを抽出するには?(Excel2003)

    いつも助けていただきありがとうございます。 再質問です。(内容をまとめました。) Excel2003でデータベースを作成しました。 「日付」(B列)のところには、2008/11/18という形式で入力しています。 VBAで抽出用フォームから「○○○○年○月○日~○○○○年○月○日までを抽出」として、 該当レコードを抽出するにはどうしたらよいでしょうか? いろいろ試してはみたのですが、よい方法・アイディアができませんでした。 VBA初心者です。よろしくお願いします。 ちなみに試してみたのは、 期間抽出用フォームで、期間の始めと終わりの西暦・月・日をそれぞれ入力すると、いったんそれぞれのセルに入力され、 v5(開始月日用のセル)=T4&"/"&U4&"/"&V4(西暦・月・日がいったん入るセル) t5(終了月日用のセル)=W4&"/"&X4&"/"&Y4 としました。(表示では2008/11/19となりました。) そして、 Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:=">=range("v5")", Operator:=xlAnd _ , Criteria2:="<=range("y5")" としたところ、エラーになりました。 どのように修正すればよいでしょうか?

  • EXCEL VBA オートフィルで別シートへコピー

    EXCEL VBA オートフィルで別シートへコピー しようとしたら、うまくいきません 別々に書くとうまくいくのですが コードを一緒にするとうまくいきません? コード *********************************************** Sub 抽出別シート() Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1" '1時間以下の8列目のをフィルター end sub sub カレントで別シートへコピー() Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")   'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** このように書くとうまくいくのですが これを一緒に書くと別シートへコピーがうまくいきません。 全てコピーされてしまいます +++++++++++++++++++++++++++++++++++++++++++++++ 一緒にしたコードです +++++++++++++++++++++++++++++++++++++++++++++++ *********************************************** Sub 抽出別シート() '1h以下をを抽出別シートへコピー Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1"    '1時間以下の8列目のをフィルター Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")    'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** 意味が分かりませんどなたかおしえていただけませんでしょうか? よろしくお願いいたします

  • excel vba で 実行時エラー13となります。

    こんにちは、 先日、「作りながら覚える! excel vba マクロ 組み方講座 永井善王著」という本を購入してvbaマクロを勉強中です。 本にそって進めていくと、P.122の所でストップしてしまいました。 急に「実行時エラー13 型が一致しません」と表示され、何回やりなおしてもそこから進めなくなりました。 コードは、 Sub DBシートから当月分シートを作成する() Dim 開始年月日 As Long Dim 終了年月日 As Long 開始年月日 = ">=" & Worksheets("年月日入力").Range("D4") 終了年月日 = "<=" & Worksheets("年月日入力").Range("D5") ChDir "C:\ときめき" Workbooks.Open Filename:="C:\ときめき\売上DB.xls" Sheets("当月分").Select Cells.Select Selection.Clear Sheets("DB").Select Range("A2").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:=開始年月日, _ Operator:=xlAnd, Criteria2:=終了年月日 Selection.CurrentRegion.Select Selection.Copy Sheets("当月分").Select Range("A1").Select ActiveSheet.Paste Sheets("DB").Select Application.CutCopyMode = False Selection.AutoFilter Sheets("住所録").Select ActiveWorkbook.Save ActiveWindow.Close End Sub になります。 3行目の  開始年月日 = ">=" & Worksheets("年月日入力").Range("D4") が黄色くなっています。 (なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。) 現在本に沿って勉強しているところですが、詰まってしまいお手上げの状態です。 どうぞ助けてくださいませ。

専門家に質問してみよう