ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lg747699

[求助] 对比差异差异(数据量超过1百万行)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-2 10:39 | 显示全部楼层
魂断蓝桥 发表于 2024-7-2 10:30
超过100万的话,用sqlite更好一些,你得excel是32位还是64位,如果32位可用vbRichClient5

老师,我的是64 位操作系统, 基于 x64 的处理器

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-2 12:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2024-7-2 09:07
Option Explicit
Sub a()
    Dim cat, strconn As String, tb1, tb2

老师,为什么我参考,把Microsoft.Jet.OLEDB.4.0
改成Microsoft.ACE.OLEDB.12.
没结果出来呢?

TA的精华主题

TA的得分主题

发表于 2024-7-2 13:04 | 显示全部楼层
lg747699 发表于 2024-7-2 10:39
老师,我的是64 位操作系统, 基于 x64 的处理器

我的是64 位操作系统, 基于 x64 的处理器

我问的是【excel是32位还是64位】

TA的精华主题

TA的得分主题

发表于 2024-7-2 13:10 | 显示全部楼层
lg747699 发表于 2024-7-2 12:37
老师,为什么我参考,把Microsoft.Jet.OLEDB.4.0
改成Microsoft.ACE.OLEDB.12.
没结果出来呢?

我这里测试没有问题

Option Explicit
Sub a()
    Dim cat, strconn As String, tb1, tb2
    Dim myf As String
    Application.ScreenUpdating = False
    myf = ThisWorkbook.Path & "\a.mdb"
    If Dir(myf) <> "" Then Kill myf
    Set cat = CreateObject("adox.catalog")
    strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myf
    cat.Create strconn
    Set tb1 = CreateObject("ADOX.Table")
    Set tb2 = CreateObject("ADOX.Table")
    With tb1
        .ParentCatalog = cat
        .Name = "T1"
        .Columns.Append "ID", 3
        .Columns("ID").Properties("AutoIncrement") = True
        .Columns.Append "编号", 202, 50
        .Keys.Append "PrimaryKey", 1, "ID"
        cat.Tables.Append tb1
    End With
    With tb2
        .ParentCatalog = cat
        .Name = "T2"
        .Columns.Append "ID", 3
        .Columns("ID").Properties("AutoIncrement") = True
        .Columns.Append "编号", 202, 50
        .Keys.Append "PrimaryKey", 1, "ID"
        cat.Tables.Append tb2
    End With
    Set cat.ActiveConnection = Nothing
    Dim myfile As String, wb As Workbook, i&, J&, m&, arr, cnn, sql$
    myf = ThisWorkbook.Path & "\"
    myfile = Dir(myf & "*订单*.xls*")
    Set cnn = CreateObject("ADODB.CONNECTION")
    cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\a.mdb"
    Do While myfile <> ""
        If myfile <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myfile)
            If wb.Sheets.Count > 1 Then
                For i = 1 To wb.Sheets.Count
                    arr = wb.Sheets(i).[A1].CurrentRegion
                    For J = 1 To 5 Step 4
                        For m = 1 To UBound(arr)
                            sql = "INSERT INTO T2(编号) VALUES('" & arr(m, J) & "')"
                            cnn.Execute sql
                        Next
                    Next
                Next
            Else
                arr = wb.Sheets(1).[A1].CurrentRegion
                For m = 2 To UBound(arr)
                    sql = "INSERT INTO T1(编号) VALUES('" & arr(m, 1) & "')"
                    cnn.Execute sql
                Next
            End If
            wb.Close 0
        End If
        myfile = Dir
    Loop
    With Sheet2
        .Cells.Clear
        .[A1] = "ERP有但SRM找不到"
        .[D1] = "SRM有但ERP查不到"
        sql = "select 编号 FROM T1 WHERE 编号 NOT IN (SELECT 编号 from T2)"
        .Range("B2").CopyFromRecordset cnn.Execute(sql)
        sql = "select 编号 FROM T2 WHERE 编号 NOT IN (SELECT 编号 from T1)"
        .Range("E2").CopyFromRecordset cnn.Execute(sql)
    End With
    Set cnn = Nothing
     Application.ScreenUpdating = True
End Sub

1.gif

TA的精华主题

TA的得分主题

发表于 2024-7-2 13:25 | 显示全部楼层
lg747699 发表于 2024-7-2 12:37
老师,为什么我参考,把Microsoft.Jet.OLEDB.4.0
改成Microsoft.ACE.OLEDB.12.
没结果出来呢?
  1. Sub 提取()
  2.     Dim wb As Workbook
  3.     Dim ws As Worksheet
  4.     Dim cellValue As Variant
  5.     Dim filePath As String
  6.     Dim MaxRow As Long
  7.     Dim NameList As String
  8.     Dim NameArr() As String
  9.     Dim I As Long, J As Long, X As Long
  10.     Dim dict As Object
  11.     Dim dict2 As Object
  12.     Dim dict3 As Object
  13.     Dim TitleList   As String
  14.    
  15.     On Error Resume Next
  16.     Application.ScreenUpdating = False ' 关闭屏幕更新
  17.     ' 创建新的字典
  18.     Set dict = CreateObject("Scripting.Dictionary")
  19.     Set dict2 = CreateObject("Scripting.Dictionary")
  20.     Set dict3 = CreateObject("Scripting.Dictionary")
  21.     NameList = "erp订单1.xlsx,erp订单2.xlsx" ' 工作簿名称列表
  22.     TitleList = "A,E"
  23.     NameArr = Split(NameList, ",")
  24.     For I = 0 To UBound(NameArr)
  25.         filePath = ThisWorkbook.Path & "" & NameArr(I)
  26.         Set wb = Workbooks.Open(filePath) ' 打开工作簿
  27.         Set ws = wb.Sheets(1) ' 第一个工作表
  28.         ' 读取内容
  29.         With ws
  30.             MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row '第1列最后一行
  31.             DateArr = .Range(.Cells(2, 1), .Cells(MaxRow, 1)).Value '默认第1行是标题行
  32.         End With
  33.         wb.Close SaveChanges:=False ' 关闭工作簿,不保存更改
  34.         For J = 1 To UBound(DateArr)
  35.             ff = UBound(DateArr)
  36.             If Err.Number = 0 Then
  37.                 dict.Add DateArr(J, 1), DateArr(J, 1)
  38.             Else
  39.                 dict.Add DateArr, DateArr
  40.             End If
  41.             Err.Clear
  42.         Next J
  43.         DoEvents
  44.     Next I
  45.     '  读取SRM
  46.     filePath = ThisWorkbook.Path & "\srm订单.xls"
  47.     Set wb = Workbooks.Open(filePath) ' 打开工作簿
  48.     NameArr = Split(TitleList, ",")
  49.     Set wb = Workbooks.Open(filePath) ' 打开工作簿
  50.     For I = 1 To wb.Sheets.Count
  51.         Set ws = wb.Sheets(I) ' 第I个工作表
  52.         For J = 0 To UBound(NameArr)
  53.             ' 读取内容
  54.             With ws
  55.                 MaxRow = .Cells(.Rows.Count, NameArr(J)).End(xlUp).Row '第J列最后一行
  56.                 DateArr = .Range(.Cells(1, NameArr(J)), .Cells(MaxRow, NameArr(J))).Value
  57.             End With
  58.             For X = 1 To UBound(DateArr)
  59.                 ff = UBound(DateArr)
  60.                 If Err.Number = 0 Then
  61.                     dict2.Add DateArr(X, 1), DateArr(X, 1)
  62.                 Else
  63.                     dict2.Add DateArr, DateArr
  64.                 End If
  65.                 Err.Clear
  66.             Next X
  67.         Next J
  68.         DoEvents
  69.     Next I
  70.     wb.Close SaveChanges:=False ' 关闭工作簿,不保存更改
  71.     ' 清除对象变量
  72.     Set ws = Nothing
  73.     Set wb = Nothing
  74.     ' 开始进行判断
  75.     ' srm有但erp找不到,E列数据
  76.     For Each key1 In dict2.keys
  77.         If Not dict.Exists(key1) Then
  78.             dict3.Add key1, key1
  79.         End If
  80.         DoEvents
  81.     Next
  82.     With Sheet1
  83.         .Cells(15, "E").Resize(dict3.Count, 1) = WorksheetFunction.Transpose(dict3.keys)
  84.     End With
  85.     dict3.RemoveAll
  86.     ' ERP有但SR找不到,E列数据
  87.     For Each key1 In dict.keys
  88.         If Not dict2.Exists(key1) Then
  89.             dict3.Add key1, key1
  90.         End If
  91.         DoEvents
  92.     Next
  93.     With Sheet1
  94.         .Cells(15, "B").Resize(dict3.Count, 1) = WorksheetFunction.Transpose(dict3.keys)
  95.     End With
  96.     Set dict = Nothing
  97.     Set dict2 = Nothing
  98.     Set dict3 = Nothing
  99.     Application.ScreenUpdating = True ' 开启屏幕更新
  100. End Sub
复制代码


使用了3个字典,不知道大数据量下会占用多少时间。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-2 13:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2024-7-2 13:04
我的是64 位操作系统, 基于 x64 的处理器

我问的是【excel是32位还是64位】

Microsoft&#174; Excel&#174; 2019MSO (版本 2406 Build 16.0.17726.20078) 64 位

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-2 14:03 | 显示全部楼层
魂断蓝桥 发表于 2024-7-2 13:04
我的是64 位操作系统, 基于 x64 的处理器

我问的是【excel是32位还是64位】

我的是64位EXCEL。确定看了EXCEL账号提示。

TA的精华主题

TA的得分主题

发表于 2024-7-2 14:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lg747699 发表于 2024-7-2 14:03
我的是64位EXCEL。确定看了EXCEL账号提示。

那用不了vbRichClient5

TA的精华主题

TA的得分主题

发表于 2024-7-2 14:08 | 显示全部楼层
可以发下源数据么  我想测试下速度

TA的精华主题

TA的得分主题

发表于 2024-7-2 14:09 | 显示全部楼层
lg747699 发表于 2024-7-2 12:37
老师,为什么我参考,把Microsoft.Jet.OLEDB.4.0
改成Microsoft.ACE.OLEDB.12.
没结果出来呢?

我试了一下,我这里好用

1.gif
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 23:42 , Processed in 0.035085 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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