如何在现有VBA代码中使用xlDown函数实现动态数据范围自动填充
解决方案
你原来的代码问题是硬编码了行范围161,只需要先动态获取数据区域的最后一行,再替换掉固定行号即可,优化后的完整代码如下:
Sub 动态填充公式() Dim lastRow As Long ' 从A列第2行向下找最后一个有数据的行,用xlDown实现 lastRow = Range("A2").End(xlDown).Row ' 填充C列公式 Range("C2").FormulaR1C1 = "=RC[-1]" Range("C3").FormulaR1C1 = "=IF(RC[-2]=R[-1]C[-2],R[-1]C&"",""&RC[-1],RC[-1])" Range("C3").AutoFill Destination:=Range("C3:C" & lastRow) ' 填充D列公式 Range("D2").FormulaR1C1 = "=COUNTIF(R2C1:RC[-3],RC[-3])" Range("D2").AutoFill Destination:=Range("D2:D" & lastRow) ' 可选:C列转值避免公式后续自动更新影响结果 ' Range("C2:C" & lastRow).Value = Range("C2:C" & lastRow).Value End Sub
关键修改说明
- 定义
lastRow变量,用Range("A2").End(xlDown).Row获取A列从第2行往下最后一个非空单元格的行号,完全符合你要使用xlDown的需求 - 把原来硬编码的
C3:C161、D2:D161改成了动态拼接的C3:C" & lastRow、D2:D" & lastRow,不管数据范围怎么变都会自动适配到最后一行 - 删掉了录制宏生成的冗余
Select操作,直接对Range对象操作,运行速度更快且不会出现选中错位的问题
注意:如果你的A列中间存在空行,xlDown会在第一个空行的位置停止,这种情况可以换成从表格最底部往上找的写法:
lastRow = Cells(Rows.Count, "A").End(xlUp).Row,适配性更强
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

