Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2828|回复: 9

[已解决]用VBA数组改写公式查找 不要用find也不要用单元格

[复制链接]
发表于 2017-5-27 14:50 | 显示全部楼层 |阅读模式
本帖最后由 laoau138 于 2017-5-27 15:49 编辑

用VBA数组改写公式查找  不要用find也不要用单元格

最佳答案
2017-5-27 15:29
本帖最后由 france723 于 2017-5-27 15:32 编辑

因为按钮位置的影响,br没写CurrentRegion(这样不用确定列数)。调整按钮位置后可以改写br = Range("q9").CurrentRegion.
  1. Sub aaa()
  2. Dim y1, ar, br, i, j, n, m, cr, h
  3. y1 = Range("c65536").End(3).Row
  4. ar = Range("c10:h" & y1)
  5. h = Range("q65536").End(3).Row
  6. br = Range("q9:v" & h)
  7. ReDim cr(1 To UBound(ar), 1 To 6)
  8. For i = 1 To UBound(ar)
  9.     For j = 1 To UBound(ar, 2)
  10.         For n = 1 To UBound(br)
  11.             For m = 1 To UBound(br, 2)
  12.                 If ar(i, j) = br(n, m) Then
  13.                     cr(i, j) = br(n, 1)
  14.                 End If
  15.             Next m
  16.         Next n
  17.     Next j
  18. Next i
  19. Range("j15").Resize(UBound(cr), 6) = cr
  20. End Sub
复制代码



用VBA数组改写公式查找 不要用find也不要用单元格.rar

13.44 KB, 下载次数: 15

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-5-27 15:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 france723 于 2017-5-27 15:32 编辑

因为按钮位置的影响,br没写CurrentRegion(这样不用确定列数)。调整按钮位置后可以改写br = Range("q9").CurrentRegion.
  1. Sub aaa()
  2. Dim y1, ar, br, i, j, n, m, cr, h
  3. y1 = Range("c65536").End(3).Row
  4. ar = Range("c10:h" & y1)
  5. h = Range("q65536").End(3).Row
  6. br = Range("q9:v" & h)
  7. ReDim cr(1 To UBound(ar), 1 To 6)
  8. For i = 1 To UBound(ar)
  9.     For j = 1 To UBound(ar, 2)
  10.         For n = 1 To UBound(br)
  11.             For m = 1 To UBound(br, 2)
  12.                 If ar(i, j) = br(n, m) Then
  13.                     cr(i, j) = br(n, 1)
  14.                 End If
  15.             Next m
  16.         Next n
  17.     Next j
  18. Next i
  19. Range("j15").Resize(UBound(cr), 6) = cr
  20. End Sub
复制代码



评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-5-27 15:49 | 显示全部楼层
france723 发表于 2017-5-27 15:29
因为按钮位置的影响,br没写CurrentRegion(这样不用确定列数)。调整按钮位置后可以改写br = Range("q9"). ...

小猫高手了
回复

使用道具 举报

 楼主| 发表于 2017-5-27 19:34 | 显示全部楼层
france723 发表于 2017-5-27 15:29
因为按钮位置的影响,br没写CurrentRegion(这样不用确定列数)。调整按钮位置后可以改写br = Range("q9"). ...

VBA数组分别计算交集并集差集

http://www.excelpx.com/thread-430616-1-1.html


回复

使用道具 举报

发表于 2017-5-27 22:12 | 显示全部楼层
数据量越大的情况下,实际上用工作表函数FIND是效率极高的,而且代码简单。
排序、筛选也是同样道理,微软提供了如此高效的功能,没有必要去回避,除非为了学习。
回复

使用道具 举报

 楼主| 发表于 2017-5-27 22:30 | 显示全部楼层
大灰狼1976 发表于 2017-5-27 22:12
数据量越大的情况下,实际上用工作表函数FIND是效率极高的,而且代码简单。
排序、筛选也是同样道理,微软 ...

find读取单元格 超级慢了   一般不可以用
回复

使用道具 举报

发表于 2017-5-27 22:49 | 显示全部楼层
laoau138 发表于 2017-5-27 22:30
find读取单元格 超级慢了   一般不可以用

你试下哪个快,第一个过程是生成虚拟数据用,下面两个是FIND和循环的对比。
不要忘记,大数据时,装入数组也是需要时间的。
回复

使用道具 举报

发表于 2017-5-27 22:49 | 显示全部楼层
  1. Private Sub CommandButton1_Click()
  2. Dim i&, j&, arr(1 To 10000, 1 To 1000)
  3. For i = 1 To 10000
  4.   For j = 1 To 1000
  5.     arr(i, j) = i * j
  6.   Next j
  7. Next i
  8. [a1].Resize(10000, 1000) = arr
  9. End Sub

  10. Private Sub CommandButton2_Click()
  11. Dim rng As Range
  12. t = Timer
  13. Set rng = UsedRange.Find(500000, lookat:=xlWhole)
  14. MsgBox Timer - t
  15. End Sub

  16. Private Sub CommandButton3_Click()
  17. Dim arr, i&, j&
  18. t = Timer
  19. arr = [a1].CurrentRegion

  20. For i = 1 To UBound(arr)
  21.   For j = 1 To UBound(arr, 2)
  22.     If arr(i, j) = 500000 Then GoTo 1
  23.   Next j
  24. Next i
  25. 1
  26. MsgBox Timer - t
  27. End Sub
复制代码

评分

参与人数 2 +17 收起 理由
france723 + 8 很给力
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-5-27 22:56 | 显示全部楼层

菜鸟一个了,你说的没有认真研究过,一般认为find只能对单元格所以超慢
回复

使用道具 举报

发表于 2017-5-27 23:01 | 显示全部楼层
本帖最后由 大灰狼1976 于 2017-5-27 23:03 编辑

个人经验,对单元格区域操作有几个是非常高效的,第1是工作表排序,第2个是自动筛选,FIND反而优势并没有那么明显,但是代码结构会很简单。
如果数据量很大,而代码中只用到1至2次查找的话,建议使用FIND,因为用数组或其他方法的话,每次装入容器也要浪费很多时间,如果代码中频繁使用查找,那么可以设置全局变量,并装入字典,省去每次装入容器及循环的过程,字典的检索是非常高效的。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 04:01 , Processed in 0.396125 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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