Excel中多列数据的去重方法——交叉检测去重

  今天客服碰到的问题是Excel中双列需要交叉检测,对数据进行去重操作,客服在那里束手无策,最后到我这里,说实话,Excel表中如何操作,我也不是非常的懂,要重新学习Excel的复杂操作方法那是基本不可能。了解的Excel中是有宏,即VBA编程,所以最偷懒的办法就是发挥自身特长 —— 编程。还好,以前有VB的基础在,VBA应付起来应该不是很难。

  首先要解决的问题是VBA中的对象,要学,那也不是一时半会的,这个去重最根本的问题是两个,第一,找到数据表中的最大可用行数;第二,能够获取到单元格中的数据进行比较。能解决这两个问题,其他的应用基本的VB语法就能组合成需要的功能了。关于获取Sheet中的最大可用行数,可以有很多方法恶意使用。如下代码均可获取当前Sheet的最大可用行数:

'' 获取当前工作表的最大可用行数的两个方法
MaxRow = ActiveSheet.UsedRange.Rows.Count
MaxRow2 = Application.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

  有了行数,要交叉做检测,自然就是对行数进行遍历,然后取出每行中需要的列值进行比较,也就是要取单元格值,单元格值方法比较多,这里就用一个简单的方法,用Cells(行,列)获取单元格对象,之后取Value值即可,查了帮助,Value是可读写的属性,因此赋值也一样可以用它。

''' 对第一行第一列进行赋值,即(A1)
Cells(1,1).Value = "AAABBC"

  当我们两个核心的问题都得到解决的时候,我们就简单的来按要求组织逻辑了,当然要求不同,逻辑也不同,根据客服的要求,我编写的代码如下:

Sub Macro1()
    ''' 提取非重复数据,并将第一列非重复数据存放到C列,第二列非重复数据存放到D列
    MinRow = 1
    MaxRow = ActiveSheet.UsedRange.Rows.Count
    
    For i = MinRow To MaxRow
        Flg = False
        Flg2 = False
        For j = MinRow To MaxRow
            If Cells(i, 1).Value = Cells(j, 2).Value Then
                Flg = True
            End If
            If Cells(i, 2).Value = Cells(j, 1).Value Then
                Flg2 = True
            End If
        Next
        If Not Flg Then
            Cells(i, 3).Value = Cells(i, 1).Value
        End If
        If Not Flg2 Then
            Cells(i, 4).Value = Cells(i, 2).Value
        End If
    Next
    
    
End Sub

  事情到这里,用不太优雅的方式解决了 —— 主要是VBA不熟,自然没有优雅可言。重在提供实用功能,能解决问题的方法都是好方法!

Friday, December 14, 2012 | 其他技术

文章评论

No comments posted yet.

发表评论

Please add 3 and 5 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。