【问题标题】:Excel VBA: saving autofilter settings, with exact valuesExcel VBA:使用精确值保存自动过滤器设置
【发布时间】:2015-10-29 13:15:36
【问题描述】:

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

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

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

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

我可以实现一个很长的过程,从这个开始,计算出 50 的排名,然后推断这是一个前 10 个过滤器(而不是前 5 个),因为我知道它是一个顶部来自操作员的 X 过滤器,但有没有更好的方法来获取此信息?

我需要此信息的原因是我想重新应用过滤器,同时尽可能减少信息丢失,即用户不应该注意到它已更改。例如,我可能还需要将前 10 个过滤器更改为前 (10 - X) 个过滤器等。

我使用了前 10 个过滤器作为示例,但存在高于/低于平均水平的类似问题 - 返回 &gt;=X/&lt;=Y

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

【问题讨论】:

    标签: vba excel autofilter


    【解决方案1】:

    也许你需要重新考虑。

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

    我认为你可以通过例如改变你对这个问题的看法

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

    我需要对表格进行一些处理以确定需要添加和删除哪些过滤器。 我可以在表格中删除或添加行(我可以在不删除过滤器的情况下这样做)。

    我什至可以复制整张表格并仅从副本中删除过滤器,以便我可以查看和计算要完成的内容...

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

    另请注意:

    使用本地窗口,我设置了前十项的过滤器,在本地窗口中为我提供了条件 1 = ">=10" 我编辑了数据。 然后我使用功能区?数据>排序和过滤>重新应用 在本地窗口中,它现在给了我标准 1 = ">=5"

    所以,我认为重新申请将是您的关键。

    哈维

    【讨论】:

      【解决方案2】:

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

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

      因此,在保存Autofilter设置之前,会提示一个输入框。 让用户输入正确的排名。

       '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
      

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 2018-01-02
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多