VBA - 应用过滤器后删除可见行

时间:2018-04-11 12:14:20

标签: excel vba excel-vba

我有两个Macro,它按日期过滤工作表列,然后删除不相关的列。

然而,这是非常错误的,我需要一些帮助来纠正这一点。

这是第二个宏应该做的事情:

1)在应用过滤器后删除可见行,第一行(标题)除外 - 目前,它删除包括第一行在内的所有可见行,即使我有{{ 1}}我的代码中的函数。

2)删除所有过滤器 - 现在工作正常

Offset

3 个答案:

答案 0 :(得分:2)

SpecialCells将像上一个答案一样工作。

    Sub Button1_Click()
    Dim sh As Worksheet, rng As Range, LstRw As Long

    Set sh = Sheets("Sheet1")
    With sh
        LstRw = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set rng = .Range("A2:A" & LstRw).SpecialCells(xlCellTypeVisible)
        rng.EntireRow.Delete
        .AutoFilterMode = False
    End With
End Sub

答案 1 :(得分:1)

删除过滤数据行是我在使用excel中的表时需要的时间,但在删除重要内容时,我永远不会相信宏。如果您仍想使用它,这可能对您有用:

Sub DeleteVisibleRows()
Dim ws As Worksheet
Dim lastrow As Long, i As Long

Set ws = ThisWorkbook.Worksheets("Consolidated")
With ws
    lastrow = .Cells(.Rows.Count, "B").End(xlUp).Row
    For i = lastrow To 2 Step -1 'To 2 Assuming first row contains headers
        If .Rows(i).Hidden = False Then
            .Rows(i).Delete
        End If
    Next
.ShowAllData 'remove filtered data
End With
End Sub

答案 2 :(得分:0)

如果您使用SELECTION,则无需定义工作表。您需要的所有内容都与您的选择相关 - 您的选择可能不在Consolidated工作表上,但它始终位于您选择的父对象上。

以下代码假定您已应用过滤器 - 如果不是,则标题下方的所有内容都将被删除。

Public Sub DeleteVisibleRows()

    Dim WorkRng As Range

    Set WorkRng = Selection

    With WorkRng
        .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    WorkRng.Parent.AutoFilterMode = False

End Sub  

编辑:该代码太长了,我将摆脱一些垃圾。

Public Sub DeleteVisibleRows()

    With Selection
        .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        .Parent.AutoFilterMode = False
    End With

End Sub