如何获取Application.Match函数匹配值的行与列索引
如何获取Application.Match的匹配索引及跨表匹配的行列位置
嘿,我来帮你理清这个问题——Application.Match本身就和索引直接相关,而且跨表匹配时的行列位置也有清晰的处理方式,咱们一步步说:
一、先搞懂Application.Match的基础索引返回
其实Application.Match的返回值就是匹配值在查找范围内的相对索引,不同的查找范围对应不同的索引类型:
- 如果你的查找范围是单列区域(比如
Sheet1.Range("A:A")),返回的是匹配值在该列中的相对行号,若区域从第一行开始,这个值就是工作表的绝对行号;要是区域从A2开始,绝对行号就是matchResult + 1(因为A2是区域的第1行)。 - 如果是单行区域(比如
Sheet1.Range("1:1")),返回的是匹配值在该行中的相对列号,起始列不是A的话要做偏移计算。 - 尽量别用多行列的区域作为查找范围,因为Match会按行优先返回一个连续的位置数,转成行列号需要额外计算,不如拆成单列/单行查找更直观。
举个最简单的例子,在Sheet1的A列找"Test":
Dim matchRow As Variant ' 第三个参数0代表精确匹配,一定要加! matchRow = Application.Match("Test", Sheet1.Range("A:A"), 0) ' 必须判断是否出错,没找到的话Match会返回错误值 If Not IsError(matchRow) Then MsgBox "找到啦!在Sheet1第" & matchRow & "行" Else MsgBox "没找到这个值哦" End If
二、跨工作表匹配时获取双方的行列索引
假设你要在两个工作表里找相同值,并且拿到两边的行列位置,分两种常见场景给你例子:
场景1:单个值跨表匹配,获取两边位置
比如你要拿Sheet1中B3的值,去Sheet2里找对应位置:
Dim targetVal As Variant Dim s1Row As Long, s1Col As Long Dim s2MatchRow As Variant, s2MatchCol As Variant ' 先拿到Sheet1中目标单元格的信息 targetVal = Sheet1.Range("B3").Value s1Row = Sheet1.Range("B3").Row s1Col = Sheet1.Range("B3").Column ' 在Sheet2的A列找行索引,在第2行找列索引 s2MatchRow = Application.Match(targetVal, Sheet2.Range("A:A"), 0) s2MatchCol = Application.Match(targetVal, Sheet2.Range("2:2"), 0) If Not IsError(s2MatchRow) And Not IsError(s2MatchCol) Then MsgBox "Sheet1里的位置:行" & s1Row & ",列" & s1Col & vbCrLf & _ "Sheet2里的匹配位置:行" & s2MatchRow & ",列" & s2MatchCol Else MsgBox "Sheet2里没找到这个值" End If
场景2:批量遍历区域,逐个匹配获取行列
如果你要循环Sheet1的一片区域,每个单元格都去Sheet2里找匹配,这么写:
Dim cell As Range Dim matchPos As Variant Dim s2Row As Long, s2Col As Long Dim searchRange As Range Set searchRange = Sheet2.Range("A:D") ' Sheet2的查找范围 For Each cell In Sheet1.Range("A2:D10") ' 遍历Sheet1的A2到D10 matchPos = Application.Match(cell.Value, searchRange, 0) If Not IsError(matchPos) Then ' 把Match返回的相对位置转成Sheet2的绝对行列 s2Row = searchRange.Row + matchPos - 1 s2Col = ((matchPos - 1) Mod searchRange.Columns.Count) + searchRange.Column MsgBox "Sheet1的" & cell.Address & "在Sheet2的位置:行" & s2Row & ",列" & s2Col End If Next cell
几个必须注意的点
- 永远用
IsError()判断Match的返回值!没找到匹配时它会返回错误值,直接赋值给Long类型变量会报错,所以用Variant类型接收最稳妥。 - 精确匹配一定要加第三个参数
0,不然Match会默认做模糊匹配,结果可能完全不对。 - 如果非要用多行列区域查找,记得用
searchRange.Columns.Count来计算列号,就像场景2里的写法,把相对位置转成绝对行列。
内容的提问来源于stack exchange,提问作者Stropo
相关产品推荐
相关产品推荐

