【问题标题】:VBA Filtering more than 2 CriteriaVBA过滤超过2个标准
【发布时间】:2019-01-07 18:33:31
【问题描述】:

我正在寻找一个简单的解决方案来解决我遇到的过滤问题。我正在尝试过滤掉字段 9 中的以下字母组合:RBRCRG。 我已经尝试了几种方法来做到这一点。我尝试的第一种方法是:

  Set Bigpic = Workbooks.Open("S:\NFInventory\groups\CID\CID Database\BigPic Files\BigPic 2018.xlsx", , , , , , , , True)
     lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
     Rows("1:1").Select
     Selection.AutoFilter
     ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Criteria1:="<>RB", Operator:=xlAnd, Criteria2:="<>RC", Operator:=xlAnd, Criteria3:="<>RG"

这失败了,所以我尝试使用 array 但这似乎也失败了。它返回时只有 RG 被过滤,而其他人则保留。任何朝着正确方向的推动都会有所帮助。

 Set Bigpic = Workbooks.Open("S:\NFInventory\groups\CID\CID Database\BigPic 
 Files\BigPic 2018.xlsx", , , , , , , , True)
     lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
     Rows("1:1").Select
     Selection.AutoFilter
     ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, 
 Criteria1:=Array("<>RB", "<>RC", "<>RG")

【问题讨论】:

  • 您不能使用超过 2 个不等于。从不相等的值中构建一个字典或数组列表,并将其用作数组过滤器。
  • 我很害怕……那时很难。 :(

标签: excel vba filter


【解决方案1】:

您不能使用超过 2 个不等于。从不相等的值中构建一个字典或数组列表,并将其用作带有 xlfiltervalues 的数组过滤器。

dim i as long, lr as long, arr as object

set arr = createobject("scripting.dictionary")

with ActiveSheet

     lr = .Cells(Rows.Count, 1).End(xlUp).Row

     for i=2 to lr
         select case ucase(.cells(i, "I").value2)
             case "RB", "RC", "RG"
                 'do nothing
             case else
                 arr.item(.cells(i, "I").value2) = vbnullstring
         end select
     next i

     .Range("A1:CU" & lr).AutoFilter Field:=9, criteria1:=arr.keys, operator:=xlfiltervalues

end with

【讨论】:

    【解决方案2】:

    如果在工作表中包含标准不是问题(可以隐藏)

    在代码中,您可以将条件放在隐藏表中

    Range("C1:D9").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Sheets("Sheet2").Range("G1:I2"), Unique:=False      
    

    【讨论】:

      【解决方案3】:

      我通过颜色过滤手动排除了超过 2 个条件。如果您的表格没有定义填充,则此代码将起作用。

      ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Criteria1:=Array("RB", _
          "RC", "RG"), Operator:=xlFilterValues
      ActiveSheet.Range("A1:CU" & lrow).SpecialCells(xlCellTypeVisible).Interior.Color = 1 
      ' 1 is a black fill, change to your preference
      ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Operator:= _
          xlFilterNoFill
      'ActiveSheet.Range("A1:CU" & lrow).Autofilter Field:=9 
      'this code will unfilter the range, can be used for testing to confirm everything you  _ 
      expected to filter was filtered
      

      【讨论】:

        【解决方案4】:

        您不能只创建一个过滤器列并在其中放入一个 if 语句吗?比如:

        =IFERROR(FIND("RB",UPPER(C9)),0)+IFERROR(FIND("RC",UPPER(C9)),0)+IFERROR(FIND("RG",UPPER(C9)),0)
        

        然后过滤该列 = 0 以排除所有 RB、RC、RGs

        【讨论】:

          猜你喜欢
          • 2014-09-05
          • 1970-01-01
          • 1970-01-01
          • 2015-07-29
          • 1970-01-01
          • 2013-12-22
          • 2016-08-07
          • 2013-11-19
          • 2014-06-27
          相关资源
          最近更新 更多