【问题标题】:Index-Match with Multiple Criteria in Different Workbooks Using Variables使用变量在不同工作簿中与多个标准进行索引匹配
【发布时间】:2015-03-01 06:48:49
【问题描述】:

我正在尝试使用从一个名为“Mapping File.xlsx”的工作簿中获取的变量作为另一个名为“Extract.xlsx”的工作簿中的 INDEX/MATCH 搜索的条件(两者都是 Sheet1)。最重要的是,我需要在 A 列中搜索 PartNumber(字符串),在 B 列中搜索 GroupCounter(字符串),在 C 列中搜索 OperationNumb(字符串),并返回 G 列中找到的值作为 ReturnValue(字符串)。

设置我的变量:

Dim PartNumber, GroupCounter, OperationNumb, ReturnValue As String 'Inputs are strings that are actually pulled from first workbook
PartNumber = Workbooks("Mapping File.xlsx").Worksheets("Sheet1").Cells(2, 1)
GroupCounter = Workbooks("Mapping File.xlsx").Worksheets("Sheet1").Cells(2, 2)
OperationNumb = Workbooks("Mapping File.xlsx").Worksheets("Sheet1").Cells(5, 1)

尝试使用我的变量使用 INDEX/MATCHING 搜索不同的工作簿:

尝试 1

str = "=INDEX(G:G, MATCH(1, (PartNumber=A:A)*(GroupCounter=B:B)*(OperationNumb=D:D),0))"
ReturnValue = Workbooks("Extract.xlsx").Worksheets("Sheet1").Evaluate(str)

尝试 2

str = "=INDEX(G:G, MATCH(PartNumber & GroupCounter & OperationNumb, Workbooks("Extract.xlsx").Worksheets("Sheet1").Range("A:A") & Workbooks("Extract.xlsx").Worksheets("Sheet1").Range("B:B") & Workbooks("Extract.xlsx").Worksheets("Sheet1").Range("C:C")),0))"
ReturnValue = Workbooks("Extract.xlsx").Worksheets("Sheet1").Evaluate(str)  

尝试 3 - 30 次

我已尝试声明范围并为 MATCH_array 中的范围使用变量名称。我搞砸了声明工作簿和工作表。我尝试过使用 SUMPRODUCT。我曾尝试多次更改我的变量类型。我弄乱了引号并将字符串分开。我尝试将 INDEX 和 MATCH 函数分开。我现在在谷歌搜索上花了大约 6 个小时来查看那里有什么,调整我的代码并重新测试,所以现在我正在寻找如何做到这一点。如果我可以避免它,我不想将工作簿或工作表硬编码到 INDEX/MATCHING 函数中,因为我将在较大的代码中使用此功能的次数。因此,我正在寻找一种方法从 3 个不同单元格中的一张表中提取 3 个条件,将它们存储为字符串,然后使用这三个字符串搜索第二个工作簿以找到它出现的行,并使用该行将不同列中的值作为字符串返回(所有这些都使用尽可能多的变量名以避免大量硬编码)。有什么建议/想法吗?

【问题讨论】:

  • 前两个中的一个问题是 Evaluate 是非常字面的,所以它在公式中包含了“PartNumber”这个词。 (看起来你可能试图在 3 到 30 天内解决这个问题)。

标签: excel vba indexing criteria matching


【解决方案1】:

使用自动过滤器怎么样? 如果始终只有一条记录匹配(或没有)所选条件,则 G 列中请求的单元格应始终位于同一行中(在过滤掉所有其他行之后)。 代码并不优雅,但也许它会给出一些想法。它将符合条件的行复制到单独的工作表中,并显示符合这些条件的第一行的内容。

Sub Makro2()
    Application.DisplayAlerts = False
    On Error Resume Next
    ThisWorkbook.Sheets("Results").Delete
    ThisWorkbook.Sheets.Add.Name = "Results"
    Application.DisplayAlerts = True
    Sheets("Arkusz1").Select
    Cells.Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="a" ` use PartNumber inestead of "a"
    Selection.AutoFilter Field:=2, Criteria1:="b" `use GroupCounter instead of "b"
    Selection.AutoFilter Field:=3, Criteria1:="c" ` use OperationNum instead of "c"
    Selection.SpecialCells(xlCellTypeVisible).Copy
    Sheets("Results").Paste
    Var = Sheets("Arkusz1").Range("G4")
    MsgBox Var
    Sheets("Arkusz1").Activate
    Cells.Select
    Selection.AutoFilter
End Sub

另一种选择是使用函数 CONCATENATE 将这 3 个条件连接起来,并将它们组成一个字符串,然后使用 VLOOKUP 函数。在另一列中输入:=CONCATENATE(带有 PartNumber 的单元格,带有 GroupCounter 的单元格,带有 OpetationNum 的单元格),然后像这样使用 Vlookup =VLOOKUP(带有 cruteria1 的单元格& 带有标准 2 的单元格& 带有标准 3 的单元格;搜索区域;G 列相对地址编号; 0)

    B   C   D   E   F   G   H
3   a   e   m   `=CONCATENATE(A1;B1;C1)         1
4   a   f   n   afn         2
5   b   g   o   bgo         3
6   b   h   p   bhp         4
7   c   i   q   ciq         5
8   c   j   r   cjr         6
9   d   k   s   dks         7
10  d   l   t   dlt         8
11                          
12                          
13  c   j   r   `=VLOOKUP(A11&B11&C11;$D$1:$G$8;4;0)        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2015-08-07
    • 2020-04-24
    • 2022-11-03
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多