求助:将跨工作表列匹配返回YES/NO的Excel公式转为自适应VBA代码
正确的VBA实现方案
原代码的问题分析
- 最后一行判断错误:原代码用
Cells(Rows.Count, 1).End(xlUp).Row取A列最后一行,而实际应该基于M列(公式依赖的数据源)判断数据行数,否则会出现行数不匹配的情况。 - R1C1引用错误:
R[1]C[-13]是向下偏移1行、向左偏移13列,对应N列下一行,不是当前行的M列;'Sheet2'!C[-10]是向左偏移10列,对应Q列,并非Sheet2的J列。
方案一:批量填充A1格式公式(推荐)
直接给整个目标区域设置公式,Excel会自动调整单元格引用,比AutoFill更高效简洁:
Sub MatchYesNo() Dim ws1 As Worksheet Dim lastRow As Long ' 指定工作表,避免依赖激活状态 Set ws1 = ThisWorkbook.Worksheets("Sheet1") ' 获取Sheet1中M列的最后数据行 lastRow = ws1.Cells(ws1.Rows.Count, "M").End(xlUp).Row ' 给AA列对应区域批量设置公式 ws1.Range("AA1:AA" & lastRow).Formula = "=IFERROR(IF(MATCH(M1,'Sheet2'!J:J,0),""YES""),""NO"")" End Sub
方案二:修正R1C1格式的原代码
如果坚持用AutoFill,需修正R1C1的引用逻辑:
Sub MatchYesNo_R1C1() Dim r As Long Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") ' 基于M列获取最后数据行 r = ws1.Cells(ws1.Rows.Count, "M").End(xlUp).Row ' 修正R1C1引用:RC[-14]对应当前行的M列,'Sheet2'!C10对应Sheet2的J列 ws1.Range("AA1").FormulaR1C1 = "=IFERROR(IF(MATCH(RC[-14],'Sheet2'!C10,0),""YES""),""NO"")" ws1.Range("AA1").AutoFill Destination:=ws1.Range("AA1:AA" & r) End Sub
内容的提问来源于stack exchange,提问作者user23008074
相关产品推荐
相关产品推荐

