本帖最后由 zorsite 于 2015-6-25 17:35 编辑
在学习字典的过程中,发现诸多高手都习惯性的运用数组,似乎我们在每一个运用字典的案例中都能发现数组的影子。
对于新手而言,这种思维模式似乎有些困难。就像我一直用网银转账,忽然有人告诉我用微信转账吧,更方便!一开始我接受不了,但是经不住很多人都这样告诉我,而我也将信将疑的试用一两次,结果发现:哎,真的呀,是更方便更快捷!
那么数组就是这样一种更方便更快捷的方式。
我们举个很简单的例子,用字典来查找数据。很多初学者会说:我用vlookup就很好,为什么要用字典呢?哈哈,不要纠结这个问题了,我们只是练练手。学会了字典我们可以处理其他更复杂的问题。
上图中,要在第二张表中根据电话号码自动到第一张表中查找到联系人姓名。如果用字典,那么思路如下:
1.将第一张表中的数据写入字典。电话号码是关键字key,姓名是项item。
2.根据第二张表中D列的电话号码在字典中找到相应key的item,写入E列相应单元格。
这是一种非常简单的思路,至少我的第一反应是这样。
下面是代码:
- Sub 查找()
- Dim d As New Dictionary
- Dim i As Long
- t = Timer
- Sheet2.Columns('E').Clear
- Sheet2.[E1].Value = '联系人' '清空原有联系人数据
- For i = 1 To Sheet1.Cells(1, 1).End(xlDown).Row
- d(Sheet1.Cells(i, 1).Value) = Sheet1.Cells(i, 2).Value
- Next
- '把所有电话和联系人读入到字典中。
- For i = 1 To Sheet2.[d1048576].End(xlUp).Row - 1
- Sheet2.Cells(i 1, 'E').Value = d(Sheet2.Cells(i 1, 'D').Value)
- Next
- '根据D列相应的数据,在字典中找到期联系人姓名,然后逐一填写在E列中相应的单元格。
- Set d = Nothing '清空字典
- MsgBox '不用数组时程序运行时间为' & Format((Timer - t) * 1000, '0.00') & '毫秒'
- End Sub
这段代码只要能搞清d(x)是什么意思就能读懂,思路、逻辑浑然天成,似乎程序就该这样写。直到我发现了其他人的代码……
- Sub 查找2()
- Dim d As New Dictionary
- Dim i, n As Long
- t = Timer
- Sheet2.Columns(5).Clear
- Sheet2.[E1].Value = '联系人'
- arr = Sheet1.[a1].CurrentRegion
- For i = 1 To UBound(arr)
- d(arr(i, 1)) = arr(i, 2)
- Next '把所有电话和联系人读入到字典中。
- n = Sheet2.[d1048576].End(xlUp).Row - 1
- brr = Sheet2.[d2].Resize(n, 2)
- '创建一个n行2列的数组,放置进出货记录中的电话和将要联系人的联系人姓名。
- For i = 1 To n
- brr(i, 2) = d(brr(i, 1))
- Next '在字典中找到每个联系电话的联系人,并将结果写入数组。
- Sheet2.[d2].Resize(n, 2) = brr '将数组中的数据(n行2列,包括原有的电话信息)一次性的写入D、E列(覆盖D列原有数据)。
- Set d = Nothing '清空字典
- MsgBox '不用数组时程序运行时间为' & Format((Timer - t) * 1000, '0.00') & '毫秒'
- End Sub
这段代码读起来就有些费劲,它运用了两个数组。
它先把第一张表中的数据写入到了ARR数组中,然后再写入到字典。
查找联系人的时候,又用了一次数组。先把字典中找到的数据写入数组,然后一次性的将数组数据写入对应区域。
这段代码与第一段代码思路上的不同在于:
只要涉及到“一系列”的数据,就用数组,或者说:只要有“整块”的数据区域,就用数组。
第一段代码运行最短时间为89毫秒,而第二段代码运行的最短时间为42毫秒。
实践证明,善用数组,比逐一读取、写入单元格的效率要高很多。
电话识别.rar
(2015-6-25 17:22 上传)
69.07 KB, 下载次数: 59
分享到新浪微博
|