プロが教えるわが家の防犯対策術!

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日の月曜日中になんとか作成したい資料なのです。
  お手数ですが宜しくお願いします。

A 回答 (3件)

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

補足日時:2011/04/18 16:29
    • good
    • 0

フィルターの▼が付いているセルの先頭がA列としたら


Field:3はC列になります(B列が先頭ならD列)がそこが対象として結果はあっていますか?

この回答への補足

迅速な返答、ありがとうございます。

■補足記載の内容が間違ってした。
----------------------------------------------------------------
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を抽出できました。

  ・初心者には難しいですね・・・。

補足日時:2011/04/18 20:07
    • good
    • 0
この回答へのお礼

新期や月末/月初の処理が多忙になり、お礼の入力が遅れてしまい申し訳ありません。

当該作業に注力できない状況になってしまったため、集計可能なレコード数を複数回に分けて集計することで処理しました。

参考となる情報、ありがとうございました。

お礼日時:2011/05/26 15:11

ステップ実行して


デバッグのステップイン 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)のコードだけでいいのではないでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!