Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA中不带自动筛选的筛选列表_Vba_Excel_Filter - Fatal编程技术网

Excel VBA中不带自动筛选的筛选列表

Excel VBA中不带自动筛选的筛选列表,vba,excel,filter,Vba,Excel,Filter,我希望能够根据列表框中选择的条件筛选列表。这是我目前的做法 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 我对自动筛选的问题

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

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
我设想的情况是,如果从下拉列表中选择20岁,john3将向上移动到john1所在的位置,其余的行将被删除(但不只是隐藏)

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


谢谢大家!

如果您已经有了逻辑,可以完成自动筛选

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

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

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

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

那么,在没有自动筛选的情况下,您是如何让它工作的呢?当您说
listbox
时,您是指表单上的列表框吗?如果不是,您能否更清楚地解释您的意思,或者向我们展示您的工作表的样本数据以及您希望它在处理后的外观?您的意思是,您希望在列表框中仅显示实际可见行的值?为什么要删除这些行?也许可以用比实际删除行(您需要一个存储行的位置)更简单的方式实现您想要的结果。您介意使用UDF吗?如果你的文件列表很大,那么它的响应速度就不会那么快