ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3812|回复: 33

急!求VBA数组 字典优化程序(附件运行需40多分钟,还不及Sumif)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-25 17:59 | 显示全部楼层 |阅读模式
多行多列求合:“数据源表“上第6列为组合判断条件,“目标表“上第28列至48列为组合判断条件,不知道如何利用程序组合这些判断条件;目前该表上的简单VBA程序运行时间多达40多分钟,急死人了!苦于不会VBA编程,还请老师帮助解决,谢谢了!!!

求助VBA数组字典优化程序.rar

478.62 KB, 下载次数: 33

TA的精华主题

TA的得分主题

发表于 2014-8-25 19:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 物料用途整理()
    Dim nR1%, nL1%, nR2&, nR%, nL%, nJe, Arr(), Brr()
    Dim ds As Object
    Set ds = CreateObject("Scripting.Dictionary") '创建字典
    With Sheets("目标表")
        nR1 = .Range("b4").End(xlDown).Row
        nL1 = .Range("b4").End(xlToRight).Column
        .Range(.Range("d6"), .Cells(nR1, nL1)).ClearContents
        Arr = .Range(.Range("b4"), .Cells(nR1, nL1)).Value
    End With
    With Sheets("数据源表")
        nR2 = .Range("a3").End(xlDown).Row
        Brr = .Range("b4:e" & nR2).Value
    End With
    For i = 4 To nL1 - 1
        ds(Arr(2, i)) = i
    Next
    For i = 4 To nR1 - 3
        ds(Arr(i, 1) & Arr(i, 2)) = i
    Next
    For i = 1 To nR2 - 3
        nJe = Brr(i, 4)
        nL = ds(Left(Brr(i, 3), 4))
        nR = ds(Brr(i, 1) & Brr(i, 2))
        If nL * nR * nJe <> 0 Then
            Arr(3, 3) = Arr(3, 3) + nJe
            Arr(3, nL) = Arr(3, nL) + nJe
            Arr(nR, nL) = Arr(nR, nL) + nJe
            Arr(nR, 3) = Arr(nR, 3) + nJe
            nR = ds(Brr(i, 1) & "合计")
            If nR > 0 Then
                Arr(nR, nL) = Arr(nR, nL) + nJe
                Arr(nR, 3) = Arr(nR, 3) + nJe
            End If
        End If
    Next
    With Sheets("目标表")
        .Range(.Range("b4"), .Cells(nR1, nL1)).Value = Arr
    End With
End Sub

2841889887_求助VBA数组字典优化程序.rar

279.49 KB, 下载次数: 98

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-25 20:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-25 20:25 | 显示全部楼层
代码:
  1. Sub 目标表()
  2. Dim rg As Range, arr, brr, crr, drr, i As Long, j As Long
  3. Application.ScreenUpdating = False
  4. With Sheets("目标表")
  5. .Range("aa4").Resize(1, 21).ClearContents
  6.     arr = .Range("e4:y4").Value
  7.     brr = .Range("e5:y5").Value
  8.     crr = .Range("b7:b704").Value
  9.     drr = .Range("c7:c704").Value
  10.     For Each rg In .Range("aa4").Resize(1, 21)
  11.         i = i + 1
  12.         rg.Value = arr(1, i)
  13.     Next
  14.     m = .Range("y" & .Rows.Count).End(xlUp).Row - 1
  15.     .Range("aa7:au" & m).ClearContents
  16.     j = 1: i = 0
  17.     For Each rg In .Range("aa7:au" & m)
  18.         If i = 21 Then
  19.           i = 0
  20.           j = j + 1
  21.         End If
  22.         i = i + 1
  23.         If drr(j, 1) <> "合计" Then
  24.            rg.Value = brr(1, i) & crr(j, 1) & drr(j, 1)
  25.         End If
  26.     Next
  27. End With
  28. Application.ScreenUpdating = True
  29. End Sub

  30. Sub 数据源表()
  31. Dim arr, brr(), i As Long, j As Long
  32. Application.ScreenUpdating = False
  33. With Sheets("数据源表")
  34.       arr = .Range("b4:d10000")
  35.       ReDim brr(1 To UBound(arr), 1 To 1)
  36.       For i = 1 To UBound(arr)
  37.           brr(i, 1) = Left(arr(i, 3), 4) & arr(i, 1) & arr(i, 2)
  38.       Next
  39.       .Range("f4:f10000").ClearContents
  40.       .Range("f4:f10000").Value = brr
  41. End With
  42. Application.ScreenUpdating = True
  43. End Sub
复制代码
附件:
求助VBA数组字典优化程序.zip (455.98 KB, 下载次数: 23)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-25 20:28 | 显示全部楼层
完全达到目的,太好了,现运行速度很快,再次谢谢!!!
山菊花老师能出面解决问题,我真是太幸运了,之前多次看到山菊花老师,此次增强努力学习VBA的信心。
对该程序还不了解,还要一点一点学习,逐步理解。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-25 20:34 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-26 10:49 | 显示全部楼层
如果在数据源表上即在“金额”前插入三列,代码又如何修改,还请老师对代码解释一下,谢谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-26 15:13 | 显示全部楼层
自问自答:

如果在数据源表上“金额”列前增加插入三列,则需修改代码如下:
Sub 物料用途整理()
    Dim nR1%, nL1%, nR2&, nR%, nL%, nJe, arr(), brr()
    Dim ds As Object
    Set ds = CreateObject("Scripting.Dictionary") '创建字典
    With Sheets("目标表")
        nR1 = .Range("b4").End(xlDown).Row
        nL1 = .Range("b4").End(xlToRight).Column
        .Range(.Range("d6"), .Cells(nR1, nL1)).ClearContents
        arr = .Range(.Range("b4"), .Cells(nR1, nL1)).Value
    End With
    With Sheets("数据源表")
        nR2 = .Range("a3").End(xlDown).Row
        brr = .Range("b4:h" & nR2).Value
    End With
    For i = 4 To nL1 - 1
        ds(arr(2, i)) = i
    Next
    For i = 4 To nR1 - 3
        ds(arr(i, 1) & arr(i, 2)) = i
    Next
    For i = 1 To nR2 - 3
        nJe = brr(i, 7)
        nL = ds(Left(brr(i, 3), 4))
        nR = ds(brr(i, 1) & brr(i, 2))
        If nL * nR * nJe <> 0 Then
            arr(3, 3) = arr(3, 3) + nJe
            arr(3, nL) = arr(3, nL) + nJe
            arr(nR, nL) = arr(nR, nL) + nJe
            arr(nR, 3) = arr(nR, 3) + nJe
            nR = ds(brr(i, 1) & "合计")
            If nR > 0 Then
                arr(nR, nL) = arr(nR, nL) + nJe
                arr(nR, 3) = arr(nR, 3) + nJe
            End If
        End If
    Next
    With Sheets("目标表")
        .Range(.Range("b4"), .Cells(nR1, nL1)).Value = arr
    End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-26 18:41 | 显示全部楼层
若在“目标表”上C列、D列之间增加九列后,再在“合计”所在和物料1所在列之间增加一列,代码如何修改?请老师帮助解决,谢谢!

TA的精华主题

TA的得分主题

发表于 2014-8-26 20:21 | 显示全部楼层
适合于多条件汇总的例子,速度快。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 09:36 , Processed in 0.046339 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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