VBA字典计数(split数组)--减少循环次数

有时候,做数据转置的时候,VBA往往粗暴,遍历全部数据,从而使得循环次数增加,减低效率。
应用字典计数,可以精确的计算循环次数,减少不必要的循环次数。
如下图:要将右边的数据放到左边的表格当中。


粗暴的做法:

Sub 秋月()
    Dim arr, brr
    arr = [m1].CurrentRegion '//数据
    brr = [a1].CurrentRegion '//结果
    For i = 2 To UBound(brr) '//遍历结果的数组元素
        For j = 2 To UBound(brr, 2)
            For m = 2 To UBound(arr)   '//遍历数据
                If brr(i, 1) = arr(m, 1) And brr(1, j) = arr(m, 2) Then   '//如果姓名和月份都是对应的
                brr(i, j) = arr(m, 3)   '//输出值
            End If
        Next
    Next
Next
[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub
结果

这样,没有数据的月份也进行了遍历,浪费了计算机资源,可以想办法改进。


改用字典计数方法:

Sub 秋月1()
    Dim arr, brr
    arr = [m1].CurrentRegion '//数据
    brr = [a1].CurrentRegion '//结果
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    
    For i = 2 To UBound(arr)  '//遍历数据
        Key = arr(i, 1) & arr(i, 2)   '//key
        d(Key) = arr(i, 3)                '//查询值
        d(arr(i, 1)) = d(arr(i, 1)) + 1 '//对姓名计数,循环次数
        d1(arr(i, 1) & d(arr(i, 1))) = arr(i, 2)   '//月份
    Next
 
    For i = 2 To UBound(brr)
        For j = 1 To d(brr(i, 1))  '//循环次数,姓名计数,减少循环次数
            C = d1(brr(i, 1) & j)  '//返回月份
            brr(i, C + 1) = d(brr(i, 1) & C) '//查询数据
        Next
    Next
    [a1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

split+数组减少循环次数

Sub 秋月2()
    Dim arr, brr
    arr = [m1].CurrentRegion '//数据
    brr = [a1].CurrentRegion '//结果
    Set d = CreateObject("scripting.dictionary")
    
    For i = 2 To UBound(arr)  '//遍历数据
      d(arr(i, 1) & arr(i, 2)) = arr(i, 3)   '//查询
      d(arr(i, 1)) = d(arr(i, 1)) & "," & arr(i, 2)   '将月份用逗号链接起来
    Next
    
    For i = 2 To UBound(brr)
    s = Split(d(brr(i, 1)), ",")  '//拆解月份,用来遍历
        For j = 1 To UBound(s)  '//循环次数,数组第一个元素为 逗号
            brr(i, s(j) + 1) = d(brr(i, 1) & s(j))  '//查询数据
        Next
    Next
    [a1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

其他写法参考:
http://www.jianshu.com/p/682c30fb033e


以上,纯粹自娱自乐!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,867评论 6 49
  • 循环引用:http://ios.jobbole.com/82077/类别的作用功能:1.扩充现有类的功能2.对现有...
    得一切从简阅读 530评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 什么叫作智慧?对于所缘事物具有观察作用的心所,称为慧。 《广论》中说“于所观事能拣择”,“拣择”有观察及通达两个意...
    风qing扬阅读 798评论 0 0
  • 唐知了是在太原的火车站认识邱夏天的。 她放寒假的时候,年刚过完,还没出正月,学校还没开学,她却呆不住...
    我爱你碎碎念阅读 1,315评论 21 25