VBA中Resize Table报错:Object Variable error,求问题排查
问题排查与修正方案
错误根源分析
- 对象未初始化提前调用:代码开头
Set ob = shtDest.ListObjects("Table1")执行时,shtDest还未被赋值(此时为Nothing),直接访问它的ListObjects成员必然触发「对象变量或With块变量未设置」错误。 - 变量未赋值:
Lrow1全程未被赋予任何有效值,Resize时会传递空值引发错误。 - 表格Resize语法错误:
ob.Resize ob.Range.Resize(Lrow1)不符合ListObject.Resize的语法要求,该方法需要传入一个完整的Range对象来定义表格的新范围。
修正后的完整代码
Sub addtoconfirmdatabase() Const WB_PATH As String = "S:\Goods Ordering\Confirmed Orders.xlsx" Dim srcSht As Worksheet, wb As Workbook, shtDest As Worksheet, i As Long Dim ob As ListObject Dim newRow As ListRow ' 建议替换为具体工作表名称,避免ActiveSheet带来的不确定性 Set srcSht = ActiveSheet For i = 2 To srcSht.Range("A" & srcSht.Rows.Count).End(xlUp).Row If srcSht.Cells(i, 1) = "x" Then ' 首次匹配时打开目标工作簿并初始化表格对象 If shtDest Is Nothing Then Set wb = Workbooks.Open(Filename:=WB_PATH) Set shtDest = wb.Sheets("Orders Confirmed") Set ob = shtDest.ListObjects("Table1") End If ' 用ListObject的ListRows.Add直接添加行,自动扩展表格(无需手动Resize) Set newRow = ob.ListRows.Add(AlwaysInsert:=True) srcSht.Cells(i, 2).Resize(1, 86).Copy newRow.Range ' 标记已处理行 srcSht.Cells(i, 7).Interior.ColorIndex = 46 End If Next i ' 保存并关闭目标工作簿(如果已打开) If Not wb Is Nothing Then wb.Close SaveChanges:=True End If Sheets("Quote Database").Range("P1:R1").ClearContents MsgBox "你的订单已添加至确认订单数据库。" End Sub
关键修改说明
- 延迟初始化表格对象:将
Set ob的代码移至目标工作簿打开、shtDest赋值完成后,确保对象已存在再调用其成员。 - 使用ListObject原生方法添加行:用
ListRows.Add直接向表格插入新行,表格会自动扩展范围,完全替代手动Resize的需求,更稳定且符合Excel表格的设计逻辑。 - 合并重复判断:将两个判断
srcSht.Cells(i,1)="x"的逻辑合并,减少冗余代码。 - 优化对象引用:添加
newRow变量明确指向新增的表格行,代码可读性更强。
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

