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

VBA数组筛选器函数问题:仅返回第一个结果,vba,excel,Vba,Excel,我在使用VBA的“过滤器”功能时遇到了一些问题。我试图使用多个后续过滤器逐步减少数组,以包含我需要的值。但是,似乎只返回与“Match”值匹配的第一个元素,而不返回后续元素 举个例子,当运行下面的代码时,第二个“调试调用”返回“1”,但它应该返回“2” Function FilterAnArray() Dim names As Variant names = Array("Ann Smith", "Barry Jones", "John Smith", "Stephen Brown", "Wi

我在使用VBA的“过滤器”功能时遇到了一些问题。我试图使用多个后续过滤器逐步减少数组,以包含我需要的值。但是,似乎只返回与“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
版本信息e.t.c.

我正在运行Excel 2016,版本16.0.8730.2046-64位。
在此问题上的任何帮助都将不胜感激

它工作得很好。它返回1,因为您有两个Smith:

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

Debug.Print工作表function.CountA(smithNames)


强烈不建议的选项:

你可以考虑在模块的顶部写“代码>选项库1 < /代码>。然后阵列将是基于1的,并且将是您期望的方式。在您的示例中,您可以看到为什么

选项Base 1
不可取。如果您拥有它,
名称
将基于
1
smithNames
将基于
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

Ubound给出了upfer界。使用基于0的数组时,5个条目的结果为4,2个条目的结果为1


如果要使用基于1的数组而不显式标注每个数组,请在模块开头使用
选项Base 1

确定,是。事实上,这也是我试图修复的更广泛脚本中的错误。对不起,这真的不是一个很聪明的问题。你们真的帮了我的忙!为什么你认为“长期”不建议使用选项1?我认为有3种数组。1) 始终以0为基础的数组,如拆分数组2)始终以1为基础的数组,如范围中的数组,以及3)使用选项base隐式设置3a)或使用dim dmy(3到7)显式设置3b)的数组,它们的基数是多少。所以这取决于你的情况什么是最好的设置。我喜欢选项1。就我的2美分;-)我遇到的唯一真正的问题是,如果重用代码,并且有一个带有选项base 1的模块和一个没有选项base 1的模块。So+1 for:最好是显式设置边界。@Jochen-如果您使用
Option Base 1
并将代码共享给其他人,请准备好迎接许多麻烦。如果我共享代码,我将与Option Base 1和Option explicit共享;-)@Jochen-
选项Explicit
很好,但是
选项Base 1
可能会给您带来问题。但这是另一个主题。