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

求助:将跨工作表列匹配返回YES/NO的Excel公式转为自适应VBA代码

正确的VBA实现方案

原代码的问题分析

  1. 最后一行判断错误:原代码用Cells(Rows.Count, 1).End(xlUp).Row取A列最后一行,而实际应该基于M列(公式依赖的数据源)判断数据行数,否则会出现行数不匹配的情况。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:48:39