ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

【讨论,已总结40楼】超大数据下,Vlookup和Find的优劣

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-10-25 09:06 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

这是我做的一个例子,由于数据量很大,原始数据22000,查找的数据也是22000行,原先直接操作有点慢,就想用代码操作,做了一下用Vlookup的代码和一个用Find的代码。我的结论是链接一列数据时,vlookup比find要快,但是链接多列数据的时候,find比vlookup要快。示例如下

1、一列的数据链接 n9qeXbHb.txt (2.34 KB, 下载次数: 182)

希望大家能找到更好的链接方法,来处理类似问题!谢谢

[此贴子已经被作者于2005-10-26 13:02:03编辑过]

rCbHoYYq.rar

426.22 KB, 下载次数: 331

【讨论+测试】超大数据下,Vlookup和Find的优劣

TA的精华主题

TA的得分主题

发表于 2005-10-25 09:19 | 显示全部楼层

非常感谢龙III的无私,麻烦看看下面的代码,那两个变量应该定义为什么才能正确运行?

adOpenStatic, adOpenDynamic

Sub ChaXun() '按输入的日期起止来查询职员的生日名单 Dim x As Object Dim yy As Object Dim strsql As String Dim adOpenStatic, adOpenDynamic

Set x = CreateObject("ADODB.Connection") Set yy = CreateObject("ADODB.Recordset") x.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0';;Data Source=" & ThisWorkbook.FullName strsql = "select * FROM [员工信息表$a2:k] WHERE 生日 between '" & Sheet5.Cells(4, 5) & "' and '" & Sheet5.Cells(4, 7) & "'" yy.Open strsql, x, adOpenStatic, adOpenDynamic Sheet5.Range("a8:z1000").ClearContents Sheet5.[a8].CopyFromRecordset yy

Set yy = Nothing: Set x = Nothing

End Sub

因很久没有看到你,只好跟在此,怕你没时间看不到。

TA的精华主题

TA的得分主题

发表于 2005-10-25 10:33 | 显示全部楼层

不行,我也只能提速到20秒。关键是兄台的数据有找不到的情况,如果都能找到的话可以用lookup,速度可以提高10倍。

或者兄台可以自编一个2叉树查找的代码(相当于lookup),不过不太好编就是了。

文件太大只贴代码:

Application.ScreenUpdating = False Dim i&, j&, p&, q& Dim rng As Range With Sheets("查找范围") p = Cells(65536, 2).End(xlUp).Row q = .Cells(65536, 2).End(xlUp).Row Range(Cells(2, 4), Cells(p, 4)) = Application.VLookup(Range(Cells(2, 1), Cells(p, 1)), .Range(.Cells(2, 1), .Cells(q, 2)), 2, 0) End With arr = Range(Cells(2, 1), Cells(p, 4)) For i = 1 To p - 1 If IsError(arr(i, 4)) Then If arr(i, 1) = "" Then arr(i, 3) = "K" Else arr(i, 3) = "N" End If arr(i, 4) = "" Else arr(i, 3) = "Y" End If Next i Range(Cells(2, 1), Cells(p, 4)) = arr

TA的精华主题

TA的得分主题

发表于 2005-10-25 10:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

先占个地方了。

[em04]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-25 10:48 | 显示全部楼层

先试试!谢了,第一次看到整个区域同时赋值的情况!

数据有找不到的是很正常的,这个肯定得考虑

[此贴子已经被作者于2005-10-25 10:49:09编辑过]

TA的精华主题

TA的得分主题

发表于 2005-10-25 10:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
那么就确定不能用lookup了,除非长兄愿意出手编一个近似lookup的代码,兄台我可以免费提供思路哦:)

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-25 11:08 | 显示全部楼层

大致测试结果,我把你的代码放到我复杂的数据里面,第一次运行了98秒,第二次运行了107秒,我自己的代码运行了99秒。

llnkZfC9.txt (1.99 KB, 下载次数: 67)

这是代码,原始文件属机密文件,不能上传!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-25 11:09 | 显示全部楼层

关于lookup函数,本身就很少用它,写一个代码来替代它,我想应该很难!

不过,UNARTHUR兄可否大致说个思路,学习一下?

TA的精华主题

TA的得分主题

发表于 2005-10-25 11:32 | 显示全部楼层

呵呵!都是vlookup,估计速度也差不多。

二叉树查找其实原理很简单,就是被查找的那列先按升序(降序也行)排好,然后每次与被查数比较时取用被查列一半位置的数,大小比较完毕之后再上移(或下移)剩下部分一半,在比较,以此类推,不断缩小范围,直到查到为止。这就是一种数据库快速查询的方法,当然二叉树是比较简单的一种。

兄台有兴趣不妨编一个,搞不好会比lookup还快呢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-25 11:37 | 显示全部楼层

对于链接一列:单独以我上传的这份资料来看 7SNMYUHI.rar (431.5 KB, 下载次数: 60)

,find方法是不可取的,按UNARTHUR兄的vlookup整体赋值,再依次判断是最快的约为23秒,逐个循环用Vlookup时间约为27秒 (中间话,UNARTHUR兄,我在里面新增了一个代码,按你的整体赋值思路,直接赋给了一个数组,再用一个数组来确定第3列的值,速度反而慢一点点,要24秒,我感觉应该会快一点点才对,请指教?)

奇怪的是,同等的行,只是数据的复杂程度增加之后,两个代码都要运行好久,整体赋值和逐一赋值基本没多少区别,都要100秒左右

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

本版积分规则

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

GMT+8, 2024-11-24 09:25 , Processed in 0.041207 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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