• 締切済み

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の修正では、根本的な解決になっていない様子です。