ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论]有点难度的汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:51 | 显示全部楼层

嗯,明白了.

[此贴子已经被作者于2007-12-1 14:42:47编辑过]

TA的精华主题

TA的得分主题

发表于 2007-12-1 11:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我估计你是在运行完排序数组之后再运行自定义的,因为排序数组把数据三重排序了,自定义再运行,速度比运行乱序数据要慢0.5秒!!

TA的精华主题

TA的得分主题

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

自定义的速度估计无法再突破了,字典套还非常有希望,我也决定使用字典来做做这道题!!先看看字典的基础知识!

TA的精华主题

TA的得分主题

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

只能慢慢体会,这样的字典,数组的高超运用,胜读十年书,

建议本帖加精,

这样的帖子,完全可以将一般层次的用户提高一个档次.

TA的精华主题

TA的得分主题

发表于 2007-12-1 12:49 | 显示全部楼层
QUOTE:
以下是引用彭希仁在2007-12-1 9:41:50的发言:

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 13:35 | 显示全部楼层
QUOTE:
Sub xi()
    Dim h As Long
    Dim i As Long
    Dim j As Long
    Dim x As Long
    Dim y As Long
    Dim z As Long
    t = Timer
    r = Sheet2.[A65536].End(xlUp).Row
    Sheet2.Range("a2").Resize(r, 3).sort Key1:=Sheet2.Range("B2"), Key2:=Sheet2.Range("C2"), Key3:=Sheet2.Range("A2")
   
     [p2] = Timer - t
    arr = Sheet2.Cells(1, 1).Resize(r + 2, 4)
     [p3] = Timer - t
    For i = 2 To r                       '为加速做准备
        arr(i, 4) = arr(i, 2) & arr(i, 3)
    Next i
    ReDim arr1(1 To 2000, 1 To 11)
    ReDim arr2(1 To r, 1 To 2) As Long
 [p4] = Timer - t
    For i = 2 To r
        If arr(i, 1) & arr(i, 4) = arr(i - 1, 1) & arr(i - 1, 4) Then            '地区计数
            arr2(x, 2) = arr2(x, 2) + 1
        Else
            x = x + 1
            arr2(x, 1) = i
            arr2(x, 2) = 1
        End If
        jh = jh + 1
        If arr(i, 4) = arr(i - 1, 4) Then               '故障计数
            arr1(y, 4) = arr1(y, 4) + 1
        Else
            y = y + 1
            arr1(y, 2) = arr(i, 2)
            arr1(y, 3) = arr(i, 3)
            arr1(y, 4) = 1
        End If
        If arr(i, 2) <> arr(i + 1, 2) Then            '生成合计
            y = y + 1
            arr1(y, 2) = arr(i, 2)
            arr1(y, 3) = "合计"
            arr1(y, 4) = jh
            jh = 0
        End If
    Next i
    For h = 7 To 11 Step 2
        j = 1
        For i = 1 To y
            If arr1(i, 3) = "合计" Then i = i + 1
            For j = j To x
                If arr(arr2(j, 1), 4) = arr1(i, 2) & arr1(i, 3) And j < x Then
                    If arr2(j, 2) > arr1(i, h) Then            '记录大小和位置
                        arr1(i, h) = arr2(j, 2)
                        arr1(i, h - 1) = j
                    End If
                Else
                    If arr1(i, h) > 0 Then
                        arr2(arr1(i, h - 1), 2) = 0
                        arr1(i, h - 1) = arr(arr2(arr1(i, h - 1), 1), 1)
                    End If
                    Exit For
                End If
            Next j
        Next i
    Next h
QUOTE:
    arr1(1, 1) = 1
    For i = 2 To y
        If arr1(i, 2) = arr1(i - 1, 2) Then
            arr1(i, 1) = arr1(i - 1, 1) + 1
        Else
            arr1(i, 1) = 1
        End If
    Next i
    For i = y To 1 Step -1
        If arr1(i, 3) = "合计" Then x = arr1(i, 4)
        arr1(i, 5) = arr1(i, 4) / x
    Next i
    [p5] = Timer - t
    Cells(3, 1).Resize(y, 11) = arr1
    [p6] = Timer - t
End Sub

0.0625
0.344
0.5
0.75
1.594

arr = Sheet2.Cells(1, 1).Resize(r + 2, 4)    花0.2812秒   0.344-0.625

Cells(3, 1).Resize(y, 11) = arr1 花0.84秒.   1.594-0.75

数组处理部分   花0.4秒                        0.74-0.334

优化空间也只能是这0.4秒,难啊.

[此贴子已经被作者于2007-12-1 14:40:10编辑过]

TA的精华主题

TA的得分主题

发表于 2007-12-1 15:14 | 显示全部楼层

彭兄你没搞错吧,Cells(3, 1).Resize(y, 11) = arr1 花0.84秒

这句要0.8秒吗?

 Worksheets("报表").Range("A3").Resize(pp, 11) = list,跟你一样,也才0.125秒

我看一下,你的EXCEL 乱序数据排序用了0.6秒的时间

TA的精华主题

TA的得分主题

发表于 2007-12-1 15:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
0.546875
0.796875
0.921875
1.25
1.359375
你的代码在我的机子上运行是以上时间!

TA的精华主题

TA的得分主题

发表于 2007-12-1 15:19 | 显示全部楼层

目前最快 不用排序的

8kh9iV4t.rar (236.5 KB, 下载次数: 79)


彭兄的 29000行的 0.56 秒   计算时间 只有 0.18 秒

先创个小记录 先[em02]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-12-1 15:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用tycp在2007-12-1 15:19:33的发言:
0.546875
0.796875
0.921875
1.25
1.359375
你的代码在我的机子上运行是以上时间!

我电脑是N年前的破东西了  256内存,1.2的CPU

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

本版积分规则

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

GMT+8, 2024-11-15 12:59 , Processed in 0.044422 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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