VBA中ListObject的ListRows方法调用失败问题求助
问题分析与解决方案
核心问题1:变量引用错误
第二个For Each循环里,你错误地使用了第一个循环的变量r,而非当前循环的ro。第一个循环结束后r已指向无效对象,访问r.Range会触发错误,且这也不是你要操作的当前行。
核心问题2:ListObject实例失效
中间调用的ImportPQ和FormatCTENTable大概率修改了目标ListObject(比如Power Query刷新后重建表格、替换了原有表格结构),导致最初With块里的ListObject引用失效,再次调用.ListRows时就会抛出错误。
修正后的代码
Dim tbl As ListObject Set tbl = Sheet3.ListObjects("Contractuels") ' 第一次遍历填充字典 Dim r As ListRow For Each r In tbl.ListRows Dim mailVal As String mailVal = r.Range(tbl.ListColumns("mail_ouvert").Index).Value Dim cmiVal As Variant cmiVal = r.Range(tbl.ListColumns("CMI / IPR").Index).Value dict.Add mailVal, cmiVal Next r Call ImportPQ Call FormatCTENTable ' 重新获取ListObject引用,避免原实例失效 Set tbl = Sheet3.ListObjects("Contractuels") ' 第二次遍历更新数据 Dim ro As ListRow For Each ro In tbl.ListRows mailVal = ro.Range(tbl.ListColumns("mail_ouvert").Index).Value If dict.Exists(mailVal) Then ro.Range(tbl.ListColumns("CMI / IPR").Index).Value = dict(mailVal) End If Next ro
关键优化点
- 移除
With块,改为显式获取ListObject引用,在调用外部过程后重新获取一次,确保引用的是最新表格实例。 - 用列索引直接访问单元格替代
Application.Intersect,代码更高效,避免Range交集计算的潜在问题。 - 利用字典的
Exists方法和键值直接查找,替换遍历所有Items的低效逻辑,同时避免了遍历Items时的对象引用错误(i.Key是错误用法,Items返回的是值而非键值对)。
内容的提问来源于stack exchange,提问作者ReinaDelSur
相关产品推荐
相关产品推荐

