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
相关产品推荐
相关产品推荐

