- ベストアンサー
【エクセル マクロ】オートフィルター後の行削除
- Excel2003を使用しています。オートフィルターを利用した作業をマクロの記録で処理していて、抽出されたデータを行ごと削除しています。毎月変わるデータ数に対応できるマクロの記述を教えて下さい。
- Excel2003を使用しています。オートフィルターを利用した作業をマクロの記録で処理していますが、抽出されたデータを行ごと削除する際に、固定の行番号で指定されているため、データ数の変動に対応できません。毎月変わるデータ数に対応できるマクロの記述を教えてください。
- Excel2003を使用しています。オートフィルターを利用した作業をマクロの記録で処理していますが、データを削除するために固定の行番号を指定しています。しかし、データ数が毎月変わるため、現在の記述ではうまく処理できません。毎月変わるデータ数に対応できるマクロの記述を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#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
その他の回答 (4)
- mitarashi
- ベストアンサー率59% (574/965)
ここのところが不思議ですが、これは自動記録したコードなのでしょうか? Selection.AutoFilter Field:=1, Criteria1:="仕入先コード" たとえば、仕入れ先コードがA列で、抽出したいコードが012345だとすると、自動記録すると、 Selection.AutoFilter Field:=1, Criteria1:="012345"となると思います。 自動記録して、うまくいっていないコードをそのまま掲示して、見せて下さい。
- mitarashi
- ベストアンサー率59% (574/965)
#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
- mitarashi
- ベストアンサー率59% (574/965)
#1です。 注釈漏れがありました。 'Ctrl+Shft+: です。 'Selection.CurrentRegion.Select -自動記録
- mitarashi
- ベストアンサー率59% (574/965)
表が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
お礼
お礼が遅くなり大変申し訳ありません。回答ありがとうございます。 教えて頂いた記述で、いろいろ試してみました。 エラーは出ないものの、抽出したデータを全て削除出来ません。 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 こういう記述の仕方ではダメなのでしょうか? お礼が遅くなったうえに再度の質問をお許し下さい。 よろしくお願いします。
お礼
おはようございます。再度の回答ありがとうございます。 >・Cells.selectはシート全面選択なので、遅くなるだけなのでやめましょう。表がA1から始まるなら、Range("A1").CurrentRegion.Selectとしましょう。 最初にも書いたようにデータがテキストファイルからエクセルに 取り込んでいるため、前面選択でなくても、ある程度の範囲選択を しないと空白行があり、オートフィルター機能が使えないので 前面選択で作業をしていました。 前面選択をしないのであれば、違う処理方法を考えなければ…。 少し時間をかけて考えてみたいと思います。 最後まで丁寧にありがとうございました。 また質問させて頂いた際は、よろしくお願いします<(_ _)>