Excel VBA 比较两个表格的不同?

一个Excel表A,有几十万条数据(几十列)。一个Excel表B,数据量不一定(几十列)。如果表A中某条数据的的C、D、J列和表B中某条数据的B、C、F列分别相等,就把表... 一个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查找下一个,然后再比较。这种方法非常费时,测试几万条数据都得几十分钟。

求一种高效的解决方法。
展开
 我来答
匿名用户
2021-03-20
展开全部

果你的数据规则的,用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")
办公整理笔记
2021-03-18 · 办公软件个人应用笔记(EXCEL)
办公整理笔记
采纳数:108 获赞数:295

向TA提问 私信TA
展开全部
如果这两张表的这三列数据是分别一一对应的,即表A中的CDJ列与表B中的BCF列都达到对应相等的的时候,才删除这行数据的话,可以换个逻辑优化一下:
可以考虑把A表CDJ、B表BCJ三列的数据全部各自转换为文本,并强制连接,这样遍历次数少多了,
也可以不用VBA,直接用vlookup函数实现前面所说的比较,同时单独在A表中注释一个标志列,用来对vlookup函数的结果可以直接比较,然后用筛选的方式就直接删除对应的行就可以了,内置函数的效率还是比VBA的效率高得多。
追问
以前就是采用这种方法,但问题是表B是不固定的,每天都会有若干个表B需要进行比对。工作量还是很大的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Ynzsvt
2021-03-18 · TA获得超过6664个赞
知道大有可为答主
回答量:1.5万
采纳率:40%
帮助的人:2677万
展开全部
抓住字典和逆序就好了。
追问
我要是会的话,就不用来提问了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式