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

修改VBA两列对比代码:动态识别数据最后一行

动态适配数据行的两列差异对比VBA代码

嘿,我帮你把这段固定行号的VBA代码改成能自动识别数据最后一行的版本,这样不管你的数据有多少行,代码都能灵活处理!

原代码的局限

原代码里硬编码了Range("A2:A40")和Range("B2:B40"),只能处理到第40行——要是数据超过40行,后面的内容会被忽略;要是不足40行,又会无效遍历空单元格,既不灵活也低效。

修改后的完整代码

Sub PullUniques()
    Dim lastRowA As Long
    Dim lastRowB As Long
    Dim rngCell As Range
    
    ' 动态获取A列有数据的最后一行行号
    lastRowA = Range("A" & Rows.Count).End(xlUp).Row
    ' 动态获取B列有数据的最后一行行号
    lastRowB = Range("B" & Rows.Count).End(xlUp).Row
    
    ' 找出A列存在但B列没有的内容,输出到C列
    For Each rngCell In Range("A2:A" & lastRowA)
        If WorksheetFunction.CountIf(Range("B2:B" & lastRowB), rngCell) = 0 Then
            Range("C" & Rows.Count).End(xlUp).Offset(1) = rngCell
        End If
    Next
    
    ' 找出B列存在但A列没有的内容,输出到D列
    For Each rngCell In Range("B2:B" & lastRowB)
        If WorksheetFunction.CountIf(Range("A2:A" & lastRowA), rngCell) = 0 Then
            Range("D" & Rows.Count).End(xlUp).Offset(1) = rngCell
        End If
    Next
End Sub

关键修改点说明

  • 动态行号获取:用Range("列标" & Rows.Count).End(xlUp).Row这个经典写法,自动定位对应列有数据的最后一行,彻底摆脱固定行号的限制。
  • 独立处理两列行号:因为A、B两列的数据行数可能不一样,所以分别定义lastRowA和lastRowB,确保两列的所有有效数据都被遍历到。
  • 保留核心逻辑:完全保留了原代码对比两列差异并输出到C、D列的核心功能,只是把固定范围替换成了动态生成的范围。

可选优化(避免空列报错)

如果担心表头为空或者列中没有数据的情况,可以加个判断跳过无效循环:

' 在A列循环前添加判断
If lastRowA >= 2 Then
    For Each rngCell In Range("A2:A" & lastRowA)
        ' 原循环内代码
    Next
End If

' 在B列循环前添加判断
If lastRowB >= 2 Then
    For Each rngCell In Range("B2:B" & lastRowB)
        ' 原循环内代码
    Next
End If

内容的提问来源于stack exchange,提问作者Adalbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:50:49