分享

Excel 善用数组,提高程序效率

 L罗乐 2017-05-13
本帖最后由 zorsite 于 2015-6-25 17:35 编辑

在学习字典的过程中,发现诸多高手都习惯性的运用数组,似乎我们在每一个运用字典的案例中都能发现数组的影子。
对于新手而言,这种思维模式似乎有些困难。就像我一直用网银转账,忽然有人告诉我用微信转账吧,更方便!一开始我接受不了,但是经不住很多人都这样告诉我,而我也将信将疑的试用一两次,结果发现:哎,真的呀,是更方便更快捷!
那么数组就是这样一种更方便更快捷的方式。
我们举个很简单的例子,用字典来查找数据。很多初学者会说:我用vlookup就很好,为什么要用字典呢?哈哈,不要纠结这个问题了,我们只是练练手。学会了字典我们可以处理其他更复杂的问题。
22222.png
上图中,要在第二张表中根据电话号码自动到第一张表中查找到联系人姓名。如果用字典,那么思路如下:
1.将第一张表中的数据写入字典。电话号码是关键字key,姓名是项item。
2.根据第二张表中D列的电话号码在字典中找到相应key的item,写入E列相应单元格。
这是一种非常简单的思路,至少我的第一反应是这样。
下面是代码:
  1. Sub 查找()
  2. Dim d As New Dictionary
  3. Dim i As Long

  4. t = Timer
  5. Sheet2.Columns('E').Clear
  6. Sheet2.[E1].Value = '联系人' '清空原有联系人数据

  7. For i = 1 To Sheet1.Cells(1, 1).End(xlDown).Row
  8. d(Sheet1.Cells(i, 1).Value) = Sheet1.Cells(i, 2).Value
  9. Next
  10. '把所有电话和联系人读入到字典中。


  11. For i = 1 To Sheet2.[d1048576].End(xlUp).Row - 1
  12.     Sheet2.Cells(i 1, 'E').Value = d(Sheet2.Cells(i 1, 'D').Value)
  13. Next
  14. '根据D列相应的数据,在字典中找到期联系人姓名,然后逐一填写在E列中相应的单元格。

  15. Set d = Nothing '清空字典
  16. MsgBox '不用数组时程序运行时间为' & Format((Timer - t) * 1000, '0.00') & '毫秒'
  17. End Sub
这段代码只要能搞清d(x)是什么意思就能读懂,思路、逻辑浑然天成,似乎程序就该这样写。直到我发现了其他人的代码……
  1. Sub 查找2()
  2. Dim d As New Dictionary
  3. Dim i, n As Long

  4. t = Timer
  5. Sheet2.Columns(5).Clear
  6. Sheet2.[E1].Value = '联系人'

  7. arr = Sheet1.[a1].CurrentRegion
  8. For i = 1 To UBound(arr)
  9.     d(arr(i, 1)) = arr(i, 2)
  10. Next '把所有电话和联系人读入到字典中。

  11. n = Sheet2.[d1048576].End(xlUp).Row - 1
  12. brr = Sheet2.[d2].Resize(n, 2)
  13. '创建一个n行2列的数组,放置进出货记录中的电话和将要联系人的联系人姓名。

  14. For i = 1 To n
  15.     brr(i, 2) = d(brr(i, 1))
  16. Next '在字典中找到每个联系电话的联系人,并将结果写入数组。
  17. Sheet2.[d2].Resize(n, 2) = brr '将数组中的数据(n行2列,包括原有的电话信息)一次性的写入D、E列(覆盖D列原有数据)。

  18. Set d = Nothing '清空字典
  19. MsgBox '不用数组时程序运行时间为' & Format((Timer - t) * 1000, '0.00') & '毫秒'
  20. End Sub
这段代码读起来就有些费劲,它运用了两个数组。
它先把第一张表中的数据写入到了ARR数组中,然后再写入到字典。
查找联系人的时候,又用了一次数组。先把字典中找到的数据写入数组,然后一次性的将数组数据写入对应区域。
这段代码与第一段代码思路上的不同在于:
只要涉及到一系列”的数据,就用数组,或者说:只要有“整块”的数据区域,就用数组。
第一段代码运行最短时间为89毫秒,而第二段代码运行的最短时间为42毫秒。
实践证明,善用数组,比逐一读取、写入单元格的效率要高很多。

电话识别.rar  (2015-6-25 17:22 上传)

69.07 KB, 下载次数: 59






分享到新浪微博

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多