在没有自动筛选器的情况下在Excel VBA中筛选列表

我希望能够根据在列表框中select的条件筛选列表。 这是我目前的做法。

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 

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

例如:

 Name Age john 20 john1 28 john2 30 john3 20 john4 19 

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

我的目标是创build一个大量的数据列表,当从列表框中select更多的标准时,这些数据将“回滚”。

谢谢!

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

 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 

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

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

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

 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