You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:16