こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【エクセル マクロ】オートフィルター後の行削除

Excel2003を使用しています。

オートフィルターを利用した作業をマクロの記録で処理していて
抽出されたデータを行ごと削除しているのですが

Selection.AutoFilter Field:=1, Criteria1:="仕入先コード"
Rows("4:2102").Select
Selection.Delete shift:=xlUp

Selection.AutoFilter Field:=2, Criteria1:="仕入先合計"
Rows("7:2008").Select
Selection.Delete shift:=xlUp

…と、上記のような行番号で指定されてしまい
毎月データ数が増減するので、うまく処理出来ません。
(データは、テキストファイルからエクセルに取り込んでいます)
過去の例で近いものがあれば記述の中に取り込んでみましたが…
これもうまくいきませんでした。

毎月変わるデータ数に対応できるマクロの記述を教えて下さい。
よろしくお願いします。

投稿日時 - 2007-12-21 17:33:01

QNo.3616684

暇なときに回答ください

質問者が選んだベストアンサー

#1です。
すみません、暫く間が開いたので勘違いしていました。
・Cells.selectはシート全面選択なので、遅くなるだけなのでやめましょう。表がA1から始まるなら、Range("A1").CurrentRegion.Selectとしましょう。
・1列目が仕入れ先コードの行と、仕入れ先合計(それとも=?)の行を削除したい様ですが、続けて実行しても後からフィルター条件を設定した方しか有効ではありませんので、条件を変えて2回実行する必要があります。
・下記コードは、A列が「仕入れ先コード」の行と、「=」の行を削除するコードです。「=」を消したい場合は、何故か自動記録すると、「==」となっていました。最初の質問通り、「仕入れ先合計」を消したい場合は、「==」のところを置き換えてください。※画面上「==」は全角のイコールに見えますが、半角イコールが2個続いていますので、ご注意下さい。
Sub test()
Range("A1").CurrentRegion.Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="仕入先コード"
Selection.CurrentRegion.Offset(1, 0).Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.EntireRow.Delete
Selection.AutoFilter Field:=1
'
Range("a1").CurrentRegion.Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="=="
Selection.CurrentRegion.Offset(1, 0).Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.EntireRow.Delete
End Sub

投稿日時 - 2007-12-28 00:03:25

お礼

おはようございます。再度の回答ありがとうございます。

>・Cells.selectはシート全面選択なので、遅くなるだけなのでやめましょう。表がA1から始まるなら、Range("A1").CurrentRegion.Selectとしましょう。

最初にも書いたようにデータがテキストファイルからエクセルに
取り込んでいるため、前面選択でなくても、ある程度の範囲選択を
しないと空白行があり、オートフィルター機能が使えないので
前面選択で作業をしていました。

前面選択をしないのであれば、違う処理方法を考えなければ…。
少し時間をかけて考えてみたいと思います。
最後まで丁寧にありがとうございました。
また質問させて頂いた際は、よろしくお願いします<(_ _)>

投稿日時 - 2007-12-28 10:19:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

ここのところが不思議ですが、これは自動記録したコードなのでしょうか?
Selection.AutoFilter Field:=1, Criteria1:="仕入先コード"
たとえば、仕入れ先コードがA列で、抽出したいコードが012345だとすると、自動記録すると、
Selection.AutoFilter Field:=1, Criteria1:="012345"となると思います。
自動記録して、うまくいっていないコードをそのまま掲示して、見せて下さい。

投稿日時 - 2007-12-27 23:22:18

ANo.3

#1です。Selectしないコードの例です。興味が湧いたら、参考書を買って勉強してください。
前提は、対象の表が、Sheet1のA1から始まっている事です。また、#1と異なり、オートフィルターをかけて、抽出~行削除、オートフィルター解除までを行っております。
ここでは表の一つ下の行をついでに消してしまうのは解消しています。(このためだけに書いてみたのが実情)
ちょっとひねれば、抽出する値を他のシートのセル値から与えたりできます。
Sub test()
Dim myRange As Range
Dim filterColumn As Long
Dim filterCriteria As String

filterColumn = 1 '抽出列
'filterColumn = Columns("A").Column '列番を数えるのが面倒なとき
filterCriteria = "????" '抽出する項目の値
Set myRange = Sheets("Sheet1").Range("A1").CurrentRegion
myRange.AutoFilter Field:=filterColumn, Criteria1:=filterCriteria
Set myRange = myRange.Offset(1, 0).Resize(myRange.Rows.Count - 1, myRange.Columns.Count)
Set myRange = myRange.SpecialCells(xlCellTypeVisible)
myRange.EntireRow.Delete
Sheets("Sheet1").Range("a1").AutoFilter
End Sub

投稿日時 - 2007-12-22 10:24:46

ANo.2

#1です。
注釈漏れがありました。
'Ctrl+Shft+: です。
'Selection.CurrentRegion.Select -自動記録

投稿日時 - 2007-12-21 23:12:56

ANo.1

表がA1から始まっていて、1行目はフィールド名とします。
下記はA列で条件を設定して抽出している事例です。
すでにオートフィルターの設定がされているところから始まっています。
また、自動記録のマクロに対して、そのままではフィールド名の行も消してしまうため、一カ所だけ修正しています。
やりたいのはこんな事でしょうか?
なお、当方Excel2000です。
Sub Macro1()
Selection.AutoFilter Field:=1, Criteria1:="????"
Range("a1").Select
'フィールド名も消してしまわないように改造
'表の一つ下の行も消してしまうが、実用上問題なしとする
'Selection.CurrentRegion.Select -自動記録
Selection.CurrentRegion.Offset(1, 0).Select
'編集/ジャンプ/セル選択/可視セル
Selection.SpecialCells(xlCellTypeVisible).Select
'右クリック/行削除/行全体
Selection.EntireRow.Delete
End Sub

投稿日時 - 2007-12-21 23:09:01

お礼

お礼が遅くなり大変申し訳ありません。回答ありがとうございます。

教えて頂いた記述で、いろいろ試してみました。
エラーは出ないものの、抽出したデータを全て削除出来ません。

Cells.Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="仕入先コード"
Selection.AutoFilter Field:=1, Criteria1:="="
Selection.CurrentRegion.Offset(1, 0).Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.EntireRow.Delete

こういう記述の仕方ではダメなのでしょうか?
お礼が遅くなったうえに再度の質問をお許し下さい。

よろしくお願いします。

投稿日時 - 2007-12-27 17:12:14

あなたにオススメの質問