Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5746|回复: 12

[已解决]如何快速对比两工作表数据

[复制链接]
发表于 2017-4-12 14:38 | 显示全部楼层 |阅读模式
本帖最后由 czl103 于 2017-8-7 17:04 编辑

详见附件,表1中有些合同编号是表2中没有的,表2中也有一些合同编号是表1中没有的,使用VLookup函数可以得到附件中的结果,问题是我们公司有几十万条的数据,使用函数就行不通了,一开始计算excel就不动了。

烦请大虾们帮忙设计一段VBA代码解决这个问题,不胜感激!

Sub 核对()
arr = Sheets("表2").Range("a2:a" & Sheets("表2").Range("a" & Rows.Count).End(xlUp).Row)
brr = Sheets("表1").Range("a2:a" & Sheets("表1").Range("a" & Rows.Count).End(xlUp).Row)
Set dic2 = CreateObject("scripting.dictionary")
Set dic1 = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr)
  dic2(arr(i, 1)) = ""
Next
For i = 1 To UBound(brr)
  dic1(brr(i, 1)) = ""
Next

For i = 1 To UBound(arr)
  If dic1.exists(arr(i, 1)) Then arr(i, 1) = "表1存在" Else arr(i, 1) = "表1不存在"
Next
For i = 1 To UBound(brr)
  If dic2.exists(brr(i, 1)) Then brr(i, 1) = "表2存在" Else brr(i, 1) = "表2不存在"
Next

Sheets("表2").Range("C2:C" & Sheets("表2").Range("a" & Rows.Count).End(xlUp).Row) = arr
Sheets("表1").Range("C2:C" & Sheets("表1").Range("a" & Rows.Count).End(xlUp).Row) = brr

End Sub

最佳答案
2017-4-12 20:57
本帖最后由 wenzili 于 2017-4-13 08:51 编辑

吸取327718098的函数用法改进,速度稍快些
Public Sub master2()
Dim vaSht1data As Variant
Dim vaSht2data As Variant
Dim vaOutdata() As Variant
Dim i As Long, n As Long

vaSht1data = Intersect(Sheet1.Columns(1), Sheet1.UsedRange)
vaSht2data = Intersect(Sheet2.Columns(1), Sheet2.UsedRange)
ReDim vaOutdata(1 To UBound(vaSht1data, 1), 1 To 1)

    For i = 2 To UBound(vaSht1data, 1)
        If Application.WorksheetFunction.CountIf(Sheet2.Range("a:a"), vaSht1data(i, 1)) > 0 Then
            vaOutdata(i - 1, 1) = "YES"
        Else
            vaOutdata(i - 1, 1) = "NO"
        End If
    Next i
Sheet1.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata
ReDim vaOutdata(1 To UBound(vaSht2data, 1), 1 To 1)

   For i = 2 To UBound(vaSht2data, 1)
        If Application.WorksheetFunction.CountIf(Sheet1.Range("a:a"), vaSht2data(i, 1)) > 0 Then
            vaOutdata(i - 1, 1) = "YES"
        Else
            vaOutdata(i - 1, 1) = "NO"
        End If
    Next i
Sheet2.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata

End Sub

两工作表数据对比V1.rar

13.13 KB, 下载次数: 59

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-4-12 19:39 | 显示全部楼层
Sub 查找()
Dim hh As Long, a As Long
hh = 2
Do While Sheet1.Cells(hh, 1) <> ""
a = Application.WorksheetFunction.CountIf(Sheet2.Range("A:A"), Sheet1.Cells(hh, 1))
If a = 0 Then
Sheet1.Cells(hh, 3) = "true"
End If
hh = hh + 1
Loop
hh = 2
Do While Sheet2.Cells(hh, 1) <> ""
a = Application.WorksheetFunction.CountIf(Sheet1.Range("A:A"), Sheet2.Cells(hh, 1))
If a = 0 Then
Sheet2.Cells(hh, 3) = "true"
End If
hh = hh + 1
Loop

End Sub

评分

参与人数 1 +3 收起 理由
wenzili + 3 速度快

查看全部评分

回复

使用道具 举报

发表于 2017-4-12 20:18 | 显示全部楼层
Public Sub master()
Dim vaSht1data As Variant
Dim vaSht2data As Variant
Dim vaOutdata() As Variant
Dim i As Long, n As Long
vaSht1data = Intersect(Sheet1.Columns(1), Sheet1.UsedRange)
vaSht2data = Intersect(Sheet2.Columns(1), Sheet2.UsedRange)
ReDim vaOutdata(1 To UBound(vaSht1data, 1), 1 To 1)

    For i = 2 To UBound(vaSht1data, 1)
        For n = 2 To UBound(vaSht2data, 1)
            If vaSht1data(i, 1) = vaSht2data(n, 1) Then
                vaOutdata(i - 1, 1) = "YES"
            End If
        Next n
        If vaOutdata(i - 1, 1) <> "YES" Then vaOutdata(i - 1, 1) = "NO"
    Next i
Sheet1.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata
ReDim vaOutdata(1 To UBound(vaSht2data, 1), 1 To 1)

    For i = 2 To UBound(vaSht2data, 1)
        For n = 2 To UBound(vaSht1data, 1)
            If vaSht2data(i, 1) = vaSht1data(n, 1) Then
                vaOutdata(i - 1, 1) = "YES"
            End If
        Next n
        If vaOutdata(i - 1, 1) <> "YES" Then vaOutdata(i - 1, 1) = "NO"
    Next i
Sheet2.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata
   
End Sub
回复

使用道具 举报

发表于 2017-4-12 20:34 | 显示全部楼层
327718098 发表于 2017-4-12 19:39
Sub 查找()
Dim hh As Long, a As Long
hh = 2

果然用已有函数速度快。
数据多的话,你的程序快的多
回复

使用道具 举报

发表于 2017-4-12 20:55 | 显示全部楼层
wenzili 发表于 2017-4-12 20:18
Public Sub master()
Dim vaSht1data As Variant
Dim vaSht2data As Variant

variant 的变量不用申明,可以直接用
回复

使用道具 举报

发表于 2017-4-12 20:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wenzili 于 2017-4-13 08:51 编辑

吸取327718098的函数用法改进,速度稍快些
Public Sub master2()
Dim vaSht1data As Variant
Dim vaSht2data As Variant
Dim vaOutdata() As Variant
Dim i As Long, n As Long

vaSht1data = Intersect(Sheet1.Columns(1), Sheet1.UsedRange)
vaSht2data = Intersect(Sheet2.Columns(1), Sheet2.UsedRange)
ReDim vaOutdata(1 To UBound(vaSht1data, 1), 1 To 1)

    For i = 2 To UBound(vaSht1data, 1)
        If Application.WorksheetFunction.CountIf(Sheet2.Range("a:a"), vaSht1data(i, 1)) > 0 Then
            vaOutdata(i - 1, 1) = "YES"
        Else
            vaOutdata(i - 1, 1) = "NO"
        End If
    Next i
Sheet1.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata
ReDim vaOutdata(1 To UBound(vaSht2data, 1), 1 To 1)

   For i = 2 To UBound(vaSht2data, 1)
        If Application.WorksheetFunction.CountIf(Sheet1.Range("a:a"), vaSht2data(i, 1)) > 0 Then
            vaOutdata(i - 1, 1) = "YES"
        Else
            vaOutdata(i - 1, 1) = "NO"
        End If
    Next i
Sheet2.Range("c2").Resize(UBound(vaOutdata, 1), 1) = vaOutdata

End Sub

回复

使用道具 举报

发表于 2017-4-12 20:58 | 显示全部楼层
327718098 发表于 2017-4-12 20:55
variant 的变量不用申明,可以直接用

习惯了,不写总觉得缺些啥
回复

使用道具 举报

发表于 2017-4-12 21:05 | 显示全部楼层
wenzili 发表于 2017-4-12 20:58
习惯了,不写总觉得缺些啥

666
回复

使用道具 举报

 楼主| 发表于 2017-4-13 08:32 | 显示全部楼层
wenzili 发表于 2017-4-12 20:57
吸取327718098的函数用法改进,速度稍快些
Public Sub master2()
Dim vaSht1data As Variant

谢谢高手,我运行代码以后有如下错误提示,麻烦您帮忙看看什么原因
数据对比错误对话框.jpg
回复

使用道具 举报

发表于 2017-4-13 08:45 | 显示全部楼层
本帖最后由 wenzili 于 2017-4-13 08:52 编辑
czl103 发表于 2017-4-13 08:32
谢谢高手,我运行代码以后有如下错误提示,麻烦您帮忙看看什么原因

奥,这是运行时间的提示。可以将如下语句删掉
MsgBox Timer - t
我已在上面语句中删除了。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-23 23:28 , Processed in 0.295049 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表