Excel精英培训网

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

[已解决][求助]请HYY514老师看看,下标越界了。谢谢蓝桥老师和枯禅老师,第二、按索引导入

[复制链接]
发表于 2010-2-23 07:38 | 显示全部楼层 |阅读模式

fiy DdA4dpKl.rar (71.14 KB, 下载次数: 1)

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2010-2-23 08:13 | 显示全部楼层

find方法会调用单元格对象,所以会比较慢。
回复

使用道具 举报

发表于 2010-2-23 12:01 | 显示全部楼层

回复:(lhj323323)[求助]第二、求按索引导入的更快、...

Sub 定向导入2()
    Dim Sht1 As Worksheet, Sht2 As Worksheet
    Dim arr, arr1, Arr2, t
    Dim Myr1&, Myr2&, h&, k&
    Set Sht1 = Sheets("数据源")
    Set Sht2 = Sheets("结果表")
    t = Timer
    Application.ScreenUpdating = False
    Myr1 = Sht1.Range("a65536").End(xlUp).Row
    Myr2 = Sht2.Range("a65536").End(xlUp).Row
    arr = Sht1.Range("a2:c" & Myr1)
    arr1 = Sht2.Range("a2:c" & Myr2)
    ReDim Arr2(1 To Myr2 - 1, 1 To 2)
    For h = 1 To UBound(arr1)
        For k = 1 To UBound(arr)
            If arr1(h, 1) = arr(k, 1) Then
                Arr2(h, 1) = arr(k, 3) / 10000
                Arr2(h, 2) = arr(k, 3) / 10000 - arr1(h, 3)
                Exit For
            End If
        Next k
    Next h
    Sht2.Range("d2:e" & Myr2).ClearContents
    Sht2.Range("d2:e" & Myr2) = Arr2
    Application.ScreenUpdating = True
    Sheets("操作面").Range("j6") = Timer - t
    MsgBox Timer - t
End Sub
1,声明变量类型用as Long(简写&),适用数据量大的情况;

2,用数组经过优化,只需要0.34秒。

回复

使用道具 举报

 楼主| 发表于 2010-2-23 21:36 | 显示全部楼层

回复:(蓝桥玄霜)回复:(lhj323323)[求助]第二、求...

谢谢蓝桥老师的帮助,

针对定向导入2,经过您的修改,速度由原来的0。64秒,提升为0。23秒,非常感谢

请问:

导入可否用字典的方法?该怎么写?(不过也不一定是字典,因为我孤陋寡闻,只知道还有个字典,我只想收集和比较不同的方法在速度上的优劣)

附上由您修改的VB。

 

IOK9kcuZ.rar (119.43 KB, 下载次数: 2)
回复

使用道具 举报

发表于 2010-2-23 22:00 | 显示全部楼层

字典的好处是 不需要循环来找到符合的类似于单元格的FIND 但是速度非常快 要是没人写 我明天试试 天晚了 睡觉去了

回复

使用道具 举报

 楼主| 发表于 2010-2-24 00:44 | 显示全部楼层

回复:(搁浅2008)字典的好处是 不需要循环来找到符合...

谢谢老师了
[此贴子已经被作者于2010-2-24 0:44:08编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-2-25 07:39 | 显示全部楼层

回复:(lhj323323)回复:(搁浅2008)字典的好处是 ...

求助

回复

使用道具 举报

 楼主| 发表于 2010-2-25 21:05 | 显示全部楼层

回复:(lhj323323)回复:(lhj323323)回复:(搁浅...

快沉了,自顶一下
回复

使用道具 举报

发表于 2010-2-25 21:35 | 显示全部楼层    本楼为最佳答案   

借用上一个代码的部份(加字典方法):本机0.016秒

Sub 定向导入3()
Dim Sht1 As Worksheet, Sht2 As Worksheet
Dim arr, arr1, arr2()
Dim Myr1&, Myr2&, h&, k&
Set d = CreateObject("Scripting.Dictionary")
Set Sht1 = Sheets("数据源")
Set Sht2 = Sheets("结果表")
t = Timer
    Application.ScreenUpdating = False
    Myr1 = Sht1.Range("a65536").End(xlUp).Row
    Myr2 = Sht2.Range("a65536").End(xlUp).Row
    arr = Sht1.Range("a2:c" & Myr1)
    arr1 = Sht2.Range("a2:c" & Myr2)
    ReDim arr2(1 To Myr2 - 1, 1 To 2)
    For h = 1 To UBound(arr)
        d(arr(h, 1)) = arr(h, 3)
    Next
    For k = 1 To UBound(arr1)
        arr2(k, 1) = d(arr1(k, 1)) / 10000
        arr2(k, 2) = d(arr1(k, 1)) / 10000 - arr1(k, 3)
    Next
    Sht2.Range("d2:e" & Myr2).ClearContents
    Sht2.Range("d2:e" & Myr2) = arr2
    Sheets("操作面").Range("j12") = Timer - t
    MsgBox Timer - t
    Application.ScreenUpdating = True
End Sub

DLU7Si5W.rar (119.12 KB, 下载次数: 4)
回复

使用道具 举报

发表于 2010-2-25 21:48 | 显示全部楼层

Sub ff()
Dim Datar As Variant
Dim AsDat As Variant
Dim ReDat() As Double
Dim Dc As Object
Dim i As Long
Dim tmp As Long
Set Dc = CreateObject("scripting.dictionary")
With Sheet3
Datar = .Range(.Range("a2"), .Range("c65536").End(xlUp))
End With
With Sheet2
AsDat = .Range(.Range("a2"), .Range("c65536").End(xlUp))
End With
For i = 1 To UBound(AsDat)
    Dc(AsDat(i, 1)) = i
Next
ReDim ReDat(1 To UBound(Datar), 1 To 2)
For i = 1 To UBound(Datar)
   tmp = Dc(Datar(i, 1))
   'Debug.Print tmp
   ReDat(i, 1) = AsDat(tmp, 3) / 10000
   ReDat(i, 2) = AsDat(tmp, 3) / 10000 - Datar(i, 3)
Next
Sheet3.Range("d2").Resize(UBound(ReDat), 2) = ReDat
MsgBox "ok!"
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 21:35 , Processed in 0.294557 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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