【问题标题】:Index match across multiple columns跨多个列的索引匹配
【发布时间】:2021-06-13 00:24:06
【问题描述】:

我正在尝试与 B 列(日期)中查找的索引进行索引匹配,匹配是从单独的工作表中查找工作订单号(例如示例 1、示例 2)并匹配显示的选项卡屏幕下面。

Here is a copy of the table range I am trying to gather a match from

在我看来,它看起来像 =INDEX(B:B,MATCH("A1",E2:BP200,0)),但它不会遍历所有范围来找到匹配项。

我有一个在技术上有效的公式,它是 "=@IFNA(IFS(ISNUMBER(MATCH([@Batch],'Production Plan'!E:E,0)),INDEX('Production Plan'!B: B,MATCH([@Batch],'Production Plan'!E:E,0))"...对每一列重复。但是这使得计算速度非常慢。

任何帮助将不胜感激。

【问题讨论】:

  • 一种解决方案是使用“range.find”在 VBA 中创建一个函数,其中“range”是您的 E:BP 区域。
  • 我在玩具示例中尝试过的另一件奇怪的事情是:=MIN(IF(MMULT(IF($B$2:$N$14=5,1,0),{1;1 ;1;1;1;1;1;1;1;1;1;1;1})>0,ROW($B$2:$B$14),999999999)),然后使用 ctrl+enter 来制作一个数组公式。我不确定它是否总是有效或速度有多快。您必须将“$B$2:$N$14”替换为 E:BP,将“=5”替换为“=(您正在寻找的东西)”,将 {1;...1} 替换为n 个向量,其中 n 是 E:BP 中的列数。

标签: excel indexing match


【解决方案1】:

一种解决方案是使用“range.find”创建一个 VBA 函数,其中“range”是您的 E:BP 区域。

因此,您可以创建下面的函数,将找到第一个匹配项的行号返回到您的订单号。该函数的编写方式将返回整个工作表中的行号(例如,如果您查找“示例 1”,它应该告诉您“5”)。如果出现错误或找不到您的搜索词,它还设置为返回 -1,因此您可能需要更好地处理错误。

所以我建议在这里使用 INDEX(B:B,rowmatch_exact("A1",E1:BP200,"columns")) 或 INDEX(B:B,rowmatch_exact("A1",E1:BP200,"rows "))。

Function rowmatch_exact(sought As Variant, range As range, searchdirection As String) As Integer

On Error GoTo ErrorDone

If searchdirection = "columns" Then
    rowmatch_exact = range.Find(what:=sought, searchorder:=xlByColumns, LookIn:=xlValues, lookat:=xlWhole).Row
ElseIf searchdirection = "rows" Then
    rowmatch_exact = range.Find(what:=sought, searchorder:=xlByRows, LookIn:=xlValues, lookat:=xlWhole).Row
Else
    GoTo ErrorDone
End If

GoTo Done:
ErrorDone:
rowmatch_exact = -1
Done:

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 2018-03-31
    • 2019-02-06
    • 2020-08-30
    • 2012-04-29
    • 1970-01-01
    • 2020-04-24
    • 2020-02-12
    相关资源
    最近更新 更多