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

VBA自动填充多非相邻列失败:For循环触发1004错误的解决方法

问题分析与解决办法

你的For循环存在的问题

  • 循环里误用了Selection.AutoFill:你选中的是多个非相邻列,Selection是整个非连续区域,AutoFill不支持对非连续区域直接执行,而且每次循环用整个选中区域作为AutoFill的源,逻辑完全错误。
  • cel.Range("A1:A" & lRow)是相对于cel单元格的相对引用,比如cel在D列第1行,这个范围就是D1开始向下的lRow行,而不是你要填充的当前列的范围,这会导致目标区域和源区域不匹配,触发1004错误。

正确的实现方法

方法1:直接批量设置公式(最简单高效)

你的公式用的是R1C1引用格式,完全不需要用AutoFill,直接给选中区域赋值公式即可,代码如下:

Dim lRow As Long
lRow = Cells(Rows.Count, "A").End(xlUp).Row
' 限制选中区域的行范围到lRow,避免填充到无用行
With Intersect(Selection, ActiveSheet.Rows("1:" & lRow))
    .FormulaR1C1 = "=IF(RC[2]<0,RC[1]*-1,RC[1])"
End With

解释:Intersect用来把选中区域和1到lRow行的范围取交集,只在有效行范围内设置公式,直接批量应用,比循环效率高得多。

方法2:遍历选中的每一列(如果你非要用循环)

如果坚持用循环,应该遍历选中区域里的每一列,而不是每个单元格,代码如下:

Dim lRow As Long
lRow = Cells(Rows.Count, "A").End(xlUp).Row
Dim col As Range
' 遍历选中区域里的每一个连续列区域
For Each col In Selection.Areas
    ' 给当前列的第1行到lRow行设置公式
    col.Resize(lRow).FormulaR1C1 = "=IF(RC[2]<0,RC[1]*-1,RC[1])"
Next col

解释:Selection.Areas用来获取选中的每个连续区域(因为是非相邻列,所以每个列是一个Area),然后用Resize把列范围调整到lRow行,再设置公式。

补充说明

你注释掉的Selection.AutoFill Destination:=ActiveCell.Range("A1:A" & lRow)失败的原因是:AutoFill的目标区域必须包含源区域,而且源区域是选中的非连续区域,AutoFill不支持这种非连续的源,所以直接报错。

内容的提问来源于stack exchange,提问作者imrobert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:11