VBA多变量区域公式拖拽触发1004错误,求代码优化方案
解决VBA AutoFill多区域运行时错误1004的问题
你遇到的运行时错误1004,核心原因是VBA的AutoFill方法不支持非连续的多区域作为目标参数。你的Variant 2里把多个不连续的区域合并成了一个Range对象,但AutoFill只能处理单一的连续单元格区域,这就触发了方法调用失败的错误。而Variant 1能正常工作,正是因为它是逐个处理每个连续区域,每个AutoFill的目标都是单一的连续范围,符合方法的要求。
给你一个更优雅的优化方案:用循环批量处理这些区域,既避免重复代码,又符合AutoFill的运行规则,同时还能让代码更易维护。
优化后的代码示例
Sub DragRowsOptimized() Dim LastRowEPS As Integer Dim areaRanges As Variant Dim i As Integer Dim sourceRange As Range Dim targetRange As Range ' 获取目标最后一行的行号 LastRowEPS = Sheet1.Cells(14, 12).End(xlDown).Row ' 定义所有需要填充的起始区域(第一行的公式范围) areaRanges = Array("A14:G14", "I14:K14", "M14:N14", "P14:P14") ' 遍历每个区域执行填充操作 For i = LBound(areaRanges) To UBound(areaRanges) Set sourceRange = Range(areaRanges(i)) ' 根据起始区域自动计算扩展到LastRowEPS的目标范围 Set targetRange = Range(sourceRange.Address & ":" & sourceRange.Columns(1).Offset(LastRowEPS - sourceRange.Row).Address) ' 直接执行AutoFill,避免使用Select操作(VBA中尽量避免Select,更高效稳定) sourceRange.AutoFill Destination:=targetRange, Type:=xlFillDefault Next i End Sub
这个方案的优势
- 易维护:后续如果需要新增或修改填充区域,只需要修改
areaRanges数组里的元素即可,不用重复编写AutoFill逻辑 - 更高效:去掉了冗余的
Select操作,直接操作Range对象,减少了Excel界面交互的开销 - 逻辑严谨:每个区域单独处理,完全符合AutoFill对连续区域的要求,不会再触发1004错误
如果想更严谨,还可以加个判断,避免当只有一行数据时执行无意义的填充:
If LastRowEPS > 14 Then ' 上面的循环填充逻辑 End If
内容的提问来源于stack exchange,提问作者rnsns
相关产品推荐
相关产品推荐

