Excel VBA跨工作表运行宏报Run-time error 1004 AutoFill方法失败求助
问题根因定位
触发Run-time error '1004': AutoFill method of Range class failed的核心原因出在MasterFormulaPop的范围引用逻辑上:
- 代码中计算A列最后非空行的
Range("A" & Rows.Count).End(xlUp).Row语句没有显式指定所属工作表,VBA会默认将这段代码的操作对象定位到当前激活状态的工作表,而非实际要操作的Sheet2:- 当手动激活Sheet2再运行宏时,计算得到的行号和Sheet2的实际数据匹配,AutoFill可正常运行
- 当从Sheet1触发宏(不管是点击按钮还是手动选择运行),代码会读取Sheet1的A列最后行号,拼接出来的自动填充目标范围跨了工作表,和作为填充源的
Sheet2!C2:ET2不属于同一个对象,直接触发AutoFill方法的类错误
- 额外的边界问题:如果A列只有第1行有数据(不存在从第2行开始的待填充内容),拼接出的填充范围从C2开始就是无效空区域,哪怕所有工作表引用正确,同样会触发1004报错。
修正方案
重写自动填充过程
所有Range引用全部显式绑定对应工作表,完全摆脱对激活工作表的依赖,同时增加边界判断避免空范围的无效调用:
Sub MasterFormulaPop() Dim wsTarget As Worksheet Dim lastDataRow As Long ' 显式绑定目标工作表为Sheet2,不受当前激活表影响 Set wsTarget = ThisWorkbook.Worksheets("Sheet2") ' 基于Sheet2自身的A列计算最后有效数据行 lastDataRow = wsTarget.Range("A" & wsTarget.Rows.Count).End(xlUp).Row ' 有效数据不足2行时直接退出,跳过无效的AutoFill调用 If lastDataRow < 2 Then Exit Sub ' 填充源、目标范围全部指定属于Sheet2 wsTarget.Range("C2:ET2").AutoFill _ Destination:=wsTarget.Range("C2:ET" & lastDataRow), _ Type:=xlFillDefault End Sub
可选优化原有Macro1
原Macro1直接复制整列A列的写法,会将Sheet3整列的空格式、冗余内容全部带到Sheet2,长期使用会导致文件体积异常膨胀,可优化为仅复制实际存在有效数据的范围:
Sub Master() Dim src As Worksheet Dim trg As Worksheet Dim LastRow As Long Set src = ThisWorkbook.Worksheets("Sheet3") Set trg = ThisWorkbook.Worksheets("Sheet2") ' 计算源表A列的实际有效行,避免整列复制的冗余 LastRow = src.Range("A" & src.Rows.Count).End(xlUp).Row src.Range("A1:A" & LastRow).Copy Destination:=trg.Range("A1") End Sub
修正后效果
- 无论当前激活的是哪个工作表,点击Sheet1上的整合触发按钮都能正常顺序执行两个宏,不会再触发1004报错
- 可自动适配A列4行、600行等不同规模的实际数据量,无需手动修改填充范围边界
- 全程不需要手动激活Sheet2,即可完成所有操作
内容的提问来源于stack exchange,提问作者Noelle
相关产品推荐
相关产品推荐

