Excel精英培训网

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

[VBA] VBA字典改错兼提速

[复制链接]
发表于 2016-9-25 12:47 | 显示全部楼层 |阅读模式


VBA字典改错兼提速

只要不改变单元格S15:S22条件,结果正确U:Z列只有993行

这个字典提速比数组过滤速度快5倍  可惜字典提速有错如何改

数组过滤   
zhjlgaojuan     结果正确U:Z列只有993行

字典提速有错误,如何改
grf1973       结果有点错误U:Z列有1716行,正确结果 U:Z列只有993行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-9-26 20:03 | 显示全部楼层
回复

使用道具 举报

发表于 2016-9-26 20:11 | 显示全部楼层
grf1973 的算法有问题,结果自然不对
回复

使用道具 举报

 楼主| 发表于 2016-9-26 21:06 | 显示全部楼层

有错快点改
回复

使用道具 举报

 楼主| 发表于 2016-9-26 21:07 | 显示全部楼层
pengyx 发表于 2016-9-26 20:11
grf1973 的算法有问题,结果自然不对

错在哪里如何改
回复

使用道具 举报

发表于 2016-9-26 21:22 | 显示全部楼层
是算法有问题,不代码有问题。代码没问题如何改代码。看清楚再提要求
回复

使用道具 举报

发表于 2016-9-26 21:24 | 显示全部楼层
没法改,只有造了重来
回复

使用道具 举报

 楼主| 发表于 2016-9-26 21:27 | 显示全部楼层
pengyx 发表于 2016-9-26 21:24
没法改,只有造了重来

不知道你这两句话的含意
回复

使用道具 举报

发表于 2016-9-27 21:20 | 显示全部楼层
Sub 测试()
Dim arr, ar, br, cr, brr
t = Timer
Sheets("测试").Range("t15:z" & Cells(Rows.Count, 26).End(xlUp).Row) = ""
Set d = CreateObject("scripting.dictionary") '原数据
Set dd = CreateObject("scripting.dictionary") '过滤条件
arr = Sheets("测试").Range("a15:f" & Cells(Rows.Count, 6).End(xlUp).Row)
ar = Application.Transpose(Sheets("测试").Range("s15:s" & Cells(Rows.Count, 19).End(xlUp).Row))
ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
For i = 1 To UBound(arr)
     d.RemoveAll
     m = 0
     For j = 1 To UBound(arr, 2)
         d(CInt(arr(i, j))) = ""
     Next j
     For ii = 1 To UBound(ar)
         dd.RemoveAll
         n = 0
         br = Split(Split(ar(ii), "/")(0), ",")
         cr = Split(Split(ar(ii), "/")(1), "~")
         For k = 0 To UBound(cr)
             dd(CInt(cr(k))) = ""
         Next k
         For iii = 0 To UBound(br)
             If d.exists(CInt(br(iii))) Then
                n = n + 1
                If dd.exists(n) Then
                   m = m + 1
                   GoTo 100
                End If
             Else
                If n = 0 And dd.exists(n) Then
                   m = m + 1
                   GoTo 100
                End If
             End If
         Next iii
         If m <> ii Then GoTo 10
100: Next ii
    If m = UBound(ar) Then
       s = s + 1
       For j = 1 To UBound(arr, 2)
            brr(s, 1) = s
            brr(s, j + 1) = arr(i, j)
       Next j
   End If
10: Next i
MsgBox Timer - t
Sheets("测试").[t15].Resize(s, UBound(brr, 2)) = brr
End Sub
回复

使用道具 举报

发表于 2016-9-27 21:22 | 显示全部楼层
感觉有2275行,楼主可以看看
运行速度在5秒左右
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 20:58 , Processed in 0.309190 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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