VBA匹配ID粘贴行时触发“Method 'Range' of object '_Worksheet failed”报错
报错原因排查&修复方案
- 问题1:未处理Match匹配失败场景
你使用的Application.WorksheetFunction.Match在目标列找不到对应ID时会直接抛出运行时错误,首次运行时所有ID都能在Leases表C列找到对应值,后续数据更新后出现了不存在的ID,因此触发报错。 - 问题2:单元格引用未限定工作表
代码中ws.Range(Cells(rowchange, 8), Cells(rowchange, 67))里的Cells对象没有绑定工作表,默认取当前活动工作表的单元格,当活动工作表不是Leases时,会出现引用范围不匹配的错误。 - 问题3:数组索引越界风险
循环边界取的是UBound(dtarray),如果leaseid数组的行数小于dtarray的行数,读取leaseid(a, 4)时会出现索引越界报错。
修复后代码
leaseid = Sheet3.Cells(1, 1).CurrentRegion dtarray = Sheet3.Cells(1, 15).CurrentRegion Dim ws As Worksheet Set ws = ActiveWorkbook.Sheets("Leases") Dim txtid As String Dim rowchange As Variant ' 改成Variant接收匹配错误值 ' 先判断两个数组行数是否一致,避免索引越界 If UBound(leaseid) <> UBound(dtarray) Then MsgBox "leaseid和dtarray行数不匹配,请检查数据" Exit Sub End If For a = 2 To UBound(dtarray) txtid = leaseid(a, 4) ' 改用Application.Match,支持返回错误值不直接抛错 rowchange = Application.Match(txtid, ws.Range("C:C"), 0) ' 判断是否匹配成功 If Not IsError(rowchange) Then ' 给Cells加上ws限定,绑定Leases工作表 ws.Range(ws.Cells(rowchange, 8), ws.Cells(rowchange, 67)) = Application.WorksheetFunction.Index(dtarray, a, 0) MsgBox (rowchange) Else ' 可自行添加不匹配时的处理逻辑,比如打印日志 Debug.Print "ID:" & txtid & " 未找到匹配行" End If Next
内容的提问来源于stack exchange,提问作者Jusec
相关产品推荐
相关产品推荐

