VBA宏问题:按日指定起始单元格,实现A列最后一行的Vlookup
问题分析
原代码的核心问题是计算了A列最后账号行的LastRow但完全没用到这个变量,反而用ActiveCell.End(xlDown)确定公式填充的结束行——这个方法是基于当前激活单元格所在列的非空数据,而非A列的账号列表范围。如果当前列下方是空行(到合计行),End(xlDown)会直接跳到合计行,导致公式覆盖合计区域,生成#N/A错误。
修正后的代码
Sub Vlookup() Dim LastRow As Long Dim targetCol As Range ' 用With语句操作Balances工作表,避免Activate的潜在问题 With Worksheets("Balances") ' 确定要写入余额的目标列(第2行的下一个空列) If .Range("C2").Value > 0 Then Set targetCol = .Range("C2").End(xlToRight).Offset(0, 1) Else Set targetCol = .Range("C2") End If ' 校验日期是否匹配 If Sheets("Todays Bals").Range("A2") <> .Cells(1, targetCol.Column) Then MsgBox "这些余额属于不同日期,请导入正确的报表" Exit Sub End If ' 获取A列最后一个有账号的行(避开下方的合计行) LastRow = .Range("A" & .Rows.Count).End(xlUp).Row ' 从目标列第2行开始,到LastRow行,批量写入VLOOKUP公式 .Range(targetCol, .Cells(LastRow, targetCol.Column)).Formula = _ "=VLOOKUP(A2,'Todays Bals'!B:C,2,FALSE)" End With End Sub
关键修改点
- 用上计算好的
LastRow:直接以A列最后账号行作为公式填充的结束行,确保不会触及下方的合计行 - 替换
Select/Activate为With语句:避免激活单元格带来的逻辑混乱,代码更稳定 - 明确目标列范围:通过
targetCol定位要写入的列,结合LastRow精准控制公式填充的区域
内容的提问来源于stack exchange,提问作者Adezzz
相关产品推荐
相关产品推荐

