Public Function MATCH_RANGE(values As Variant, ary As Variant, match_type As Integer)
Dim i As Integer
Dim elementCount As Integer
Dim result()
Dim value As Variant
Dim arySize As Integer
arySize = UBound(ary.Value2, 1)
Dim valueSize As Integer
valueSize = UBound(values.Value2, 1)
ReDim result(0 To arySize, 0 To 1)
elementCount = 0
For i = 1 To arySize
For j = 1 To valueSize
value = values(j, 1)
If (match_type = -1 And ary(i, 1) <= value) Or (match_type = 0 And ary(i, 1) = value) Or (match_type = 1 And ary(i, 1) >= value) Then
result(elementCount, 0) = i
elementCount = elementCount + 1
End If
Next j
Next i
For i = elementCount To arySize
result(i, 0) = -100000000
Next i
MATCH_RANGE = result
End Function
4条答案
按热度按时间b09cbbtk1#
[用CTRL + SHIFT + ENTER在单元格C9上输入一个数组公式,其中搜索的列是A9:A24,搜索词在B1:B4中],然后向下拖动以查找多个匹配项。
它首先使用数组公式来显示搜索列中匹配的任何搜索项的每个“命中”,然后使用Small函数参考当前单元格的行,它返回最早的命中,然后是第二次命中,然后是第三次命中,等等。
超过这个点,可以根据需要使用搜索数组的引用点(转换为索引函数的行位置等)。
EDIT在进一步查看此公式的结果时,它只为每个搜索词返回一次命中,即使该搜索词出现多次。为了解决这个问题,我首先使用公式:
这显示了在B1中找到的搜索词的匹配的每个命中。这里是我卡住的地方。我只能用公认的手册来弄清楚如何解决:
对于如何改进以允许多个术语的多个命中,有什么建议吗?
编辑-附加选项
好了,我已经确定了另一种拾取多个匹配的方法。这个方法依赖于考虑之前已经进行的匹配的位置。取决于你想要的结果向量的样子(OP从未指定),这样的结果是干净的,但公式相当混乱。
第一个单元格看起来像这样,在单元格H9中:=ADDRESS(MIN(IFERROR(MATCH($B$1:$B$4,$A$9:$A$24,0),””))+ROW($A$8),1)
这使用上面进一步指出的公式显示了与任何搜索项匹配的第一个单元格的地址。
下面的单元格(以及之后的每个单元格)都有这个(也是一个数组公式):
这将拾取在上面的行中找到的单元格的地址(添加1行以避免重新命中相同的术语),并且从该点到结束点的新搜索列(添加1行,以便它正确地停止在最后的结束命中处),它重新搜索任何术语。
这一个又是,不是那么干净[是的,我知道有一些改进,我可以决定什么搜索应该-无论是使用文本操作功能,甚至做一个相对的名称引用,随着你向下移动列的变化],但它是自动的,我会说,比VBA模块更干净。特别是,取决于你想要你的结果向量是什么,这可以简单得多。
c8ib6hqw2#
在@Grade'Eh'Bacon发布的公式上工作\开发,最终使用这个公式来检索匹配函数的所有结果,其中有几个匹配项。
假设输入范围为
B2:B17
,要匹配的项目的范围为F3:F5
,在H3
中输入此FormulaArray
FormulaArray
,返回多个项目的所有匹配项 *所有的优点都归功于培根在这个问题上的伟大工作。
oxiaedzo3#
我必须自己弄清楚这一点,因为我找不到提供它的在线资源,但是是的:MATCH可以通过以下方式返回多个匹配的数组:
wgx48brx4#
使用内置的MATCH是不可能的,但是,使用VBA宏可以实现:
这个函数既返回多个匹配项,又允许你传递一个你想要匹配的多个值的范围。我发现这个函数很有用很多次了。欢迎反馈来帮助改进这个。
注意:您必须使用数组公式(CRTL-SHIFT-ENTER)将此公式分布在几个单元格中,以便查看多个匹配项。