ListObject的DataBodyRange行索引偏移+1问题咨询
问题分析与解决方法
这不是正常现象,原因完全符合你的猜测:DataBodyRange的行索引是相对于表格数据区域的(从1开始对应表的第一行数据),而非工作表的绝对行号。
具体原因
rowCatID = rowCatSearch.Row获取的是工作表的绝对行号(比如表格表头在第3行,第一行数据在第4行,匹配到的行号就是4)。- 但
DataBodyRange的行1对应表格的第一行数据(即工作表的第4行),当你用绝对行号直接索引DataBodyRange时,相当于多跳过了表头的行数,所以会写到rowCatID+1行(如果表头占1行的话)。
修正方案
方案1:直接使用Match返回的相对行号(推荐)
WorksheetFunction.Match(searchCATID, [completeList[CATID]], 0)返回的就是目标值在表格CATID列中的相对行号(即DataBodyRange的行索引),直接用这个值赋值即可,无需转换工作表行号:
If searchVal <> "NOK" Then Dim matchRow As Long matchRow = WorksheetFunction.Match(searchCATID, [completeList[CATID]], 0) colNameUSe = "Number of uses - " & market compList.ListObjects("completeList").ListColumns(colNameUSe).DataBodyRange(matchRow) = useOfCat End If
方案2:转换绝对行号为相对行号
如果需要保留rowCatID,可以通过表格表头行号计算相对行号:
If searchVal <> "NOK" Then Set rowCatSearch = [completeList].Rows(WorksheetFunction.Match(searchCATID, [completeList[CATID]], 0)) rowCatID = rowCatSearch.Row Dim relativeRow As Long relativeRow = rowCatID - compList.ListObjects("completeList").HeaderRowRange.Row colNameUSe = "Number of uses - " & market compList.ListObjects("completeList").ListColumns(colNameUSe).DataBodyRange(relativeRow) = useOfCat End If
额外优化建议
代码中多次使用Activate是不必要的,VBA可以直接引用对象,无需激活工作表,这样代码更高效且避免激活带来的潜在错误。比如:
' 替换原来的激活取值代码 searchCATID = LONameSan.ListColumns("CATID").DataBodyRange(r - 1).Value ' r从2开始,对应表的第1行数据 useOfCat = LONameSan.ListColumns("Total 6 months").DataBodyRange(r - 1).Value
内容的提问来源于stack exchange,提问作者crissc
相关产品推荐
相关产品推荐

