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")

参考技术A 抓住字典和逆序就好了。追问

我要是会的话,就不用来提问了。

参考技术B 如果这两张表的这三列数据是分别一一对应的,即表A中的CDJ列与表B中的BCF列都达到对应相等的的时候,才删除这行数据的话,可以换个逻辑优化一下:
可以考虑把A表CDJ、B表BCJ三列的数据全部各自转换为文本,并强制连接,这样遍历次数少多了,
也可以不用VBA,直接用vlookup函数实现前面所说的比较,同时单独在A表中注释一个标志列,用来对vlookup函数的结果可以直接比较,然后用筛选的方式就直接删除对应的行就可以了,内置函数的效率还是比VBA的效率高得多。追问

以前就是采用这种方法,但问题是表B是不固定的,每天都会有若干个表B需要进行比对。工作量还是很大的。

以上是关于Excel VBA 比较两个表格的不同?的主要内容,如果未能解决你的问题,请参考以下文章

如何用VBA将excel的数据导入到另外个excel中

Excel VBA从两个日期在表格中创建和添加多行

比较excel文件表格对应数据,标记出不同。

VBA比较两个Excel数据的异同

怎样用Beyond Compare比较两个excel表格文件差异

怎样用Beyond Compare比较两个excel表格文件差异