今天客服碰到的问题是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不熟,自然没有优雅可言。重在提供实用功能,能解决问题的方法都是好方法!