Excel精英培训网

 找回密码
 注册
查看: 4884|回复: 18

[习题] 【字典201201班】A组(A01—A22)第2讲作业上交贴

  [复制链接]
发表于 2012-6-8 21:23 | 显示全部楼层 |阅读模式
本帖最后由 liuguansky 于 2012-6-12 18:29 编辑

注意:
      
1:作业尽量通过自己思考独立完成,不会的可在同学之间私聊讨论,禁止在QQ群公开讨论。
       2:本帖已经设置仅作者可见,作业可以以压缩附件形式或者直接贴代码提交。(压缩文件名格式:第1讲-A01-论坛ID)
       3:非本组学员作业不得交于此处,不得为抢沙发而占位,不得跟灌水帖,违者扣分。
       4:上交作业截止时间:2012年6月12日18:00。
       5:补交作业截止时间:2012年6月13日18:00。(只记考勤,不做批改)

评分

参与人数 1 +18 收起 理由
xdwy81129 + 18 赞一个!

查看全部评分

发表于 2012-6-8 22:26 | 显示全部楼层
第2讲-A04-tt25360505 上交作业
  1. Sub aa()    '作业代码写在该模块

  2.     Dim d1 As Object, d2 As Object, arr, brr, i%, j%, crr(), t, K, L%
  3.     Set d1 = CreateObject("SCRIPTING.DICTIONARY")
  4.     arr = [E2:F6]
  5.     For i = 1 To UBound(arr)
  6.         d1(arr(i, 1)) = arr(i, 2)
  7.     Next i
  8.     Set d2 = CreateObject("SCRIPTING.DICTIONARY")
  9.     brr = Range("A2", [C65536].End(3))
  10.     For j = 1 To UBound(brr)
  11.         d2(Month(brr(j, 1)) & "月," & brr(j, 2)) = d2(Month(brr(j, 1)) & "月," & brr(j, 2)) + brr(j, 3) * d1(brr(j, 2))
  12.     Next j
  13.     t = d2.Keys: K = d2.Items
  14.     ReDim crr(0 To d2.Count - 1, 1 To 3)
  15.     For L = 0 To UBound(t)
  16.         crr(L, 1) = Split(t(L), ",")(0)
  17.         crr(L, 2) = Split(t(L), ",")(1)
  18.         crr(L, 3) = K(L)
  19.     Next L
  20.     Range("H2").Resize(UBound(t) + 1, 3) = crr
  21.     Set d1 = Nothing: Set d2 = Nothing
  22. End Sub
复制代码

评分

参与人数 1 +10 收起 理由
liuguansky + 10 OK

查看全部评分

回复

使用道具 举报

发表于 2012-6-8 23:23 | 显示全部楼层
本帖最后由 byhdch 于 2012-6-8 23:27 编辑
  1. Sub aa()
  2.     Dim d As New Dictionary
  3.     Dim i, j, k, x, y As Long
  4.     Dim arr1, arr2, arr3(1 To 1000, 1 To 1), arr4, arr5
  5.     arr1 = Range("B2:C" & Range("C65536").End(xlUp).Row)
  6.     arr2 = Range("E2:F" & Range("F65536").End(xlUp).Row)
  7.     For i = 1 To UBound(arr1)
  8.         For j = 1 To UBound(arr2)
  9.             If arr1(i, 1) = arr2(j, 1) Then
  10.                 k = k + 1
  11.                 arr3(k, 1) = arr1(i, 2) * arr2(j, 2)
  12.             End If
  13.         Next j
  14.     Next i
  15.     arr4 = Range("A2:C" & Range("A65536").End(xlUp).Row)
  16.     For x = 1 To UBound(arr4)
  17.         d(VBA.Month(arr4(x, 1)) & "月" & "|" & arr4(x, 2)) = d(VBA.Month(arr4(x, 1)) & "月" & "|" & arr4(x, 2)) + arr3(x, 1)
  18.     Next x
  19.     ReDim arr5(d.Count - 1, 1 To 3)
  20.     For y = 0 To d.Count - 1
  21.         arr5(y, 1) = Split(d.Keys(y), "|")(0)
  22.         arr5(y, 2) = Split(d.Keys(y), "|")(1)
  23.         arr5(y, 3) = d.Items(y)
  24.     Next y
  25.     Range("H2:J50").ClearContents
  26.     Range("H2").Resize(d.Count, 3) = arr5
  27. End Sub
复制代码

第2讲-A20-byhdch.rar (32.04 KB, 下载次数: 6)

点评

先循环获取金额,对品种不多的时候,也不失为一个好的方法,不过在源数据上就循环了两次,可以把源数据的两次循环合并为一次  发表于 2012-6-12 09:35

评分

参与人数 1 +8 收起 理由
liuguansky + 8 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 11:31 | 显示全部楼层
  1. Sub aa()    '作业代码写在该模块
  2. Dim i, j, k As Long
  3. Dim mon As Integer
  4. Dim d1 As New Dictionary
  5. Dim d2 As New Dictionary
  6. Dim arr As Variant
  7. Dim list(1 To 60, 1 To 3) As Variant
  8. arr = [A2:C111]
  9. k = 1

  10. For j = 2 To 6
  11.     d1(Cells(j, 5).Value) = Cells(j, 6).Value
  12. Next

  13. For i = 1 To 110
  14.     If d2.Exists(Month(arr(i, 1)) & arr(i, 2)) Then
  15.         d2(Month(arr(i, 1)) & arr(i, 2)) = d2(Month(arr(i, 1)) & arr(i, 2)) + arr(i, 3) * d1(arr(i, 2))
  16.     Else
  17.         d2(Month(arr(i, 1)) & arr(i, 2)) = arr(i, 3) * d1(arr(i, 2))
  18.         list(k, 1) = Month(arr(i, 1)) & "月"
  19.         list(k, 2) = arr(i, 2)
  20.         k = k + 1
  21.     End If
  22. Next
  23.    
  24. For i = 1 To k - 1
  25.     list(i, 3) = d2(Left(list(i, 1), Len(list(i, 1)) - 1) & list(i, 2))
  26. Next

  27. [H2].Resize(UBound(list), 3) = list

  28. End Sub
复制代码

第2讲-A17-sliang28.xls

74 KB, 下载次数: 4

点评

品种的字典添加建议也用数组吧。  发表于 2012-6-12 09:38

评分

参与人数 1 +8 收起 理由
liuguansky + 8 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 14:40 | 显示全部楼层
请阅附件和下载附件测试代码,谢谢!
  1. Option Explicit '强制定义变量
  2. Sub test()
  3.     Dim arr '定义数组变量 arr
  4.     Dim brr '定义数组变量 brr
  5.     Dim i As Byte  '定义变量 i 为 Byte
  6.     Dim x As Byte  '定义变量 x 为 Byte
  7.     Dim d As New Dictionary '定义变量d为字典
  8.     Dim 单价, 月份 As String
  9.     Range("H2:J48").Clear '先清空单元格
  10.     arr = Sheets("Sheet1").[A1].CurrentRegion
  11.     For i = 2 To UBound(arr, 1)
  12.         月份 = Month(arr(i, 1)) & "月" '取得月份
  13.         '取得单价
  14.         If arr(i, 2) = Range("E2") Then
  15.             单价 = Range("F2")
  16.         ElseIf arr(i, 2) = Range("E3") Then
  17.             单价 = Range("F3")
  18.         ElseIf arr(i, 2) = Range("E4") Then
  19.             单价 = Range("F4")
  20.         ElseIf arr(i, 2) = Range("E5") Then
  21.             单价 = Range("F5")
  22.         ElseIf arr(i, 2) = Range("E6") Then
  23.             单价 = Range("F6")
  24.         End If
  25.         '字典加载数据,进行汇总
  26.         d(月份 & "|" & Cells(i, 2)) = d(月份 & "|" & Cells(i, 2)) + Cells(i, 3) * 单价
  27.     Next i
  28.     ReDim brr(d.Count, 1 To 3)
  29.     For x = 0 To d.Count - 1
  30.         brr(x, 1) = Split(d.Keys(x), "|")(0)
  31.         brr(x, 2) = Split(d.Keys(x), "|")(1)
  32.         brr(x, 3) = d.Items(x)
  33.     Next x
  34.     Range("H2").Resize(d.Count, 3) = brr
  35. End Sub
复制代码

第2讲-A16-替伏影子.rar

30.87 KB, 下载次数: 4

点评

全单元格循环。品种单价判断用的多结构IF语句  发表于 2012-6-12 09:39

评分

参与人数 1 +7 收起 理由
liuguansky + 7 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 15:49 | 显示全部楼层
Sub aa()    '作业代码写在该模块
  Dim d As New Dictionary
  Dim i As Integer, j As Integer, str As String, arr, brr(0 To 110, 1 To 3)
  arr = Range("a2:c111")
  For i = 1 To 110
    str = Month(arr(i, 1)) & "|" & arr(i, 2)
    d(str) = d(str) + arr(i, 3) * Application.WorksheetFunction.VLookup(arr(i, 2), Range("e2:f6"), 2, 0)
  Next i
For j = 0 To d.Count - 1
    brr(j, 1) = Split(d.Keys(j), "|")(0)
    brr(j, 2) = Split(d.Keys(j), "|")(1)
    brr(j, 3) = d.Items(j)
  Next j
  Range("h2").Resize(d.Count, 3) = brr
End Sub

第二讲-A06-wangfengren.rar

30.12 KB, 下载次数: 4

点评

代码中好像未看到字典对象,引用了工作表函数,有违出题初衷  发表于 2012-6-12 09:40

评分

参与人数 1 +5 收起 理由
liuguansky + 5 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 19:47 | 显示全部楼层
本帖最后由 0Mouse 于 2012-6-9 19:49 编辑

第2讲-A21-0Mouse,有劳吴姐!

  1. Sub aa()
  2.     Dim arr, brr, d1 As Object, d2 As Object, i%, j%, crr, drr, err, k%
  3.     With Sheet1
  4.         arr = .Range("E2:F" & .Range("E2").End(xlDown).Row)
  5.         brr = .Range("A2:C" & .Cells(Rows.Count, 1).End(xlUp).Row)
  6.     End With
  7.     Set d1 = CreateObject("scripting.dictionary")
  8.     Set d2 = CreateObject("scripting.dictionary")
  9.     For i = 1 To UBound(arr)
  10.         d1(arr(i, 1)) = arr(i, 2)
  11.     Next
  12.     ReDim crr(1 To UBound(brr), 1 To 3)
  13.     For j = 1 To UBound(brr)
  14.         d2(Month(brr(j, 1)) & vbTab & brr(j, 2)) = d2(Month(brr(j, 1)) & vbTab & brr(j, 2)) + brr(j, 3) * d1(brr(j, 2))
  15.     Next
  16.     crr = d2.Keys
  17.     drr = d2.Items
  18.     ReDim err(1 To d2.Count, 1 To 3)
  19.     For k = 1 To d2.Count
  20.         err(k, 1) = Split(crr(k - 1), vbTab)(0) & "ÔÂ"
  21.         err(k, 2) = Split(crr(k - 1), vbTab)(1)
  22.         err(k, 3) = drr(k - 1)
  23.     Next
  24.     Sheet1.Range("H2:J" & Rows.Count - 1).ClearContents
  25.     Sheet1.Range("H2").Resize(d2.Count, 3) = err
  26.     Set d1 = Nothing: Set d2 = Nothing
  27.     Erase arr: Erase brr: Erase crr: Erase drr: Erase err
  28. End Sub
复制代码

  1. Sub bb()
  2.     Dim arr, brr, d1 As Object, d2 As Object, i%, j%, crr
  3.     With Sheet1
  4.         arr = .Range("E2:F" & .Range("E2").End(xlDown).Row)
  5.         brr = .Range("A2:C" & .Cells(Rows.Count, 1).End(xlUp).Row)
  6.     End With
  7.     Set d1 = CreateObject("scripting.dictionary")
  8.     Set d2 = CreateObject("scripting.dictionary")
  9.     For i = 1 To UBound(arr)
  10.         d1(arr(i, 1)) = arr(i, 2)
  11.     Next
  12.     ReDim crr(1 To UBound(brr), 1 To 3)
  13.     For j = 1 To UBound(brr)
  14.         If Not d2.Exists(Month(brr(j, 1)) & vbTab & brr(j, 2)) Then
  15.             d2.Add Month(brr(j, 1)) & vbTab & brr(j, 2), d2.Count + 1
  16.         End If
  17.         crr(d2(Month(brr(j, 1)) & vbTab & brr(j, 2)), 1) = Month(brr(j, 1)) & "月"
  18.         crr(d2(Month(brr(j, 1)) & vbTab & brr(j, 2)), 2) = brr(j, 2)
  19.         crr(d2(Month(brr(j, 1)) & vbTab & brr(j, 2)), 3) = crr(d2(Month(brr(j, 1)) & vbTab & brr(j, 2)), 3) + brr(j, 3) * d1(brr(j, 2))
  20.     Next
  21.     Sheet1.Range("H2:J" & Rows.Count - 1).ClearContents
  22.     Sheet1.Range("H2").Resize(d2.Count, 3) = crr
  23.     Set d1 = Nothing: Set d2 = Nothing
  24.     Erase arr: Erase brr: Erase crr
  25. End Sub
复制代码
答卷: 第2讲-A21-0Mouse.rar (33.14 KB, 下载次数: 18)

点评

方法2的思想很好,建议在引用长而复杂的计算段的时候,可以赋值给变量后,以后引用:简洁而有效。  发表于 2012-6-12 09:31

评分

参与人数 1 +12 收起 理由
liuguansky + 12 10+2

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 20:53 | 显示全部楼层
201201字典班第二讲作业.xls (63 KB, 下载次数: 12)

点评

思路不错,不足处,请看其他点评  发表于 2012-6-12 09:42

评分

参与人数 1 +10 收起 理由
liuguansky + 10

查看全部评分

回复

使用道具 举报

发表于 2012-6-9 21:16 | 显示全部楼层
蹭网交作业!请老师批改!

第2讲-A03-ldxhzy.zip

35.27 KB, 下载次数: 13

点评

能设置变量,不错。  发表于 2012-6-12 09:45

评分

参与人数 1 +10 收起 理由
liuguansky + 10

查看全部评分

回复

使用道具 举报

发表于 2012-6-10 09:13 | 显示全部楼层
第二讲-A14-sgyzzz.rar (31.61 KB, 下载次数: 9)

点评

先汇总的数量,与题意不符  发表于 2012-6-12 13:08

评分

参与人数 1 +4 收起 理由
liuguansky + 4

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 01:39 , Processed in 0.374927 second(s), 24 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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