在没有自动过滤器的Excel VBA中过滤列表

时间:2015-12-04 13:42:38

标签: excel vba excel-vba filter

我希望能够根据列表框中选择的条件过滤列表。这是我目前的做法。

# echo $?
137

我对autofilter的问题是它实际上隐藏了不符合列表框条件的行。我想要的是个人数据行被隐藏,但以某种方式被从实际列表中删除,并且下面的值未被过滤取代它。

例如:

Private Sub Worksheet_Change(ByVal Target As Range)
With Sheet1
    .AutoFilterMode = False
    .Range("A1:D1").AutoFilter
    .Range("A1:D1").AutoFilter field:=2, Criteria1:=Range("H9").Value
End With
End Sub

我想象的是,如果从下拉列表中选择20岁,john3将会移动到john1所在的位置,其余行将被移除(但不会被隐藏)。

我的目标是创建一个大型数据列表,当从列表框中选择更多条件时,这些数据将“回滚”。

谢谢!

2 个答案:

答案 0 :(得分:1)

我一直使用下面的代码来“清理”大型过滤列表,并通过电子邮件将适当的子集发送给不同的人。它会删除所有隐藏的行,包括自动过滤器隐藏的行。 请注意,您无法取回这些内容!如果您希望能够“重置”您的列表,我会将该列表的副本保存在另一张表格中,并为其提供一些方法当用户需要重置数据时,将重新复制到活动工作表中。

Sub CutFromFilter()
    Dim oRow As Range, rng As Range
    Dim myRows As Range
    With ActiveSheet
        Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange)
        If myRows Is Nothing Then Exit Sub
    End With

    For Each oRow In myRows.Columns(1).Cells
        If oRow.EntireRow.Hidden Then
            If rng Is Nothing Then
                Set rng = oRow
            Else
                Set rng = Union(rng, oRow)
            End If
        End If
    Next

    If Not rng Is Nothing Then rng.EntireRow.Delete
    ActiveSheet.Range("A1").Select
End Sub

答案 1 :(得分:0)

如果你已经有逻辑可以完成自动过滤,

您可以使用以下代码将这些可见项添加到列表中

nRow将是可见的记录,使用数字来控制要添加到列表框中的列值

Dim Rng, nRow As Range
Dim N As Single

Set Rng = ActiveSheet.AutoFilter.Range

    For N = 2 To Rng.Rows.Count
        Set nRow = Rng.Rows(N)
        If Not nRow.Hidden Then
            MsgBox nRow(1) '1 means first column of AutoFilter Range

        End If

    Next