【问题标题】:Excel VBA - filtering using an array, spaces and commasExcel VBA - 使用数组、空格和逗号进行过滤
【发布时间】:2015-05-11 02:05:02
【问题描述】:

我在 Excel VBA 中遇到自动筛选问题。我需要过滤包含文本的单元格列以显示“IT”的实例,但不显示包含字母“it”的单词 - 即我想过滤包含“Commercial, IT”但不包含“Commercial, Committee”的单元格。

我根据这个问题使用了一个数组:Use autofilter on more than 2 criteria

当我使用此代码时它可以工作:

Worksheets("AssembledData").Range("A1").AutoFilter _
    field:=NewTeamCol, _
    Criteria1:=Array("IT", "IT, *"), _
    Operator:=xlFilterValues

但是,如果我在数组中添加第三个选项以捕获 IT 位于字符串 Criteria1:=Array("IT", "IT, *", "* IT"), _ 末尾的单元格,我得到的结果与刚刚获得 Criteria1:=Array("IT"), _ 时的结果相同

我做错了什么?新来的,VBA 的新手 - 尽我所能搜索而不是询问这个项目,但现在难住了!提前致谢。

【问题讨论】:

  • 您不能在带有xlFilterValues 的大量过滤条件中使用通配符。如果这样做,则仅考虑数组中的前两个条件;就像您使用 Criteria1Criteria2Operator:=xlAnd 一样。唯一的选择是遍历单元格并将您自己的标准数组构建到一个数组中,然后将其提交到.AutoFilter 命令中。
  • 感谢@Jeeped - 这与我所看到的相符。猜猜我必须正确地构建一个数组(或者用行可见性来阻止它......)。

标签: arrays vba excel


【解决方案1】:

你总是可以“手动过滤”:

Sub qwerty()
    Dim N As Long, i As Long, v As String
    Dim r As Range
    N = Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To N
        Set r = Cells(i, "A")
        v = r.Text
        If Right(v, 3) = " IT" Or Left(v, 4) = "IT, " Or v = "IT" Then
            r.EntireRow.Hidden = False
        Else
            r.EntireRow.Hidden = True
        End If
    Next i
End Sub

【讨论】:

  • 谢谢!它有效,我喜欢“手工”代码。将leftright 位交换为If InStr(1, v, " IT", vbTextCompare) <> 0 Or InStr(1, v, "IT, ", vbTextCompare) <> 0 Or InStr(1, v, "IT ", vbTextCompare) <> 0 Or v = "IT" Then,以确保“IT”的所有可能组合都被选中。
【解决方案2】:

尝试省略Operator:=xlFilterValues

由于您将通配符与 xlFilterValues 一起使用,Excel 似乎会逐字比较 ITIT, ** IT,而不是使用通配符 *

以这个数据集为例:

   Name
1  john
2  nathjohn
3  test
4  abletest
5  testing
6  Commercial, IT
7  Commercial, Committee
8  IT, *

使用:

ActiveSheet.Range("$A$1:$A$15").AutoFilter _
        Field:=1, _
        Criteria1:=Array("IT", "IT, *", "* IT")

导致Commercial, IT,因为除了没有选择IT, * 之外,标准的通配符被正确使用。由于这种值不是您的直接问题,因此我们现在将方便地跳过这种极端情况。

使用:

ActiveSheet.Range("$A$1:$A$15").AutoFilter _
    Field:=1, _
    Criteria1:=Array("IT", "IT, *", "* IT"), _
    Operator:=xlFilterValues

导致IT, *,因为 xlFilterValues 使用的是 IT, * 的文字值。

试一试,看看情况如何。

【讨论】:

  • 谢谢。在没有Operator:=xlFilterValues 的情况下尝试过,但没有匹配到 - 想知道我是否没有正确应用您的解决方案?但是@Jeeped 关于通配符的评论表明这可能是不可能的。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多