Excel VBA:使用精确值保存自动筛选器设置

时间:2015-08-06 11:45:44

标签: excel vba excel-vba autofilter

我想运行一个保存自动过滤器设置,执行操作,可能编辑过滤器然后重新应用它的过程。

我使用以下代码保存自动过滤器数据:

With ActiveSheet.AutoFilter
    Set filtRange = .Range

    With .Filters
        fieldNumber = .Count
        ReDim filtArray(1 To fieldNumber, 1 To 4)

        For f = 1 To fieldNumber
            With .Item(f)
                If .On Then
                    filtArray(f, 1) = 1
                    filtArray(f, 2) = .Operator
                    filtArray(f, 3) = Criteria1
                    If .Operator <= 2 And .Operator > 0 Then
                        filtArray(f, 4) = Criteria2
                    End If
                End If
            End With
        Next f

    End With

End With

我的问题是标准没有像输入那样保存。例如您可以在Criteria1字段中输入10并使用xlTop10items运算符的前10个过滤器。但是,使用此方法会返回Criteria1,例如>=50,如果50是第十个最高值。

我可以实现一个长期的程序,可以解决这个问题,得出50级是什么,然后推断出这是前十名的过滤器(而不是前5名),因为我知道它是顶级的来自运营商的X过滤器,但有更好的方法来获取此信息吗?

我需要这些信息的原因是我希望尽可能少地丢失信息来重新应用过滤器,即用户不应该注意到它已经改变。我可能还需要,例如,将前10个过滤器更改为顶部(10 - X)过滤器等等。

我使用前10个过滤器作为示例,但是存在类似的问题,高于/低于平均值 - 返回>=X / <=Y

此外它根本不适用于图标过滤,但我不认为这对我来说是一个主要问题,因为它不太可能遇到它。

2 个答案:

答案 0 :(得分:0)

也许你需要重新思考。

&#34;我想运行一个程序来保存自动过滤器设置,执行操作,可能会编辑过滤器,然后重新应用它。&#34;

我认为您可以通过例如

来改变您对此问题的看法

我有一张应用了自动过滤器的表。 我想最终得到一个应用了相同自动调整程序的表,但可能会添加或删除一些过滤器。

我需要对表格进行操作以确定需要添加和删除哪些过滤器。 我可以删除或向表中添加行(我可以在不删除过滤器的情况下执行此操作)。

我甚至可以拿整张纸的副本,只从副本中删除过滤器,这样我就可以查看并计算出要完成的STUFF ......

如果我将过滤器留在原地,它可以解决我可能面临的一些问题。 (我仍然可以使用VBA中的基础数据范围)

另请注意:

使用本地窗口我设置了十个项目的过滤器,在本地窗口中给出了criteria1 =&#34;&gt; = 10&#34; 我编辑了数据。 然后,我使用了功能区?数据&gt;排序&过滤&gt;重复使用 在本地窗口中,它现在给了我criteria1 =&#34;&gt; = 5&#34;

所以,我认为REAPPLY对你很关键。

哈维

答案 1 :(得分:0)

我之前做过类似的事情。通过使用以下计算来确定上/下排名。

但它不是100%准确,(意味着如果数据保持不变,它将返回完全相同的记录)

因此,在保存自动过滤器设置之前,将提示输入框。 让用户键入正确的排名。

 'isTopBottomFilter is UDF function

 If isTopBottomFilter(iFilter) Then
        nRank = CInt(Application.WorksheetFunction.CountIfs(nRange, Filter.Criteria1))

        If Filter.Operator = xlTop10Percent Or Filter.Operator = xlBottom10Percent Then
            nRank = Application.WorksheetFunction.RoundUp((nRank * 100) / Application.WorksheetFunction.CountA(nRange), 0)
        End If
 End if

希望这有帮助!