Excel VBA AutoFill仅填充有效数据行 避免#N/A错误代码修改
问题根因
原代码填充范围判断逻辑存在缺陷:ActiveCell.End(xlDown).Offset(-1,0) 从公式起始单元格向下查找第一个非空单元格,若起始单元格下方无连续有效数据,会直接定位到工作表整列最后一行,导致填充范围覆盖大量无数据空行,空行无匹配值就会返回#N/A。另外原代码中使用的全角中文引号会直接触发语法错误,运行前需替换为英文半角引号。
修正代码
直接放弃Select+AutoFill的易出错写法,先精准定位新增有效数据的行边界,再批量写入公式,从根源避免超范围填充:
Sub WriteVlookupToNewRows() Dim ws As Worksheet Dim formulaStart As Range Dim keyColLastRow As Long ' 绑定Sheet2工作表对象 Set ws = ThisWorkbook.Worksheets("Sheet2") ' 定位F列存量数据下方第一个空行,作为公式起始写入位置 Set formulaStart = ws.Range("F1").End(xlDown).Offset(1, 0) ' 以VLOOKUP匹配键所在列(原公式RC[7]为F列向右偏移7列,即M列)的最后一行非空单元格为填充终止边界 ' 若匹配键不在M列,将下面代码中的"M"替换为实际列标即可 keyColLastRow = ws.Cells(ws.Rows.Count, "M").End(xlUp).Row ' 仅当存在有效新增数据时才写入公式 If keyColLastRow >= formulaStart.Row Then ' 直接给目标范围批量赋值公式,无需调用AutoFill方法 ws.Range(formulaStart, ws.Cells(keyColLastRow, "F")).FormulaR1C1 = _ "=IF(RC[7]="""","""",VLOOKUP(RC[7],Monitor_Report[#All],4,FALSE))" End If End Sub
改动说明
- 移除
Select/ActiveCell这类依赖当前选中状态的不稳定写法,直接通过工作表对象操作单元格,不会受用户手动选中单元格的干扰 - 填充边界以VLOOKUP匹配键列的实际最后一行非空数据为准,只会给存在有效匹配键的行写入公式,不会覆盖空行
- 公式外层增加空值判断:如果匹配键单元格为空,直接返回空值,就算边界判断存在偏差也不会出现#N/A错误
- 直接给目标单元格区域批量写入公式,比AutoFill执行效率更高,也不会出现填充方向、范围偏移的问题
提示:如果你的VLOOKUP第一参数引用的列不是M列,一定要把代码中
keyColLastRow对应的列标改成实际的匹配键列,否则边界判断会出错。
内容的提问来源于stack exchange,提问作者0726
相关产品推荐
相关产品推荐

