【问题标题】:VBA - Delete Visible Rows After Filter AppliedVBA - 应用过滤器后删除可见行
【发布时间】:2018-05-08 16:38:03
【问题描述】:

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

但是,它有很多错误,我需要一些帮助来纠正它。

这是第二个宏应该做的:

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

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

Sub DeleteVisibleRows()

Dim ws1 As Worksheet
Dim WorkRng As Range

Set ws1 = ActiveWorkbook.Sheets("Consolidated")

On Error Resume Next

Set WorkRng = Application.Selection

Application.ScreenUpdating = False
With ws1

WorkRng.Offset(1, 0).Rows.SpecialCells(xlCellTypeVisible).EntireRow.Delete

ws1.AutoFilterMode = False

End With

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 问题出在Set WorkRng = Application.Selection这一行。您应该避免使用Selection 并尝试更好地定义您的范围。运行此宏时的Selection 是什么?您可以偏移 1,但仍包括标题。此外,On Error Resume Next 不是必需的,不重置它会阻止您看到其他错误。
  • @DarrellH 选择是应用第一个宏后过滤的数据。所以我过滤掉前一天的日期,然后显示的数据将成为我的选择。接下来我看到很多人强烈反对错误简历,我不是 vba 编码器,所以我不知道为什么会这样。我能做些什么来代替它?
  • 我看到你现在有很多选择。反对On Error Resume Next 的原因是你无法调试你不知道的东西。在某些情况下它是适用的,但你应该知道为什么。
  • @DarrellH 好的,谢谢你的建议 :)

标签: vba excel


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    删除过滤数据行是我在 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
    

    【讨论】:

    • @EitelDagnin 例如,我忘记将 ws 引用添加到我现在编辑的范围中。此类错误可能会导致从不正确/当前活动的工作表中删除数据。
    • 感谢您的回复。我试过你的代码,不幸的是,代码卡在一个循环中,我等了大约 2-3 分钟才真正强制取消宏。
    • @EitelDagnin 您的表格在“合并”表中的范围是多少?你的桌子后面还有其他条目吗?
    • 工作表中没有“表格”。它只是单元格中的原始数据。我没有根据数据创建表。
    • @EitelDagnin 好的,让我这样问你:包括标题在内的过滤范围是多少?
    【解决方案3】:

    如果您使用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
    

    【讨论】:

    • 我收到应用程序定义或对象定义错误@Darren
    • 这很奇怪。我无法让它工作。我尝试将代码放在Sheet1 后面并在Sheet2 中选择一个范围,我尝试将代码放在Book2 中并在Book1 中选择一个范围。每次它删除选择中的可见行,留下标题。那么您的数据有什么特别之处可能导致......您的单元格是否被锁定并且工作表在您尝试删除的行的任何位置都受到保护?这会导致错误 - 当它无法删除您告诉它的单元格时。
    • 不,单元格未锁定,工作表或工作簿上也没有保护。老实说,我不知道在这里说什么。我完全复制了您问题中“编辑”下的代码块中的代码,然后运行了代码,这就是我得到的错误..
    • 您只选择了一个单元格?如果只有一个单元格,.Rows.Count 将返回 1,?Selection.Resize(Selection.Rows.Count-1).Address 将返回错误消息(将所选内容调整为 0 行)。
    • 谢谢@Darren,这不是问题,Davesexcel 提供了一个解决方案,而且效果很好。不过还是谢谢你的帮助:)
    猜你喜欢
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多