[[20171004163231]] 『「オートフィルタ抽出後の非表示行の削除」[takas』(としよりのひやみず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『「オートフィルタ抽出後の非表示行の削除」[takasa_ara] について』(としよりのひやみず)

投稿
[[20100323161444]] 『オートフィルタ抽出後の非表示行の削除』(takasa_ara) 
についてのご回答=削除したい行をオートフィルタで表示させて削除=をマクロで実行したいと思い、作業を記録させてみたのですが、削除したい行がいつも同じところにあるとは限らない場合、どのようにアレンジすればいいでしょうか?
ご指導よろしくお願いいたします。

ActiveSheet.Range("$A$1:$K$25").AutoFilter Field:=6, Criteria1:=Array( _

        "5315800", "7301500", "8349700", "1900000"), Operator:=xlFilterValues
    Rows("3:8").Select
    Selection.Delete Shift:=xlUp
    Rows("1:1").Select
    Selection.AutoFilter

< 使用 Excel:Excel2010、使用 OS:unknown >


末尾行からCTRL+↑を押下すると、表示している最終行が得られます。フィルタ後に、2行目からここまでを消せばよろしいかと。

 Sub test()
    Dim iw As Long

    With ActiveSheet
        If .AutoFilterMode = True Then
            .AutoFilterMode = False
        End If
        .Range("$A$1:$K$25").AutoFilter Field:=6, Criteria1:=Array( _
            "5315800", "7301500", "8349700", "1900000"), Operator:=xlFilterValues
        iw = .Cells(.Rows.Count, "A").End(xlUp).Row
        If 1 < iw Then
            .Rows("2:" & iw).Delete Shift:=xlUp
        End If
        .AutoFilterMode = False
    End With
 End Sub
(???) 2017/10/04(水) 17:12

 ActiveSheetということなら

 Sub test()
     Dim rng As Range
     With Range("$A$1:$K$25")
         .AutoFilter Field:=6, Criteria1:=Array("5315800", "7301500", _
                              "8349700", "1900000"), Operator:=xlFilterValues
         If Evaluate("subtotal(3," & .Columns(6).Address & ")") = .Rows.Count Then
             .AutoFilter: Exit Sub
         End If
         Set rng = .SpecialCells(12).EntireRow
         .AutoFilter
         rng.Hidden = True
         .SpecialCells(12).EntireRow.Delete
         .Rows.Hidden = False
     End With
 End Sub
(seiya) 2017/10/04(水) 18:49

例えば、

Sub test()

    ActiveSheet.Range("$A$1:$K$25").AutoFilter _
            Field:=6, _
            Criteria1:=Array("5315800", "7301500", "8349700", "1900000"), _
            Operator:=xlFilterValues
    ActiveSheet.AutoFilter.Range.Offset(1).Delete Shift:=xlUp
    ActiveSheet.AutoFilter.Range.AutoFilter
End Sub

ActiveSheet.AutoFilter.Range
      ↓
「アクティブシートのオートフィルターが掛かっているセル範囲」 の意

マクロの記録では出てきませんが、VBAでは、こういう表現が用意されているので、
これに対して何かの命令をしてやってください。(削除やオートフィルターの解除等)
オートフィルターモードの間は非表示のセルについては操作の対象外になります。
なので、ざっくり表現してやればよいです。
が、タイトル行は無視されないので、操作対象を1行ずらして削除してます。

※注意
ただし、1行ずらせば、最初の対象より1行ずれるので、
表の外に対しても操作の対象になるので、表の1行下のセルを削除してまずい場合は、
もう少し丁寧にセル範囲を表現してやる必要があります。

また、With句というものを使えばも少しスッキリします。

Sub test2()

    With ActiveSheet.Range("$A$1:$K$25")
        .AutoFilter _
                Field:=6, _
                Criteria1:=Array("5315800", "7301500", "8349700", "1900000"), _
                Operator:=xlFilterValues
        'もし、1件以上(タイトル行を含むので実際には1より大きい数になったら)
        If .Columns(1).SpecialCells(xlCellTypeVisible) > 1 Then
            '1行下から表の行数より1少ない行数分の削除(非表示行は無視される)
            .Offset(1).Resize(.Rows.Count - 1).Delete Shift:=xlUp
        End If
        .AutoFilter
    End With
End Sub

こういう風にセル範囲を自在に表現できるといいかもです。

(まっつわん) 2017/10/05(木) 13:47


まっつわん様
ご丁寧にありがとうございます。
test2()を試してみたところ、大変上手くいきました。
正直なところぼんやりとしか理解できていませんが、これからコツコツ学んでいこうと思います。
今後ともご指導よろしくお願いいたします。
(としよりのひやみず) 2017/10/05(木) 15:11

???様、seiya様、すみません、お礼が遅くなりました。
内容が全然理解できていないのですが、お二人の方法でも上手くできました!
今後ともご指導のほど、よろしくお願いいたします。
(としよりのひやみず) 2017/10/05(木) 15:23

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.