ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5016|回复: 7

[求助] 求助一个处理超大数据量的VBA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-22 21:53 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
各位大神,麻烦请教一下如何能快速处理以下数据的办法
数据分为2个sheet,数据导入的表格和数据源,需要将数据源中的内容,整行导入到导入表中,判断以A列为准

在数据源中找到相同A列的编号,然后将这个编号对应的这行的信息匹配入导入表,其实量小的话,VLOOK一下分分钟就解决了
问题在于,数据源有50W行,导入的表格有46W需要互相匹配
其实就是46W的编号已经打乱,46W行数据需要重新提取数据源表中的部分信息补全

详情见附件,可能说的不够明白,就是导入表的编号序列是打乱的,需要根据编号从数据源提取这个编号的某几项数据
VLOOKUP,46W行匹配50W行,25分钟才动了1%,公司电脑是I7+8G,完全跑不动,只能来这里麻烦各位帮忙了


还有大神提供VBA是能否加下注释,最近我也在学VBA,以前自学的C,逻辑什么的都会,就是函数使用有点累,希望各位可以帮个忙,每行加下备注,方便后期修改和套用

Book1.zip

7.15 KB, 下载次数: 50

TA的精华主题

TA的得分主题

发表于 2016-2-23 09:28 | 显示全部楼层
Sub 导入()
    Dim arr
   
    arr = Sheet2.Range("a2:r" & Sheet2.Cells(Rows.Count, 1).End(3).Row)
   
    For a = 2 To Sheet1.Cells(Rows.Count, 1).End(3).Row
        For b = 1 To UBound(arr)
            If Sheet1.Cells(a, 1) = arr(b, 1) Then
                Sheet1.Cells(a, 5) = arr(b, 2)
                Sheet1.Cells(a, 6) = arr(b, 3)
                Sheet1.Cells(a, 7) = arr(b, 4)
                Sheet1.Cells(a, 8) = arr(b, 5)
                Sheet1.Cells(a, 8) = arr(b, 6)
            End If
        Next
    Next
   
End Sub

不知道这个速度怎么样?你试一试!

TA的精华主题

TA的得分主题

发表于 2016-2-23 10:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还是将实际数据弄上来写吧
没有50万,也得弄个万把的试试

使用SQL也许会快点
数据量大,就将用vb.net封装的DLL来执行,也许更快

TA的精华主题

TA的得分主题

发表于 2016-2-23 10:29 | 显示全部楼层
。。。。。。。。。。。

Book1.rar

17.5 KB, 下载次数: 27

TA的精华主题

TA的得分主题

发表于 2016-2-23 12:00 | 显示全部楼层
使用了SQL的 left join
问题是:没有按照A表的原来顺序给出对应B表的数据
        而是将A表的字段重新排序后,给出了B表的数据
ZHAOGANG 老师出面看看吧

  1.     Set SH1 = Sheets("数据源")
  2.     Set SH2 = Sheets("数据导入的表格")
  3.     SH2.Range("B2:J65536").ClearContents
  4.    
  5.     Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';Data Source =" & ThisWorkbook.FullName     '//OFFICE2007
  6.    
  7.     StrSQL = ""
  8.     StrSQL = StrSQL & "SELECT A.序号,B.序号,B.B,B.C,B.D,B.E,B.F,B.G,B.H,B.I,B.J,B.K,B.L,B.M,B.N FROM ( "
  9.     StrSQL = StrSQL & "SELECT 序号 FROM [" & SH2.Name & "$]"
  10.     StrSQL = StrSQL & ") AS A LEFT JOIN ("
  11.     StrSQL = StrSQL & "SELECT * FROM [" & SH1.Name & "$] "
  12.     StrSQL = StrSQL & ") AS B ON A.序号=B.序号"

  13.     SQLARR = GET_SQL_To_Arr(StrSQL, Str_coon, True)
  14.     Set SH3 = Sheets("结果")
  15.     SH3.Cells.Clear
  16.     SH3.Range("A1").Resize(UBound(SQLARR, 1) + 1, UBound(SQLARR, 2) + 1) = SQLARR
复制代码

TA的精华主题

TA的得分主题

发表于 2016-2-23 12:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 opiona 于 2016-2-23 12:30 编辑

Book1.rar (91.71 KB, 下载次数: 73)

虚拟了200000条数据,文件太大,精简了些
用时80-120秒
不足之处:字段:A的顺序自动给排序了!

已经发帖求助了,请关注:http://club.excelhome.net/forum.php?mod=viewthread&tid=1260383&page=1&extra=#pid8568733

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-23 12:48 | 显示全部楼层
谢谢各位。。。。我在研究下,关键就是量太大,VLOOKUP的话,由于量大,所以跑起来CUP和内存都吃不消

TA的精华主题

TA的得分主题

发表于 2018-1-1 17:09 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
40万行,用字典+数组估计不会超过12秒吧
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-7 12:49 , Processed in 0.052365 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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