【问题标题】:Filter a table for each row from another table从另一个表中过滤每一行的表
【发布时间】:2019-01-18 09:10:58
【问题描述】:

我需要做的是通过使用另一个表中每一行的第二列来过滤一个表。我循环的表包含 11 行,代码循环了 11 次,但每次都使用第 11 行。它需要做的是从第一行到最后一行。

I have used this as source

编辑:在 Variatus 的帮助下,我应用了 count 而不是 For Each。这似乎能够遍历所有行,除了最后一行。 待续。

Edit2:对于那些好奇的人,看看我的后续问题,我让一切正常工作! Filter a table with an array of criteria derived from another table

Sub LoopDoorAfdelingV4()

Dim myTable As ListObject
Dim myTable2 As ListObject
Dim oRow As ListRow
Dim c As Long


Dim myGroupIDFilter As Variant
Dim myGroupNameFilter As Variant

Set myTable = ActiveSheet.ListObjects("TabelGroupID")
Set myGroupIDFilter = myTable.ListColumns(1).Range
Set myGroupNameFilter = myTable.ListColumns(2).Range
Set myTable2 = ActiveSheet.ListObjects("TabelAfdelingenIntern")


For c = 1 To myTable.ListRows.Count

ActiveSheet.Range(myTable2).AutoFilter Field:=1, Criteria1:=myGroupNameFilter(c), _
 Operator:=xlOr
Next c

End Sub

【问题讨论】:

  • 我担心它确实应用了 11 个过滤器,一个接一个,但你只能看到最后一个,因为代码之前没有停止。您可能希望编程的是一个具有 11 个标准的过滤器。您可以在这里找到一些指导:stackoverflow.com/questions/28575754/…
  • 感谢您的回答。这可能是最后的手段,因为我以这种方式对其进行了编程,以便可以在不更改代码的情况下扩展 11 行的表。我需要这段代码来查看第一行,然后应用过滤器,然后转到下一行直到最后一行。

标签: excel vba foreach count autofilter


【解决方案1】:

考虑使用您希望能够处理的最大条件数设置过滤代码,像这样(这里仅演示了 3 个),

ActiveSheet.Range(myTable2).AutoFilter Field:=1, Criteria1:=myGroupNameFilter(1), _
Criteria2:=myGroupNameFilter(2),Criteria3:=myGroupNameFilter(3),Operator:=xlOr

myGroupNameFilter 的 UBound 设置为相同的最大数。使用循环读取条件来填充 myGroupNameFilter 数组。使用您知道要过滤的列表中不存在的随机值填充 myGroupNameFilter 的元素,这些随机值可能是“XYZ987”或-99999。过滤器应该返回指定的结果,因为那些不匹配的条件不会影响结果。

我讨厌发布此代码,因为它肯定行不通,而且我无法进行测试。它只是为了展示这个想法。

Dim Flt(1 To 15) As Variant

For i = 1 To 15
    If i > myTable.ListRows Then
        ' a value which doesn't exist in your Table2
        Flt(i) = "123XYZ"
    Else
        ' assign a value on which you intend to filter
        Flt(i) = myTable.ListRows(i).Cells(1).Value
    End If
Next

ActiveSheet.Range(myTable2).AutoFilter Field:=1, Criteria1:=Flt(1), _
                                                 Criteria2:=Flt(2), _
                                                 Criteria3:=Flt(3), _
                                                 Criteria4:=Flt(4), _
                                                 Criteria5:=Flt(5), _
                                                 Criteria6:=Flt(6), _
                                                 Criteria7:=Flt(7), _
                                                 Criteria8:=Flt(8), _
                                                 Criteria9:=Flt(9), _
                                                 Criteria10:=Flt(10), _
                                                 Criteria11:=Flt(11), _
                                                 Criteria12:=Flt(12), _
                                                 Criteria13:=Flt(13), _
                                                 Criteria14:=Flt(14), _
                                                 Criteria15:=Flt(15), _
                                        Operator:=xlOr

关键是不能在设置过滤条件的循环中设置过滤器。

【讨论】:

  • 你的评论给了我一个想法。在我符合标准的情况下,不可能做出类似以下的事情吗?ActiveSheet.Range(myTable2).AutoFilter Field:=1, Criteria1:=myGroupNameFilter(oRow + 1), _ Operator:=xlOr
  • 您需要为每个附加过滤器单独枚举 Criteria,这意味着您需要 Criteria1、Criteria2、Critera3 等。必须对数组 myGroupNameFilter 进行索引以匹配 Criteria 枚举。也许 myGroupNameFilter(CountA) = oRow.Range(1) 会起作用。我认为 For Each oRow 很不幸,因为您必须另外计算行数。对于 R = 1 到 ListRows.Count 可能会更好。然后你可以使用 myGroupNameFilter(R) = MyTable.ListRows(R).Cells(1).Value (语法未测试)。
  • 这段代码实际上有效,但似乎只计算到 10 而不是第 11 行,因此是最后一行。但我们正在到达那里! For c = 1 To myTable.ListRows.Count ActiveSheet.Range(myTable2).AutoFilter Field:=1, Criteria1:=myGroupNameFilter(c), _ Operator:=xlOr Next c
  • 当我添加一个虚拟行(不会给出结果)时,它会一直计数到我想要的行。因此它起作用了。感谢您的帮助!然而,我还没有完成。现在过滤的表提供了 2 到 5 个标准,我需要将其用作另一个表的过滤器。因此,我需要将标准列表应用于另一个表。有什么建议吗?
  • 不是乔,现在也不是。让我们先在这里解决您首先解决的问题,然后在另一个线程中解决其余问题 - 明天。 :-)
猜你喜欢
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2017-02-15
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多