AF列存在重复值时删除整行,遇WorksheetFunction.Match属性错误求助
解决AF列去重时的VBA错误及代码修正
你的代码出现Unable to get Match property of the WorksheetFunction class错误,加上去重逻辑失效,主要有三个问题:
- 匹配列逻辑错误:你要处理AF列的重复值,但代码里拿的是B列(
Cells(iCntr,2))的值去匹配AF列,完全偏离需求,应该用AF列自身的值来判断重复。 - 循环方向错误:从第一行到最后一行循环时,删除行会导致后续行上移,循环变量
iCntr递增后会跳过这些上移的行,应该从最后一行倒着往上循环。 - Match函数未做错误处理:
WorksheetFunction.Match找不到匹配项时会直接抛出运行时错误,改用Application.Match可以返回错误值,配合IsError判断就能避免报错。
修正后的代码如下:
Sub RemoveAFDuplicates() Dim lastRow As Long Dim matchFoundIndex As Variant ' 改为Variant类型,接收错误值 Dim iCntr As Long ' 获取AF列的最后一行,确保统计数据范围准确 lastRow = Range("AF" & Rows.Count).End(xlUp).Row ' 从最后一行往上循环,避免删除行后跳过数据 For iCntr = lastRow To 1 Step -1 ' 检查当前AF列单元格是否为空 If Cells(iCntr, "AF").Value <> "" Then ' 用Application.Match,找不到时返回错误值 matchFoundIndex = Application.Match(Cells(iCntr, "AF").Value, Range("AF1:AF" & iCntr - 1), 0) ' 如果找到匹配(说明之前已经出现过这个值),就删除当前行 If Not IsError(matchFoundIndex) Then Cells(iCntr, 1).EntireRow.Delete End If End If Next iCntr End Sub
代码说明:
- 改用
Range("AF" & Rows.Count).End(xlUp).Row获取AF列的最后一行,避免依赖A列的行数导致范围不准确。 - 倒序循环(
lastRow To 1 Step -1),删除行后不会影响未循环到的行的位置,彻底避免遗漏数据。 - 匹配范围改为
AF1:AF" & iCntr - 1,只检查当前行之前的单元格,确保保留每个值第一次出现的行;如果需要保留最后一次出现的行,把匹配范围改成AF" & iCntr + 1 & ":AF" & lastRow即可。 - 用
Variant类型接收Application.Match的结果,通过IsError判断是否找到匹配,从根源避免报错。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

