Excel 2013 VBA:非活动工作表中ListObject表格Resize失效求助
解决VBA ListObject Resize时的1004错误(非活动工作表场景)
这个问题我之前踩过一模一样的坑!核心原因是你调用Range(newRange)的时候没有明确指定所属工作表,VBA默认会使用当前活动工作表的Range对象。当Sheet02不是活动表时,你相当于拿着其他工作表的Range去调整Sheet02里ListObject的大小——两个对象不属于同一个工作表,自然就触发了1004应用程序错误。
修正方案:给Range绑定明确的工作表
所有和Sheet02相关的Range、Rows.Count操作都要明确指定Sheet02,彻底脱离对活动工作表的依赖。这里有两种优化后的写法:
写法1(保留字符串拼接的方式)
Function Resize() Dim lastRow As Long Dim newRange As String Dim tbl As ListObject ' 明确用Sheet02的Rows.Count,避免依赖活动表 lastRow = Sheet02.Cells(Sheet02.Rows.Count, "G").End(xlUp).Row newRange = "$A1:$G$" & lastRow ' 获取目标表格,Resize时指定Sheet02的Range Set tbl = Sheet02.ListObjects("tblDb") tbl.Resize Sheet02.Range(newRange) End Function
写法2(更安全的直接构造Range对象)
推荐这种方式,避免字符串拼接可能出现的格式错误:
Function Resize() Dim lastRow As Long Dim newRange As Range Dim tbl As ListObject ' 先获取目标ListObject Set tbl = Sheet02.ListObjects("tblDb") ' 找到G列最后一行数据的行号 lastRow = Sheet02.Cells(Sheet02.Rows.Count, "G").End(xlUp).Row ' 直接构造从A1到G列最后一行的Range对象 Set newRange = Sheet02.Range(Sheet02.Cells(1, "A"), Sheet02.Cells(lastRow, "G")) ' 执行Resize操作 tbl.Resize newRange End Function
关键注意点
- VBA中如果不明确指定工作表,
Range、Rows、Cells这些对象都会默认指向活动工作表,这是很多1004错误的根源。 - 给所有工作表相关的操作加上工作表前缀(比如
Sheet02.xxx),能让代码更健壮,不受当前活动表的影响。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

