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

如何在现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:45:04