Excel VBA 比较两个表格的不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel VBA 比较两个表格的不同?相关的知识,希望对你有一定的参考价值。
一个Excel表A,有几十万条数据(几十列)。一个Excel表B,数据量不一定(几十列)。如果表A中某条数据的的C、D、J列和表B中某条数据的B、C、F列分别相等,就把表A中的这条数据删掉。最后使表A中仅保留表B中不存在的内容。
我之前的做法是遍历表B,取表B中B列的值,在表A的C列查找(Find),如果找到在比较A.D 、A.J是否和B.C、B.F相等,如果相等就删除找到的行,如果不相等,就用FindNext查找下一个,然后再比较。这种方法非常费时,测试几万条数据都得几十分钟。
求一种高效的解决方法。
果你的数据规则的,用VBA 很快的:(请用副本测试!!,没问题再把结果保存为正本!!)
测试完成后:在sub 后 代码前加 Application.ScreenUpdating = False ,并在Msgbox 前加Application.ScreenUpdating = True 更快!!
---------------------------------------
Sub 删除A表中相同数据行()
ON ERROR GOTO ExitEnd
Application.ScreenUpdating = False
。。。(原代码部分)
Application.ScreenUpdating = True
MsgBox "完成对比啦~_~", vbExclamation
ExitEnd:
On Error Goto 0
Application.ScreenUpdating = True
End Sub
------------------
以下为不加Application.ScreenUpdating, 会慢一些:
Sub 删除A表中相同数据行()
'前提是数据要规则
'假设A表C\\D\\J 列与B表B\\C\\F列数据对比,且数据次序一样,
'即C对B D对C J对F
'思路:能引用EXCEL本身的方法不用VBA方法,这样快!!
ThisWorkbook.Activate
Dim BiaoA As Object, BiaoB As Object
Dim RowStart&, RowEndA&, RowEndB&, i& '数据起始行与终止行
Dim GongShi$
Dim CLA As Range, CLB As Range
Set BiaoA = Sheets("表A") '“表A”换成实际的A工作表名称
Set BiaoB = Sheets("表B") '“表B”换成实际的B工作表名称
RowStart = 1 '如果有表头改为2
RowEndA = BiaoA.Cells(RowS.Count, "C").End(xlUp).Row
RowEndB = BiaoB.Cells(RowS.Count, "B").End(xlUp).Row
BiaoA.Activate
Columns("A:A").Insert
GongShi = "=D" & RowStart & "&E" & RowStart & "&K" & RowStart
'因临时插入一列:C-D-J 相应变为D-E-K
Cells(RowStart, "A").Formula = GongShi
Cells(RowStart, "A").Copy
Range(Cells(RowStart, "A"), Cells(RowEndA, "A")).Select
ActiveSheet.Paste
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
BiaoB.Activate
Columns("A:A").Insert
GongShi = "=C" & RowStart & "&D" & RowStart & "&G" & RowStart
'因临时插入一列:B-C-F 相应变为C-D-G
Cells(RowStart, "A").Formula = GongShi
Cells(RowStart, "A").Copy
Range(Cells(RowStart, "A"), Cells(RowEndB, "A")).Select
ActiveSheet.Paste
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
For Each CLA In Range(BiaoA.Cells(RowStart, "A"), BiaoA.Cells(RowEndA, "A"))
For Each CLB In Range(BiaoB.Cells(RowStart, "A"), BiaoB.Cells(RowEndB, "A"))
If CLA.Value = CLB.Value Then BiaoA.RowS(CLA.Row).ClearContents
Next
Next
BiaoB.Activate
Columns("A:A").Delete
BiaoA.Activate
For i = RowEndA To RowStart Step -1
If Len(Cells(i, "A").Value) = 0 Then RowS(i).Delete
Next
Columns("A:A").Delete
Set BiaoA = Nothing
Set BiaoB = Nothing
MsgBox "完成对比啦~_~", vbExclamation
End Sub
追问表B不是同一个文件中的Sheet,A、B分别是独立的Excel文件应该怎么写?
追答只改以下代码,其他不变,但注意代码位置一定要放在VBA“模块”中, 并提前把2个工作簿打开即可,把两个工作簿的名称换成实际的即可,注意”扩展名“。
Set BiaoA = Workbooks("簿A.xlsm").Sheets("表A")
Set BiaoB = Workbooks("簿B.xlsx").Sheets("表B")
我要是会的话,就不用来提问了。
参考技术B 如果这两张表的这三列数据是分别一一对应的,即表A中的CDJ列与表B中的BCF列都达到对应相等的的时候,才删除这行数据的话,可以换个逻辑优化一下:可以考虑把A表CDJ、B表BCJ三列的数据全部各自转换为文本,并强制连接,这样遍历次数少多了,
也可以不用VBA,直接用vlookup函数实现前面所说的比较,同时单独在A表中注释一个标志列,用来对vlookup函数的结果可以直接比较,然后用筛选的方式就直接删除对应的行就可以了,内置函数的效率还是比VBA的效率高得多。追问
以前就是采用这种方法,但问题是表B是不固定的,每天都会有若干个表B需要进行比对。工作量还是很大的。
以上是关于Excel VBA 比较两个表格的不同?的主要内容,如果未能解决你的问题,请参考以下文章