使用DataBodyRange获取行号时结果与实际行号不符的问题求助
问题原因与解决方法
问题根源
你得到的41是表格数据区域内的相对行号,而非Excel工作表的绝对行号。Application.Match在表格的DataBodyRange中查找时,返回的是目标值在数据区域里的位置(从1开始计数),不是它在整个工作表中的行号。
比如你的表格表头在第1行,数据从第2行开始,那相对行号1就对应工作表的第2行,以此类推。你的目标值在工作表第42行,说明表格数据区域从第2行开始,42-2+1=41,正好是Match返回的结果。
修正代码
要获取工作表的绝对行号,需把Match返回的相对行号,加上表格数据区域的起始行号,再减1:
Function FindRFIDCode(ByVal partNum As String) As Integer FindRFIDCode = 0 Dim matchResult As Variant Dim tbl As ListObject Set tbl = Range("CombinedTapeInfo").ListObject ' 先判断表格是否有数据,避免空表格触发错误 If tbl.DataBodyRange Is Nothing Then Exit Function End If matchResult = Application.Match(partNum, tbl.ListColumns(1).DataBodyRange, 0) If IsError(matchResult) Then FindRFIDCode = 0 Else ' 计算绝对行号:数据区域起始行 + 相对行号 - 1 FindRFIDCode = tbl.DataBodyRange.Row + matchResult - 1 End If End Function
额外说明
- 新增空表格判断逻辑,防止表格无数据时抛出错误。
- 如果你的需求本来就是获取表格内的相对行号,原代码是正确的;若需工作表绝对行号,使用修正后的逻辑即可。
内容的提问来源于stack exchange,提问作者TheIntern
相关产品推荐
相关产品推荐

