Table of contents
当我们有大量的数据时,有时很难从数据集中提取任何特定的数据。 加上Excel的 索引 和 匹配 函数可以检索任何类型的数据,即使是在一个巨大的数据集中。 实施 VBA 是在Excel中运行任何操作的最有效、最快速、最安全的方法。 在这篇文章中,我们将向你展示3种不同的方法,即如何执行 基于多个标准的索引匹配 在Excel中用 VBA宏 .
下载工作手册
你可以从这里下载免费的练习Excel工作簿。
基于多个标准的VBA索引匹配.xlsm在Excel中使用VBA基于多个标准的INDEX MATCH的3种方法
在以下章节中,我们将向你展示如何执行 基于一个范围的多个标准的索引匹配 , 为特定的选择 和 为一个表 在Excel中用 VBA .
上面我们有本文将遵循的数据集。 我们有 学生姓名 , 学生证。 和 考试分数 我们将根据其他两列的条件,提取驻留在一列中的某个结果。
标准--1:在Excel中嵌入VBA与INDEX MATCH进行多维(二维)查询
请看下面的图片,我们存储了一个特定学生的名字" 边缘" 在 细胞G4 ;而我们要搜索的列是 结果 在。 考试分数 ,被储存在 细胞G5 我们将在 考试分数 列并存储 符号 那" 边缘" 进去了 细胞G6 .
查询步骤的结果是 二维数组 与 索引 和 匹配 在Excel中用 VBA 下文给出了答案。
步骤。
- 在开始时,按 Alt + F11 在你的键盘上,或进入标签 开发人员 -> Visual Basic 打开 Visual Basic编辑器 .
- 接下来,在弹出的代码窗口中,从菜单栏中,点击 插入-> 模块 .
- 然后。 拷贝 以下代码和 粘贴 它进入代码窗口。
Sub IndexMatchStudent() Dim iSheet As Worksheet Set iSheet = Worksheets("Two Dimension") iSheet.Range("G6").Value = Application.WorksheetFunction.Index(iSheet.Range("C5:D14"), Application.WorksheetFunction.Match(iSheet.Range("G4"), iSheet.Range("B5:B14"), 0), Application.WorksheetFunction.Match(iSheet.Range("G5"), iSheet.Range("C4:D4"), 0) ) End Sub
你的代码现在可以运行了。
- 现在,按 F5 在你的键盘上选择"",或从菜单栏中选择 运行-> 运行Sub/UserForm 你也可以直接点击 小的运行图标 子菜单栏中的 "运行宏"。
代码执行后,请看下面的gif图,看看结果。
因此, 符号 那" 边缘" 在考试中得到了。 67 检索到的是 细胞G7 .
VBA代码解释
Dim iSheet As Worksheet
定义工作表的变量。
设置 iSheet = Worksheets("二维")
存储工作表的名称,我们的工作表的名称是 "二维",你应该根据你的电子表格提供相应的名称。
iSheet.Range("G6").Value = Application.WorksheetFunction.Index(iSheet.Range("C5:D14"), Application.WorksheetFunction.Match(iSheet.Range("G4"), iSheet.Range("B5:B14"), 0), Application.WorksheetFunction.Match(iSheet.Range("G5"), iSheet.Range("C4:D4", 0) )
这段代码选择的范围是 C5:D14 作为查询范围。 然后搜索存储在单元格中的匹配信息 G4 在范围内 B5:B14 并搜索存储在单元格中的匹配信息 G5 在范围内 C4:D4 并将结果传递给单元格 G6 .
阅读更多。 如何使用INDEX MATCH的多个日期范围的标准
标准 - 2:应用宏程序通过用户定义函数(UDF)的INDEX查找MATCH值。
你可以从一个数据集中提取匹配的值,用 用户定义的函数(UDF) 从下面的图片中,我们要做的是,我们将通过 学生证 和 考试分数 的某位学生,该函数将向我们抛出一个 命名 该特定学生的。
让我们看看如何实现这一目标 学生姓名 "Finn" 与 VBA .
步骤。
- 正如之前所显示的,打开 Visual Basic编辑器 从 开发商 选项卡和 插入 a 模块 在代码窗口中。
- 然后,在代码窗口。 拷贝 以下代码和 粘贴 它。
Function MatchByIndex(x As Double, y As Double) Const StartRow = 4 Dim EndRow As Long Dim iRow As Long With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious) .Row For iRow = StartRow To EndRow If .Range("C" & iRow) .Value = x And .Range("D" & iRow) .Value = y thenMatchByIndex = .Range("B" & iRow).Value Exit Function End If Next iRow End With MatchByIndex = "Data Not found" End Function
- 别跑 这个代码。 拯救 它。
- 现在。 返回到工作表 的兴趣。 挑选任何单元格 在我们的例子中,它是 细胞F5 .
- 在那个牢房里。 撰写 UDF 你刚刚在代码中创建的( 匹配指数(MatchByIndex )和 通过学生证和考试分数 函数的括号内的特定学生的名字。
由于我们正试图提取""这个名字 芬恩" 从他的 身份证 (105) 和 马克思 (84) 因此,对于我们的情况,该公式变成了。
=MatchByIndex(105,84)
- 然后,按 进入 .
请看下面的图片。
在 细胞F5 ,我们已经成功地检索到了""的名称。 芬恩" 通过简单地通过他的 身份证 和 符号 中创建的函数内,我们在 VBA 代码。
VBA代码解释
函数MatchByIndex(x As Double, y As Double)
创建一个新的函数并在其中传递变量。 你可以给函数定义任何名称。
Const StartRow = 4
我们的行从第4行开始。 你必须提供你的数据集的行号。
Dim EndRow As Long Dim iRow As Long
定义变量。
With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious) .Row
首先,定义要使用的工作表,我们工作表的名称是 "UDF",你应该根据你的电子表格提供相应的名称。 然后开始在范围内搜索 C:D 从我们定义的第一行到最后一行。
For iRow = StartRow To EndRow If .Range("C" & iRow).Value = x and .Range("D" & iRow).Value = y Then MatchByIndex = .Range("B" & iRow) .Value Exit Function End If Next iRow End With
开始从第一行到最后一行的迭代。 如果我们将在函数中传递的第一个值是在 C 列,如果我们将在函数中传递的第二个值属于 D 列,那么它将返回来自 B 否则,退出该函数,结束所有语句,并转到下一行。
MatchByIndex = "未找到数据" End Function
如果在执行过程中没有满足前面的条件,那么将返回 "没有找到数据 "的信息,代码将离开该函数。
阅读更多。 Excel中部分文本的多条件INDEX-MATCH(2种方法)
标准--3:在Excel中实施VBA,从有多个数据的表中返回MATCH值
在本节中,我们将学习如何 通过MsgBox中的表的索引返回一个匹配的值。 在 VBA 丞相。
让我们看看如何提取 符号 从我们的数据集中显示的表格( T 产品名称:TableMatch )的某位学生,提供 命名 和 身份证 在我们的例子中, 命名 和 身份证 将是 芬兰人 和 105 分别是。
步骤。
- 首先,打开 Visual Basic编辑器 从 开发商 选项卡和 插入 a 模块 在代码窗口中。
- 然后。 拷贝 以下代码和 粘贴 它进入代码窗口。
Sub ReturnMatchedResultByIndex() Dim iBook As Workbook Dim iSheet As Worksheet Dim iTable As Object Dim iValue As Variant Dim TargetName As String Dim TargetID As Long Dim IdColumn As Long Dim NameColumn As Long Dim MarksColumn As Long Dim iCount As Long Dim iResult As Boolean Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("返回结果") Set iTable =iSheet.ListObjects("TableMatch") TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks") .Index iValue = iTable.DataBodyRange.Value For iCount = 1 To UBound(iValue) 如果iValue(iCount, IdColumn) = TargetID 那么如果iValue(iCount, NameColumn) =如果iResult = True End If End If iResult Then Exit For Next iCount If iResult Then MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks: " & iValue(iCount, MarksColumn) Else MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks Not found" End If 结束 Sub
你的代码现在可以运行了。
- 后来。 运行 这段代码,看看下面的图片,看看结果是什么。
正如你从上面的图片中可以看到,有一个 微软Excel 弹出的信息框显示你 分数:84 的 ID: 105 和 名称: 芬恩 我们在代码里面提供的。
VBA代码解释
Dim iBook As Workbook Dim iSheet As Worksheet Dim iTable As Object Dim iValue As Variant Dim TargetName As String Dim TargetID As Long Dim IdColumn As Long Dim NameColumn As Long Dim MarksColumn As Long Dim iCount As Long Dim iResult As Boolean
定义变量。
Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheet("返回结果") Set iTable = iSheet.ListObjects("TableMatch")
在变量内设置工作表名称和表名称。
TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks") .Index
储存查询值和查询列,以进行查询。
iValue = iTable.DataBodyRange.Value For iCount = 1 To UBound(iValue) If iValue(iCount, IdColumn) = TargetID Then If iValue(iCount, NameColumn) = TargetName Then iResult = True End If End If iResult Then Exit For Next iCount
这段代码从下标的开始到结束进行扫描,如果发现搜索列中定义的ID和名称相匹配,则存储结果并关闭所有语句。 同时,退出迭代并进入代码的下一部分。
If iResult Then MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks: " & iValue(iCount, MarksColumn) Else MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "没有找到标记" End If
抛出MsgBox中的结果。
阅读更多。 在Excel中查询并返回串联到一个单元格的多个值
总结
最后,这篇文章向你展示了3种不同的方法,如何进行 基于多个标准的索引匹配 在Excel中用 VBA宏 我希望这篇文章对你非常有益。 欢迎提出任何有关该主题的问题。