Excel VBA实现带公式的动态数据范围:自动识别最后一行
优化Excel VBA实现动态数据范围的公式填充
嘿,针对你要实现自动识别最后一行并动态应用公式的需求,我来给你一套更高效、更健壮的优化方案——原代码里的Select/Activate和固定范围都是VBA里的“坏习惯”,不仅容易出错,还会拖慢运行速度,我们直接改掉这些问题:
核心思路
- 避免激活/选中单元格:直接通过工作表对象操作单元格,更稳定高效
- 动态获取最后一行:根据数据所在的列(比如你的AS列公式依赖AR列,就用AR列来判断最后一行)自动计算数据范围的终点
- 批量赋值公式:不用
AutoFill,直接给整列目标区域一次性设置公式,代码更简洁
优化后的完整代码
Sub DynamicFormulaFill() Dim ws As Worksheet Dim lastRow As Long ' 定义目标工作表,避免Activate/Select操作 Set ws = ThisWorkbook.Sheets("Opérations") ' 动态获取数据最后一行:这里假设AR列是你的数据基准列(因为AS3公式引用RC[-6]即AR列) ' 如果你的基准列不是AR,可以改成其他列标识,比如"A"代表A列 lastRow = ws.Cells(ws.Rows.Count, "AR").End(xlUp).Row ' 给AS列从第3行到最后一行批量设置公式 ws.Range("AS3:AS" & lastRow).FormulaR1C1 = "=VLOOKUP(RC[-6],Time!R1C1:R16C2,2,TRUE)" ' 给AT列从第3行到最后一行批量设置公式(注意补全你原来的公式内容) ws.Range("AT3:AT" & lastRow).FormulaR1C1 = _ "=IF(Time!R[-2]C[-35]<>Maturities!R3C17,VLOOKUP(RC[-7],Time!R1C4:R2585C5,2,FALSE),"""")" End Sub
关键细节说明
- 动态最后一行的判断:
ws.Cells(ws.Rows.Count, "AR").End(xlUp).Row是VBA里获取列最后一行数据的标准写法——从列的最底部往上找第一个非空单元格,这样不管数据新增还是减少,都能准确识别范围。 - 去掉Select/Activate:直接通过
ws.Range操作,避免了因工作表切换导致的错误,代码运行速度也会快很多。 - 批量赋值公式:相比
AutoFill,直接给整个区域设置公式的效率更高,逻辑也更清晰。
如果你需要调整判断最后一行的基准列,只需要把"AR"改成你实际的数据列(比如如果数据在B列,就写"B")即可。
内容的提问来源于stack exchange,提问作者kray




