Excel精英培训网

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

[已解决]新手求助:数据源大时,运行很慢.求解决办法!

[复制链接]
发表于 2013-4-25 15:01 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-4-25 15:10 | 显示全部楼层
回复

使用道具 举报

发表于 2013-4-25 15:13 | 显示全部楼层
你看下你的循环就知道,如果有两个表各有60000行,那就要循环60000*60000次。
回复

使用道具 举报

 楼主| 发表于 2013-4-25 15:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2013-4-25 15:23 | 显示全部楼层
你先备份表,测试下,看看结果对不。
  1. Sub 查找引用()
  2.     Dim arr1, arr2
  3.     Dim row1 As Long, row2 As Long
  4.     Dim t As Single
  5.     t = Timer
  6.     row1 = Sheets("1").Range("A65536").End(xlUp).Row
  7.     row2 = Sheets("2").Range("A65536").End(xlUp).Row
  8.     arr1 = Sheets("1").Range("a1:m" & row1)
  9.     arr2 = Sheets("2").Range("a1:m" & row2)
  10.    
  11.     For l = 1 To UBound(arr1)
  12.     For m = 1 To UBound(arr2)
  13.         If arr1(l, 1) = arr2(m, 1) Then
  14.             arr2(m, 2) = arr1(l, 2)
  15.         End If
  16.     Next
  17.     Next
  18.     Sheets("2").Resize(UBound(arr2), UBound(arr2, 2)).Value = arr2
  19.     MsgBox "查找完毕" & vbCrLf & _
  20.             "一共用时 " & Timer - t & " 秒"
  21.             
  22. '    For l = 1 To row1
  23. '        For m = 1 To row2
  24. '            If Sheets("1").Range("A" & l) = Sheets("2").Range("A" & m) Then
  25. '                Sheets("2").Range("B" & m) = Sheets("1").Range("B" & l)
  26. '            End If
  27. '        Next m
  28. '    Next l

  29. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-4-25 15:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2013-4-25 15:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2013-4-25 17:37 | 显示全部楼层    本楼为最佳答案   
写漏了,不好意思。
  1. Sub 查找引用()
  2.     Dim arr1, arr2
  3.     Dim row1 As Long, row2 As Long
  4.     Dim t As Single
  5.     Dim l As Long, m As Long

  6.     t = Timer
  7.     row1 = Sheets("1").Range("A65536").End(xlUp).Row
  8.     row2 = Sheets("2").Range("A65536").End(xlUp).Row
  9.     arr1 = Sheets("1").Range("a1:m" & row1)
  10.     arr2 = Sheets("2").Range("a1:m" & row2)
  11.     Dim Temp
  12.     For l = 1 To UBound(arr1)
  13.         Temp = arr1(l, 1)
  14.         For m = 1 To UBound(arr2)
  15.             If Temp = arr2(m, 1) Then
  16.                 arr2(m, 2) = arr1(l, 2)
  17.             End If
  18.         Next
  19.     Next
  20.     Sheets("2").Range("a1").Resize(UBound(arr2), UBound(arr2, 2)).Value = arr2
  21.     MsgBox "查找完毕" & vbCrLf & _
  22.            "一共用时 " & Timer - t & " 秒"

  23.     '    For l = 1 To row1
  24.     '        For m = 1 To row2
  25.     '            If Sheets("1").Range("A" & l) = Sheets("2").Range("A" & m) Then
  26.     '                Sheets("2").Range("B" & m) = Sheets("1").Range("B" & l)
  27.     '            End If
  28.     '        Next m
  29.     '    Next l

  30. End Sub
复制代码
回复

使用道具 举报

发表于 2013-4-25 17:38 | 显示全部楼层
刚回来,想到还是可以优化的,第一层循环可以通过变量,减少读取arr1。
刚好你回贴了。

回复

使用道具 举报

发表于 2013-7-30 22:38 | 显示全部楼层
兰的视频说道要尽量用数组,少调用对象
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 17:26 , Processed in 3.090142 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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