Excel精英培训网

 找回密码
 注册
12
返回列表 发新帖
楼主: sliang28

[习题] 【VBA字典数组201301班】课前热身习题四

[复制链接]
发表于 2013-10-25 10:44 | 显示全部楼层
原跟贴有错误
  1. Sub test()
  2.     Dim d1, d2, d3, x As Double
  3.     Dim arr, brr, crr, k As Long
  4.     Set d1 = CreateObject("scripting.dictionary")
  5.     Set d2 = CreateObject("scripting.dictionary")
  6.     Set d3 = CreateObject("scripting.dictionary")
  7.     arr = Range("a3:c" & Range("a" & Cells.Rows.Count).End(xlUp).Row)
  8.     For k = 1 To UBound(arr)
  9.         If d1.Exists(arr(k, 1)) Then
  10.             If arr(k, 2) > d1(arr(k, 1)) Then d1(arr(k, 1)) = arr(k, 2)
  11.         Else
  12.             d1(arr(k, 1)) = arr(k, 2)
  13.         End If
  14.         If d3.Exists(arr(k, 1)) Then d3(arr(k, 1)) = d3(arr(k, 1)) + 1 Else d3(arr(k, 1)) = 1
  15.     Next k
  16.     For k = 1 To UBound(arr)
  17.         If d2.Exists(arr(k, 1)) Then
  18.             x = d1(arr(k, 1)) - arr(k, 2)
  19.             If x <> 0 And x < d2(arr(k, 1)) Then d2(arr(k, 1)) = x
  20.         Else
  21.             d2(arr(k, 1)) = 0
  22.         End If
  23.     Next k
  24.     Range("m3").Resize(d1.Count, 1) = Application.WorksheetFunction.Transpose(d1.keys)
  25.     brr = d1.items
  26.     crr = d2.items
  27.     For k = 1 To d1.Count
  28.         Range("n2").Offset(k, 0) = brr(k - 1) - crr(k - 1)
  29.     Next k
  30.     Range("o3").Resize(d1.Count, 1) = Application.WorksheetFunction.Transpose(d3.items)
  31. End Sub
复制代码

点评

结果有误,请修改  发表于 2013-10-28 15:33
回复

使用道具 举报

发表于 2013-10-25 21:48 | 显示全部楼层
本帖最后由 monicaj 于 2013-10-29 22:49 编辑

请审阅。。。新代码如下:
Sub exe4()
    t = Timer
    Dim arr
    Dim brr(1 To 2000, 1 To 4)
    Dim i As Long, k As Integer, row1 As Integer

    Dim d As New Dictionary
    arr = Range("a2:c" & Range("c1048576").End(xlUp).Row)

    For i = 1 To UBound(arr, 1)
        If d.Exists(arr(i, 1)) = False Then
            k = k + 1
            d(arr(i, 1)) = k
            brr(k, 1) = arr(i, 1)
           brr(k, 2) = arr(i, 2)
            brr(k, 3) = arr(i, 3)
   
        Else
            row1 = d(arr(i, 1))
            brr(row1, 3) = brr(row1, 3) + arr(i, 3)

            If brr(row1, 4) = "" Then
                If arr(i, 2) < brr(row1, 2) Then
                    brr(row1, 4) = brr(row1, 2)
                    brr(row1, 2) = arr(i, 2)
                    
                Else
               
                    brr(row1, 4) = arr(i, 2)
                End If
            Else
                If arr(i, 2) > brr(row1, 4) Then
                    brr(row1, 2) = brr(row1, 4)
                    brr(row1, 4) = arr(i, 2)
                ElseIf arr(i, 2) > brr(row1, 2) Then
                    brr(row1, 2) = arr(i, 2)
                End If
            End If

        End If
    Next
    Range("j2").Resize(UBound(brr), 3) = brr
    MsgBox Timer - t

End Sub

点评

结果正确!速度很快 0.214秒  发表于 2013-10-31 09:44
只提交代码即可,同样的问题,如果第一次装进最大,那么后面将无法取出第二大,请修改后提交。  发表于 2013-10-28 15:42

评分

参与人数 1 +10 金币 +20 收起 理由
sliang28 + 10 + 20 写的很好!

查看全部评分

回复

使用道具 举报

发表于 2013-10-26 11:45 | 显示全部楼层
前几个习题因不会,没做。要开课了,勉强做了习题四。

热身题之汇总取值-ldxhzy.part2.rar

569.87 KB, 下载次数: 2

热身题之汇总取值-ldxhzy.part1.rar

900 KB, 下载次数: 2

点评

下次之贴出代码即可!结果正确,用时7秒,加油!  发表于 2013-10-28 15:46

评分

参与人数 1 +5 金币 +5 收起 理由
sliang28 + 5 + 5 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-10-28 20:20 | 显示全部楼层
本帖最后由 w2001pf 于 2013-10-28 22:48 编辑

这是修改后的。Sub 汇总()    t = Timer
    Application.ScreenUpdating = False
    Dim d As New Dictionary
    Dim d1 As New Dictionary
    Dim d2 As New Dictionary
    Dim d3 As New Dictionary
    Dim d4 As New Dictionary
    With Sheets("Sheet1")
        rowend = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A3:C" & rowend)
    End With
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = d(arr(i, 1)) + 1
        If Not d1.Exists(arr(i, 1)) Then
            d1(arr(i, 1)) = arr(i, 2)
        Else
            If d1(arr(i, 1)) < arr(i, 2) Then d1(arr(i, 1)) = arr(i, 2)
        End If
    Next i
    For i = 1 To UBound(arr)
        If arr(i, 2) <> d1(arr(i, 1)) Then d2(arr(i, 1)) = d2(arr(i, 1)) + 1
    Next i
    For i = 1 To UBound(arr)
        If d2(arr(i, 1)) = 0 Then
            arr(i, 2) = arr(i, 2)
        ElseIf d2(arr(i, 1)) > 0 Then
            If arr(i, 2) = d1(arr(i, 1)) Then
                If Not d4.Exists(arr(i, 1)) Then d4(arr(i, 1)) = "": arr(i, 2) = 0
            End If
        End If
    Next i
    For i = 1 To UBound(arr)
        If d3(arr(i, 1)) < arr(i, 2) Then d3(arr(i, 1)) = arr(i, 2)
    Next i
    ReDim arr1(1 To d.Count, 1 To 3)
    With Sheets("Sheet1")
        .Range("J3").Resize(d.Count, 3) = ""
        .Range("J3").Resize(d.Count) = Application.Transpose(d.Keys)
        .Range("K3").Resize(d.Count) = Application.Transpose(d3.Items)
        .Range("L3").Resize(d.Count) = Application.Transpose(d.Items)
    End With

    MsgBox Timer - t
    Application.ScreenUpdating = True
End Sub

点评

结果正确,0.35秒  发表于 2013-10-29 09:36

评分

参与人数 1 +10 金币 +10 收起 理由
sliang28 + 10 + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-10-28 20:26 | 显示全部楼层
修改后的答案在14楼,请老师指导。




回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 13:17 , Processed in 0.327103 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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