- 締切済み
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日の月曜日中になんとか作成したい資料なのです。 お手数ですが宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kmetu
- ベストアンサー率41% (562/1346)
ステップ実行して デバッグのステップイン 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)
フィルターの▼が付いているセルの先頭がA列としたら Field:3はC列になります(B列が先頭ならD列)がそこが対象として結果はあっていますか?
- kmetu
- ベストアンサー率41% (562/1346)
> 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)の前提が違うのではないでしょうか。
補足
お世話になります。 早速のご指摘、ありがとうございました。 この部分は、退職者が作成したため確認を取れませんが、「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の修正では、根本的な解決になっていない様子です。
お礼
新期や月末/月初の処理が多忙になり、お礼の入力が遅れてしまい申し訳ありません。 当該作業に注力できない状況になってしまったため、集計可能なレコード数を複数回に分けて集計することで処理しました。 参考となる情報、ありがとうございました。
補足
迅速な返答、ありがとうございます。 ■補足記載の内容が間違ってした。 ---------------------------------------------------------------- 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を抽出できました。 ・初心者には難しいですね・・・。