ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论]有点难度的汇总

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-12-1 09:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

Type tjx
    name As String
   sd  As Long             '兄地址
   zd As loog           '子地址 

  sum As loog           '求和

End Type

dim arr(1to 100000) as tjx

是否以这种方式构建树形结构库,算法上应该更简单,数组的大小也比较好预估.

TA的精华主题

TA的得分主题

发表于 2007-12-1 10:21 | 显示全部楼层

先处理,最后在排序 一点也不比前面的差,优化一下,还能更快


Sub bbb2()
    Dim D1 As New Dictionary, D2 As New Dictionary
    Dim dr1 As New Dictionary, dr2 As New Dictionary, dr3 As New Dictionary
    Dim xh$, gz$, xhgz$, sl&, zl&, zzl&
    Dim ar()
    t = Timer
    Application.ScreenUpdating = False
    dr2.CompareMode = TextCompare
    dr3.CompareMode = TextCompare
    D1.CompareMode = TextCompare
    D2.CompareMode = TextCompare

    r = Sheet2.[A65536].End(xlUp).Row - 1
    arr = Sheet2.Cells(2, 1).Resize(r, 4)

    For i = 1 To r
        If dr1.Exists(arr(i, 1)) = False Then dr1(arr(i, 1)) = dr1.Count + 1
        s = dr2(arr(i, 2))
        If dr3.Exists(arr(i, 2) & arr(i, 3)) = False Then dr3(arr(i, 2) & arr(i, 3)) = dr3.Count + 1
    Next


    tx = dr2.Count + dr3.Count
    ReDim ar(1 To tx, 1 To 11)
    ReDim ar2(1 To tx, 1 To dr1.Count)


    For i = 1 To r
        xh = arr(i, 2)
        gz = arr(i, 3)
        xhgz = xh & gz
        D2(xh) = D2(xh) + 1    '''''''''''''''''''''''''' 几种型号 每种型号有几台
        If Not D1.Exists(xhgz) Then
            ii = ii + 1    '''''''''''''''''''''''''''''''在报表中的行数
            D1(xhgz) = ii
            ar(ii, 2) = xh
            ar(ii, 3) = gz
        End If
        rr = D1(xhgz)
        yy = dr1(arr(i, 1))
        ar(rr, 4) = ar(rr, 4) + 1
        ar2(rr, yy) = ar2(rr, yy) + 1
    Next i
    Debug.Print "打包时间" & Timer - t

    '    tt = Timer

    trr = dr1.Items
    krr = dr1.Keys

    For i = 1 To ii
        ar(i, 5) = ar(i, 4) / D2(ar(i, 2))
        For jj = 0 To UBound(trr)
            sl = ar2(i, trr(jj))

            If sl > 0 Then
                If sl >= ar(i, 7) Then    ' 前三名,这是最笨的方法
                    ar(i, 10) = ar(i, 8): ar(i, 11) = ar(i, 9)
                    ar(i, 8) = ar(i, 6): ar(i, 9) = ar(i, 7)
                    ar(i, 6) = krr(jj): ar(i, 7) = sl
                ElseIf sl >= ar(i, 9) Then
                    ar(i, 10) = ar(i, 8): ar(i, 11) = ar(i, 9)
                    ar(i, 8) = krr(jj): ar(i, 9) = sl
                ElseIf sl > ar(i, 11) Then
                    ar(i, 10) = krr(jj): ar(i, 11) = sl
                End If
            End If
        Next
    Next

    For i = ii + 1 To tx
        nm = dr2.Keys(i - ii - 1)
        ar(i, 2) = nm & String(20, " ")
        ar(i, 3) = "合计"
        ar(i, 4) = D2(nm)
        ar(i, 5) = "100%"
    Next
        Cells(ii + 3, 1).Resize(tx - ii, 11).Interior.ColorIndex = 43

    Range("a3").Resize(tx, 11) = ar

    Range("a3").Resize(tx, 11).sort Key1:=Range("B3"), Key2:=Range("D3"), Order2:=xlDescending    ', Order2:=xlAscending '
   
    ii = 0
    arr = Range("a3").Resize(tx, 3)
    For i = 1 To tx
        ii = ii + 1
        arr(i, 2) = Replace(arr(i, 2), " ", "")
        arr(i, 1) = ii
        If arr(i, 3) = "合计" Then ii = 0
    Next
    Range("a3").Resize(tx, 3) = arr
    [l1] = Timer - t
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-12-1 10:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

ldy888兄,辛苦了,的确快了很多.

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

ldy888,你好,以下这句还不能理解,

d4(xhgz)(arr(i, 1)) = d4(xhgz)(arr(i, 1)) + 1

从返回的结果来看,好像与s=d4(xhgz)(arr(i, 1))这句差不多.我想肯定是不同的,

是否

不知+1后,若浙江 2 这时的2又储存在哪里?

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

字典套要加油啊!,bbb2()代码,以彭兄59993行数据测试结果如下:

字典套
字典套字典
自定以
自定以数据
排序数组
排序加数组
2.718751.1406251.484375

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

刚才贴错了,字典套速度跟我门的一样了,潜力股啊!!!!

字典套
1.21875
自定以
自定以数据
排序数组
排序加数组
1.1406251.093751.46875

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:37 | 显示全部楼层
QUOTE:
以下是引用tycp在2007-12-1 11:25:45的发言:

字典套要加油啊!,bbb2()代码,以彭兄59993行数据测试结果如下:

字典套
       
字典套字典
自定以
       
自定以数据
排序数组
       
排序加数组
2.718751.1406251.484375

我也用以彭兄59993行数据测试的

bbb2  1.29       自定以数据  1.5    排序加数组  1.28

难道和电脑有关?

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:43 | 显示全部楼层
QUOTE:
以下是引用泓()在2007-12-1 11:09:56的发言:

ldy888,你好,以下这句还不能理解,

d4(xhgz)(arr(i, 1)) = d4(xhgz)(arr(i, 1)) + 1

从返回的结果来看,好像与s=d4(xhgz)(arr(i, 1))这句差不多.我想肯定是不同的,

是否

不知+1后,若浙江 2 这时的2又储存在哪里?

d4(xhgz)(arr(i, 1)) = d4(xhgz)(arr(i, 1)) + 1    '取不重复值  兼 累加

msgbox  d4(xhgz)(arr(i, 1))   ''''''''''''''  =2

s=d4(xhgz)(arr(i, 1))                '''''''''''取不重复值  不 累加

msgbox  d4(xhgz)(arr(i, 1))   ''''''''''''''  =""    空的

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-12-1 11:45 | 显示全部楼层
QUOTE:
以下是引用ldy888在2007-12-1 11:37:31的发言:

我也用以彭兄59993行数据测试的

bbb2  1.29       自定以数据  1.5    排序加数组  1.28

难道和电脑有关?

自定义数据的三维数组,需分配的内存比较大,当电脑内存小时可能会有所影响.

不过字典让ldy888兄提高到如此的速度真是难得啊.

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
字典套的排序用选择排序法的话 速度应该可以在1秒以下!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 10:21 , Processed in 0.032972 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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