VBA数组筛选函数的问题:只返回第一个结果

3

我在使用VBA的“Filter”功能时遇到了一些问题。我正在尝试使用多个后续过滤器,逐步减少数组中包含我需要的值的数量。然而,似乎只返回与“Match”值匹配的第一个元素,而不是后续的元素?

举个例子,运行下面的代码时,第二个“调试调用”返回“1”,但应该返回“2”。

Function FilterAnArray()

Dim names As Variant
names = Array("Ann Smith", "Barry Jones", "John Smith", "Stephen Brown", "Wilfred Cross")
Debug.Print UBound(names)

Dim smithNames As Variant
smithNames = Filter(names, "Smith")
Debug.Print UBound(smithNames)

End Function

版本信息等。

我正在运行Excel 2016,版本号为16.0.8730.2046 - 64位。非常感谢您对此问题的帮助!

3个回答

3

它运行得相当不错。它返回1,因为您有两个史密斯:

enter image description here

smithNames的上限为1,因为它是基于0的数组。如果你想要数组元素的数量,并且不喜欢UBound+1,你可以使用一个工作表函数:

Debug.Print WorksheetFunction.CountA(smithNames)


强烈不建议的选项:

你可以考虑在模块顶部写上Option Base 1。然后数组将是基于1的,与你的期望相同。在你的示例中,你可以看到为什么Option Base 1不可取。如果你使用它,Names将是基于1的,而smithNames将是基于0的。这是因为数组分配的不同方式。

enter image description here enter image description here


你为什么认为使用Option Base 1是“强烈不建议”的呢?在我看来,有三种类型的数组。1)总是以0为基础的数组,如split;2)总是以1为基础的数组,如从范围中获取的数组;3)设置基础的数组,可以通过3a)隐式地使用Option Base或3b)显式地使用Dim Dmy(3到7)来实现。所以最好的设置取决于你的情况。我喜欢Option Base 1。只是我的个人意见;-) - Jochen
我遇到的唯一真正的问题是,如果您重用代码并且有一个模块选项为1,而另一个模块则没有。因此,对于明确设置边界来说,最好加上+1。 - Jochen
@Jochen - 如果你使用了 Option Base 1 并且你要分享你的代码给别人,那么准备好会有很多麻烦。 - Vityata
如果我分享我的代码,我会选择使用选项基础1和选项显式;-) - Jochen
@Jochen - Option Explicit 是可以的,但是 Option Base 1 可能会引起问题。不过这是另一个话题了。 - Vityata

2

Ubound给出了数组的上限。由于您使用基于0的数组,因此对于5个条目,您将得到4的结果,而对于2个条目,您将得到1的结果。

如果您想使用基于1的数组而不必显式地为每个数组定义维数,请在模块开头使用Option Base 1


好的,没错。实际上这也是我试图修复的更广泛脚本中的错误。抱歉,这真的不是一个很聪明的问题。不过你们确实帮了我大忙! - Tomas Turner-Zwinkels

0
你可以尝试先检查应该得到多少结果,然后再打印输出,例如:
Sub foo()
Dim val As Variant
Dim names As Variant
Dim post As Variant
names = Array("Ann Smith", "Barry Jones", "John Smith", "Stephen Brown", "Wilfred Cross")
Debug.Print UBound(names)

Dim smithNames As Variant
smithNames = Filter(names, "Smith")

pos = Application.Match(smithNames, names, False) 'find how many values match "Smith"

If Not IsError(pos) Then
    For x = LBound(pos) To UBound(pos)
        Debug.Print pos(x)
    Next x
Else
   MsgBox val & " not found!"
End If
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接