【问题标题】:filter entire data in single column by unselecting multiple values通过取消选择多个值来过滤单个列中的整个数据
【发布时间】:2020-03-17 09:30:33
【问题描述】:

我是 excel VBA 编码的新手。尝试通过在 SR 变量中选择范围来过滤整个数据,但在 SR 变量处出现错误(运行时错误 424)

也有人可以提供进一步的编码。我需要通过在 D 列中保留值(“ABC”、“DEF”)来过滤掉 SR 变量的整个数据,并删除(CTRL 减号)具有多个值的其余行,而不是我提到的。

这里是起始代码:

With ActiveSheet
            Dim SR As Range
            LR = Range("A" & Rows.Count).End(xlUp).Row
            Set SR = Range("A1:AP" & LR)
            SR.Select.AutoFilter

End With

【问题讨论】:

  • 嗨,欢迎来到 SO。我们不是代码编写服务。您必须尝试并向我们提供您的代码。然后,我们可以帮助解决您对代码的任何问题。另外,哪一行会引发错误?您设置 SR 的位置或设置过滤器的位置.. 我怀疑是后者
  • SR.Select.AutoFilter 看起来语法错误。如果您已指定范围 (SR),则不需要 select,即 SR.Autofilter
  • @Cyril.. 是否需要Select :)。尽管前几天我确实遇到了一个场景(这里是一个问题),但实际上需要它..我知道的有多少!

标签: excel vba filtering


【解决方案1】:

为了使你的代码可以工作,你必须使用这个:

With ActiveSheet
    Dim SR As Range, LR As Long ', visCells As Range, i As Long
    LR = .Range("A" & Rows.Count).End(xlUp).Row
    Set SR = .Range("A1:AP" & LR)
    SR.AutoFilter field:=4, Criteria1:="ABC", Operator:=xlOr, Criteria2:="DEF", VisibleDropDown:=False
End With

这将根据您提到的标准过滤您的范围区域。 我认为了解这一点并找到一种方法来删除在互联网上查看的不必要的行并将不符合预期的内容带到这里是很好的(对你来说)。就像前面提到的一位论坛同事,我们不是代码编写服务... 为了做你解释的需要,我会给你一些提示: 如果您希望使用过滤器完成任务,请确定。您必须创建另一个 Range 变量来保留可见单元格,然后在初始 SR 行之间迭代并删除不在 visibleCells 范围内的那些。 我想提一下,不需要事先过滤范围即可进行此操作。在行之间迭代(从最后一行到第一行)并根据您的标准在 D:D 列中删除不匹配的行就足够了。

编辑: 我有些懊悔,我喜欢你的评论...... 所以,请接收一段可行的代码,做你想做的事:

Dim SR As Range, LR As Long
With ActiveSheet
    LR = .Range("A" & Rows.Count).End(xlUp).Row
    Set SR = .Range("A1:AP" & LR)
    SR.AutoFilter field:=4, Criteria1:="<>ABC", Operator:=xlAnd, Criteria2:="<>DEF", VisibleDropDown:=False
    Application.DisplayAlerts = False
      SR.SpecialCells(xlCellTypeVisible).Delete
    Application.DisplayAlerts = True
End With

为了更好地使用 VisibleCells 方法,我在另一侧进行了过滤。让所有其他行可见。如果你不使用

Application.DisplayAlerts = False
    '.........
Application.DisplayAlerts = True

会出现询问所有行删除的消息...

编辑: 下一个代码将删除与超过两个条件的过滤不匹配的行。 只有当您的过滤区域从第一行开始时,它才能正常工作。如果不是,则必须进行更正,添加第一行和过滤区域第一行的差异:

Dim SR As Range, LR As Long, R As Long
    With ActiveSheet
        LR = .Range("A" & Rows.Count).End(xlUp).Row
        Set SR = .Range("A1:AP" & LR)
        SR.AutoFilter field:=4, Criteria1:=Array("ABC", "DEF", "AAA"), Operator:=xlFilterValues
        For R = SR.Rows.Count To 1 Step -1
            If .Rows(R).Hidden Then .Rows(R).Delete
        Next R
    End With

在这个例子中,它显然是第一个 (range("A1:...),但它可以是工作表中的任何范围...

【讨论】:

  • 我认为你的解释大部分是正确的。我唯一要补充的是:使用ActiveSheet 充满危险。我建议对工作表使用早期或晚期绑定,并参考您要使用的特定工作表
  • @Zac:我同意。我也不会使用这种方法。我只是试图将他的代码转换为可行的东西。事实上,根据我对他需求的理解,我会以不同的方式来做……过滤代码,让我们说,是一种只为他而设的说教方法,以便学习一些东西。找到一个不了解它的工作原理和作用的代码并不是最合适的学习方式,我认为......
  • 谢谢各位。是的,我明白要求完整的代码不是合适的方式。今后,我会记下这些反馈。
  • @SRKAN:我编辑了我的答案并发布了一个解决方案。未针对工作表对象绑定进行优化,这仍然是您的任务... :-)
  • @FaneDuru 当我添加 Criteria3、Criteria4 等时。它给我一个错误“找不到名为参数的编译错误。我不能添加多个值来过滤掉吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多