分享

Excel 功能/公式函数/VBA/多种姿势处理重复值,What’s your favorite?

 冷茶视界 2023-11-15 发布于江苏

我们在Excel中录入、处理数据的时候,经常会遇到重复值的问题,今天我们就来聊一聊。

我们分几种情况:

一、标记重复值:

1、我们可以采用条件格式,直接标出重复的记录,不用任何公式:

这种方法,它标出了所有重复的记录,我们后续根据需求对它进行处理,比如删除、修改等

2、我们还是用条件格式,不过,我们这次使用公式,来点复杂一点的(其实也没那么复杂):

=COUNTIF($A$1:$A1,A1)>1格式设置成淡蓝色这个条件格式的含义:判断当前单元格的值,如果在前面出现过,则把它标色。=COUNTIF($A$1:$A1,A1)>2格式设置成浅绿色这个条件格式的含义:判断当前单元格的值,如果在前面出现过2次及以上,则把它标色。

这里要注意条件格式的顺序。

3、增加辅助列,用公式来标记重复值

=COUNTIF($A$2:$A2,A2)在C列增加辅助列,公式跟条件格式的类似,统计单元格值出现的次数。

我们根据C列的值来判断重复值,筛选大于1的,就是重复的记录,这里手工标色。

二、删除重复记录:

1、在前面标志的基础上,手工删除,适用于记录较少的情况,我们没有必要为了删除一条重复记录,搞一大堆公式。

2、使用删除重复项功能:选择要处理的列,然后打开“数据”选项卡,选择“删除重复项”,在弹出的窗口中勾选要按照哪些列来判断是否重复,然后点击“确定”即可删除重复记录。

3、使用VBA代码:

Private Sub CmdDeleteDuplicates_Click()    Dim lastRow As Integer, newLastRow As Integer    Dim rng As Range           '获取当前工作表中的最后一行'    lastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row        '将要处理的列保存到变量 rng 中'    Set rng = Range("A1:C" & lastRow)        '删除重复记录'    rng.EntireRow.RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo    newLastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row        '显示删除后的记录数'    MsgBox "已删除 " & (lastRow - newLastRow) & " 条重复记录。"End Sub
注:此代码来自AI,略作修改。

上面的代码还是有点缺陷,数据范围限定A列到C列,仅根据第一、二列数据来判断重复值,如果要根据其他列,或者更多列的数据来判断重复值,需要修改代码。想想还是再搞一个相对灵活的方案吧,于是就有了下面的代码:

Private Sub CmdRemoveDuplicates_Click()    Dim rng As Range    Dim iCol As Integer, iRow As Integer    Set rng = Application.Selection    iCol = rng.Columns.Count    iRow = rng.Rows.Count    If rng.Cells.Count = 1 Then        MsgBox "选择的不是一个区域,请重新选择。"        Exit Sub    End If    answer = MsgBox("删除重复单元格?:" & vbNewLine & _        "  YES. 单元格" & vbNewLine & _        "   NO. 整行", vbExclamation + vbYesNo)        For i = iRow To 2 Step -1        a = ""        For k = 1 To iCol            a = a & rng.Cells(i, k)        Next                For j = 1 To i - 1            b = ""            For k = 1 To iCol                b = b & rng.Cells(j, k)            Next                        If a = b Then                Select Case answer                Case vbYes                    rng.Rows(i).Delete Shift:=xlUp '仅删除重复单元格,下方单元格上移'                Case vbNo                     rng.Rows(i).EntireRow.Delete  '删除重复行,整行删除'                End Select                Exit For            End If        Next    NextEnd Sub注:此代码AI也有所贡献,不过贡献有限,核心代码,就是For i,For j的那一段比较不同行的记录的语句是我自己写的

上面代码,根据选择的单元格区域来判断,不同行对应每一列所有单元格的值都相同,则删除。看下效果:

三、取得唯一值

1、在“一、2项中,标记重复值后,根据需要,筛选出唯一值。

2、在“二、2、3项中,删除重复值后,即得到唯一值。

3、使用高级筛选功能:

4、使用数据透视表:数据透视表有一点点麻烦,如果你掌握了它,应该知道怎么做:

5、使用公式:

{=IFERROR(INDEX($A$2:$A$10,MATCH(0,COUNTIF($D$1:D1,$A$2:$A$10),0)),"")}

上面的公式提取出不重复的会计科目代码,公式有点复杂,核心逻辑是在D列,判断A列单元格的值在当前单元格上面的单元格中有没有出现过,如果出现过,则COUNTIF的值为1,没出现过则为0,我们就是要找到第一个0对应的位置。解释得有点啰嗦,我们来个“公式求值”,看一下计算过程就比较清楚了:

如果你的office版是最新版的(2019或365),应该有一个内置函数UNIQUE,可以取得唯一值,由于我没有这些版,就不展开了,感兴趣的小伙伴可以网上搜搜,会有各路大神纷纷给你支招,我就不掺合了。

还有其他什么方法呢?我也不去想了,欢迎留言分享你的方法。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多