修改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
相关产品推荐
相关产品推荐

