小组里有人问标题,确认后,答复是“有多个表格,只有一个表格里有一个张三。”这个通过“删除重复项”,或函数“countif”等,也能较快实现的,但要“一秒”,那只能通过程序了。这里用vba
那我的思路就是,先把所有数据都汇集到一起,然后用循环(本人也是小白,所以花了一天网上查阅和学习,很多说用字典的,还不会),把每个数据都两两比对一遍。其中需要注意以下几点:
1.去空格,主要针对姓名,输入的时候,特别单名,既有可能输成“张三”,也有可能输成“张 三”;
2.本身是空格的,还有数据自身就不要比较了
3.有重复的要标记起来,这里用红底色。
现在创建示例,一个文件夹下面,设了三个文件(工作簿),表1、表2、表3
表1:
张三 | ||
李四 | ||
王五 |
表2:
张三三 | ||
赵六 | ||
孙七 | ||
钱多多 | ||
孙猴子 | ||
小傻瓜 | ||
张 三 |
表3:
张 三 | ||
周八 | ||
吴九 | ||
李四 |
同时新建一个“一键查重”的工作簿,并输入代码
代码如下:
Sub 汇集数据()
Dim path As String
Dim file As String
Dim i As Integer
Dim m As Integer
Dim n As Integer
Dim c As Range
Dim d As Range
i = 1
path = ThisWorkbook.path
ChDir (path)
file = Dir("")
Do While file <> ""
If file <> "一秒查重.xlsm" Then
Workbooks.Open (path & "" & file)
Columns(1).Select
Selection.Copy
Workbooks(path & "" & "一秒查重.xlsm").Activate
Columns(i).Select
ActiveSheet.Paste
i = i + 1
End If
file = Dir
Loop
Worksheets(1).UsedRange.Select
Selection.Copy
Selection.Replace What:=" ", Replacement:=""
Worksheets(1).UsedRange.Select
Selection.Interior.ColorIndex = i
For Each c In Selection
For m = 1 To Selection.Columns.Count
For n = 1 To Selection.Rows.Count
If c <> "" Then
If c.Row <> m Or c.Column <> n Then
If c.Value = Cells(m, n).Value Then
c.Interior.ColorIndex = 3
Cells(m, n).Interior.ColorIndex = 3
End If
End If
End If
Next
Next
Next c
End Sub
大体分成四个区域,实现三部分功能,一是变量定义区,二是数据汇集区,三是空格去除区,四是循环查重区。
最终效果如下
张三 | 张三三 | 张三 |
李四 | 赵六 | 周八 |
王五 | 孙七 | 吴九 |
钱多多 | ||
孙猴子 | ||
小傻瓜 | ||
张三 | ||
李四 |
原始表式不一样,或者重复标识要求不一样,代码不一定完全适用。