Excel精英培训网

 找回密码
 注册
查看: 6420|回复: 11

[通知] 【VBA字典数组201301班】A组-第五讲作业上交贴

[复制链接]
发表于 2013-12-9 13:44 | 显示全部楼层 |阅读模式
本帖最后由 cloud-sj 于 2013-12-18 09:56 编辑

作业要求:
    1.要求使用字典完成
    2.所有的代码均写在按钮指定的过程中
    3.要求代码缩进
    4.要求有注释(关键代码处)
    5.要求强制声明


3-5要求一共占6分,每点2分,2道题最多扣6分
作业上交截止时间:2013年12月11日  20:00

发表于 2013-12-9 15:21 | 显示全部楼层
上交作业了。
请学委批改。
谢谢~~

A07-E界白菜-第五讲作业.rar

43.22 KB, 下载次数: 34

点评

第二题知道笨办法还用这方式,还不如直接先赋值然后用工作表函数,你这定位写法欠通用性,附加题未做 第三题未做  发表于 2013-12-10 21:55

评分

参与人数 1金币 +7 收起 理由
cloud-sj + 7 都是烟花造的孽

查看全部评分

回复

使用道具 举报

发表于 2013-12-9 15:54 | 显示全部楼层
Sub 作业一()
Dim arr, arr1, arr2, d, d1, d2, i, n, x, y, z, k, t
Set d = CreateObject("scripting.dictionary")
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
arr = Range("a2:c111")
For i = LBound(arr) To UBound(arr)
    d(arr(i, 1) & arr(i, 2)) = d(arr(i, 1) & arr(i, 2)) + arr(i, 3)
    d1(arr(i, 1)) = ""
    d2(arr(i, 2)) = ""
Next
Range("g1").Resize(1, d2.Count) = d2.keys
Range("f2").Resize(d1.Count, 1) = Application.Transpose(d1.keys)
k = d.keys
t = d.items
ReDim arr1(1 To d1.Count, 1 To d2.Count)
arr2 = Range("f1").CurrentRegion
Stop
For n = 0 To UBound(k)
    For x = 2 To UBound(arr2)
        If InStr(k(n), arr2(x, 1)) Then
        Debug.Print k(n)
        Debug.Print arr2(x, 1)
        y = x - 1
            For z = 2 To UBound(arr2, 2)
                If InStr(k(n), arr2(1, z)) Then
                    arr1(y, z - 1) = arr1(y, z - 1) + t(n)
                End If
            Next z
        End If
    Next x
Next n
Stop
Range("l2").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
Set arr = Nothing
Set arr1 = Nothing
Set arr2 = Nothing
Set d = Nothing
Set d1 = Nothing
Set d2 = Nothing
Set k = Nothing
Set t = Nothing
End Sub

Sub 作业二()
Dim d, d1, f, g, h, i, j, x, y, z, arr2, arr1, arr, k, t
Set d = CreateObject("scripting.dictionary")
Set d1 = CreateObject("scripting.dictionary")
arr = Range("a2:d111")
For i = LBound(arr) To UBound(arr)
    d(arr(i, 2) & Month(arr(i, 1)) & "月" & arr(i, 3)) = d(arr(i, 2) & Month(arr(i, 1)) & "月" & arr(i, 3)) + arr(i, 4)
    d1(arr(i, 2)) = ""
Next
Range("f3").Resize(d1.Count) = Application.Transpose(d1.keys)
k = d.keys
t = d.items
arr2 = Range("f1:bc13")
ReDim arr1(1 To UBound(arr2), 1 To UBound(arr2, 2))
For x = 3 To UBound(arr2)
    For y = 2 To 50 Step 4
        For z = y To 50
            If arr2(2, z) = "小计" Then
                For f = 1 To 11
                    arr1(f, z - 1) = arr1(f, z - 2) + arr1(f, z - 3) + arr1(f, z - 4)
                Next
                GoTo 100
            End If
                    For j = LBound(k) To UBound(k)
                        If InStr(k(j), arr2(x, 1) & arr2(1, y) & arr2(2, z)) Then
                            arr1(x - 2, z - 1) = arr1(x - 2, z - 1) + t(j)
                        End If
                    Next
        Next
100:
    Next
Next
For g = 1 To 11
    For h = 4 To 48 Step 4
        arr1(g, 49) = arr1(g, 49) + arr1(g, h)
    Next
Next
Range("g3").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
Set d = Nothing
Set d1 = Nothing
Set arr = Nothing
Set arr1 = Nothing
Set arr2 = Nothing
End Sub

Sub 作业二附加题()
Dim d, d1, f, g, h, i, j, x, y, z, arr2, arr1, arr, k, t, a, b, c, e, ar, ar1, rng
Set d = CreateObject("scripting.dictionary")
Set d1 = CreateObject("scripting.dictionary")
arr = Range("a2:d111")
ar = Array("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月")
ar1 = Array("草莓", "苹果", "葡萄", "小计")
b = 0
e = 7
For a = 7 To 52 Step 4
    Cells(1, a) = ar(b)
    b = b + 1
    If Cells(1, a + 3) = "" Then
            Range(Cells(1, a), Cells(1, a + 3)).Merge
            Cells(1, a).HorizontalAlignment = Excel.xlCenter
            End If
    For c = LBound(ar1) To UBound(ar1)
        Cells(2, e) = ar1(c)
        e = e + 1
        
    Next
Next
Cells(1, 6) = "省份"
Range(Cells(1, 6), Cells(2, 6)).Merge
Cells(1, 6).HorizontalAlignment = Excel.xlCenter
Cells(1, 55) = "合计"
Range(Cells(1, 55), Cells(2, 55)).Merge
Cells(1, 55).HorizontalAlignment = Excel.xlCenter
Range("f1:bc2").Interior.ColorIndex = 40
Range("f1:f13").Interior.ColorIndex = 40

For i = LBound(arr) To UBound(arr)
    d(arr(i, 2) & Month(arr(i, 1)) & "月" & arr(i, 3)) = d(arr(i, 2) & Month(arr(i, 1)) & "月" & arr(i, 3)) + arr(i, 4)
    d1(arr(i, 2)) = ""
Next
Range("f3").Resize(d1.Count) = Application.Transpose(d1.keys)
k = d.keys
t = d.items
arr2 = Range("f1:bc13")
ReDim arr1(1 To UBound(arr2), 1 To UBound(arr2, 2))
For x = 3 To UBound(arr2)
    For y = 2 To 50 Step 4
        For z = y To 50
            If arr2(2, z) = "小计" Then
        
                For f = 1 To 11
                    arr1(f, z - 1) = arr1(f, z - 2) + arr1(f, z - 3) + arr1(f, z - 4)
                Next
               GoTo 100
            End If
         
                    For j = LBound(k) To UBound(k)
                        If InStr(k(j), arr2(x, 1) & arr2(1, y) & arr2(2, z)) Then
                            arr1(x - 2, z - 1) = arr1(x - 2, z - 1) + t(j)
                        End If
                    Next
        Next
100:
    Next
Next
For g = 1 To 11
    Debug.Print arr1(g, 49)
    For h = 4 To 48 Step 4
        arr1(g, 49) = arr1(g, 49) + arr1(g, h)
    Next
Next
Range("g3").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
Range("f1:bc13").Borders.LineStyle = 1
Set d = Nothing
Set d1 = Nothing
Set ar = Nothing
Set ar1 = Nothing
Set arr = Nothing
Set arr1 = Nothing
Set arr2 = Nothing
End Sub

点评

木有注释 第一题SUM(STOP,ERROR)定义5列数组代码出现第六列,不得分 第三题未做  发表于 2013-12-10 22:17

评分

参与人数 1金币 +8 收起 理由
cloud-sj + 8 山寨

查看全部评分

回复

使用道具 举报

发表于 2013-12-9 16:22 | 显示全部楼层
【VBA字典数组201301班】-A10-木牙水.rar (44.49 KB, 下载次数: 25)

点评

第二题 建议在代码运行时把产品连成字符串作为InStr里的部分,附加题未做 第三题未做  发表于 2013-12-10 22:48

评分

参与人数 1金币 +8 收起 理由
cloud-sj + 8 淡定

查看全部评分

回复

使用道具 举报

发表于 2013-12-9 17:51 | 显示全部楼层

本帖最后由 午夜洗衣机 于 2013-12-10 11:50 编辑

作业3好坑啊,居然跟IE版本都有关

  1. Option Explicit

  2. Sub 作业1()
  3. Dim dq As New Dictionary
  4. Dim pz As New Dictionary
  5. Dim d As New Dictionary
  6. Dim arr, brr()
  7. Dim i, j As Long
  8. Dim str As String

  9. arr = Range("a1").CurrentRegion.Value

  10. For i = 2 To UBound(arr)
  11. pz(arr(i, 2)) = "" '字典pz:品种
  12. Next

  13. For i = 2 To UBound(arr)

  14. If Not dq.Exists(str) Then dq(arr(i, 1)) = "" '地区
  15. str = arr(i, 1) & "|" & arr(i, 2) '临时变量,将地区和品种相连作为关键字
  16. d(str) = d(str) + arr(i, 3)
  17. '地区+品种=数量汇总
  18. Next

  19. If dq.Count = 0 Then Exit Sub

  20. ReDim brr(1 To dq.Count, 1 To pz.Count + 1) '重定义数组的大小
  21. arr = dq.Keys
  22. For i = 1 To dq.Count '行循环
  23. brr(i, 1) = arr(i - 1) '第一列:地区
  24. For j = 2 To pz.Count + 1
  25. str = arr(i - 1) & "|" & pz.Keys(j - 2)
  26. If d.Exists(str) Then brr(i, j) = d(str)
  27. Next
  28. Next

  29. Range("g1").Resize(, pz.Count) = pz.Keys
  30. Range("f2").Resize(i - 1, pz.Count + 1) = brr
  31. End Sub




  32. Sub 作业2()
  33. Dim dq As New Dictionary
  34. Dim pz As New Dictionary
  35. Dim d As New Dictionary
  36. Dim arr, brr(), k
  37. Dim x, i, j As Long
  38. Dim str, sr As String

  39. arr = Range("G2:J2").Value

  40. '以下是列标题做关键字的字典
  41. For x = 1 To 12
  42. For i = 1 To 4 '内循环
  43. str = x & "月" & "|" & arr(1, i) '月份加品种
  44. j = j + 1 '列标
  45. pz(str) = j
  46. Next
  47. Next
  48. arr = Range("a1").CurrentRegion.Value

  49. '以下是做了两个字典,一个是数量汇总,一个是取地区名称
  50. For i = 2 To UBound(arr)
  51. If Not dq.Exists(arr(i, 2)) Then dq(arr(i, 2)) = ""
  52. sr = arr(i, 2) & "|" & Month(arr(i, 1)) & "月" & "|" & arr(i, 3) '地区+月份+品种
  53. str = arr(i, 2) & "|" & Month(arr(i, 1)) & "月" & "|" & "小计" '地区+月份+小计

  54. d(sr) = d(sr) + arr(i, 4)
  55. d(str) = d(str) + arr(i, 4) '在字典里加入小计作为keys,相同的地区+月份汇总
  56. d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 4) '按地区总计


  57. Next

  58. ReDim brr(1 To dq.Count, 1 To pz.Count + 2) '调整动态数组大小

  59. k = dq.Keys '地区关键字

  60. On Error Resume Next '如果错误执行下一句 因为数据源没有12月数据,如果没有这句会报错

  61. '以下是进行收据透视表式排列
  62. For i = 1 To dq.Count '行循环
  63. brr(i, 1) = k(i - 1) '第1列:地区
  64. brr(i, 50) = d(k(i - 1)) '填入总计数量
  65. For j = 2 To pz.Count
  66. sr = k(i - 1) & "|" & pz.Keys(j - 2) '地区+日期+品种
  67. If d.Exists(sr) Then
  68. brr(i, j) = d(sr)
  69. End If
  70. Next
  71. Next

  72. If Range("f3") <> "" Then Range("f3:bc" & Cells(Rows.Count, 6).End(xlUp).row).ClearContents
  73. '如果第3行不为空才执行删除命令,以免误删标题行

  74. Range("f3").Resize(dq.Count, pz.Count + 2) = brr
  75. MsgBox "汇总完成!"

  76. End Sub



  77. Sub 作业3批量发贴()
  78. '批量发帖
  79. Dim ie As New InternetExplorer '创建一个IE对象
  80. Dim arr
  81. Dim i As Integer
  82. Dim t As Long

  83. arr = Range("a2:b4")
  84. For i = 1 To UBound(arr)
  85. With ie
  86. .Navigate "http://www.excelpx.com/forum.php?mod=post&action=newthread&fid=99"
  87. 'Navigate方法,可以打开指定的网页:精英聊天室->发起帖子

  88. .Visible = True '打开后要显示网页
  89. Do Until ie.ReadyState = READYSTATE_COMPLETE '如果IE加载宏完成
  90. 'DoEvents '在窗体加载时转交操作权
  91. Loop
  92. ' .Document.getElementById("typeid").Value = 242 '选择主题分类为"文字",IE10用这一行
  93. .Document.getElementById("typeid_ctrl_menu").All.tags("li")(5).Click '选择主题分类为"活动",IE8要用这一行
  94. .Document.All("subject").Value = arr(i, 1)
  95. .Document.All("message").Value = arr(i, 2)
  96. .Document.Forms(1).submit '网页中第2个表格,第1个是Forms(0)
  97. End With
  98. Application.Wait (Now + TimeValue("00:00:20")) '论坛有发贴时间间隔设置,延时20秒
  99. Next

  100. ie.Quit '关闭网页.
  101. Set ie = Nothing

  102. End Sub
复制代码

点评

第三题 代码中缺少了登陆部分  发表于 2013-12-12 15:40

评分

参与人数 2 +21 金币 +18 收起 理由
CheryBTL + 21 很给力!
cloud-sj + 18 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-12-10 12:10 | 显示全部楼层
本帖最后由 CheryBTL 于 2013-12-10 20:15 编辑
  1. Sub 作业一CheryBTL()
  2.     Dim ar, re
  3.     Dim i As Long, R As Integer, C As Integer
  4.     Dim Rcnt As Integer, Ccnt As Integer
  5.     Dim dR As Object, dC As Object '//定义字典dR为行标,dC为列标
  6.     Set dR = CreateObject("scripting.dictionary")
  7.     Set dC = CreateObject("scripting.dictionary")
  8.     ar = Sheets("作业一").Range("a1").CurrentRegion '//将源数据赋值给数组ar
  9.     ReDim re(1 To 50, 1 To 30)
  10.     If Not IsArray(ar) Then
  11.         MsgBox "数据不符合要求" '//若源数据为非数组,则退出代码
  12.         Exit Sub
  13.     End If
  14.     For i = 2 To UBound(ar)
  15.         If Not dR.exists(ar(i, 1)) Then
  16.             '//对地区按出现顺序编号放入字典dR中,其对应的Item为出现的顺序数,即行标
  17.             Rcnt = Rcnt + 1
  18.             dR(ar(i, 1)) = Rcnt
  19.         End If
  20.         If Not dC.exists(ar(i, 2)) Then
  21.             '//对品种按出现顺序编号放入字典dR中,其对应的Item为出现的顺序数,即列标
  22.             Ccnt = Ccnt + 1
  23.             dC(ar(i, 2)) = Ccnt
  24.         End If
  25.         R = dR(ar(i, 1)) '//提取行标
  26.         C = dC(ar(i, 2)) '//提取列标
  27.         re(R, C) = re(R, C) + ar(i, 3) '//对应的结果数据累加
  28.     Next i
  29.     With Sheets("作业一")
  30.         .[f2].Resize(dR.Count) = Application.Transpose(dR.keys) '//输出地区
  31.         .[g1].Resize(1, dC.Count) = (dC.keys)                   '//输出品种
  32.         .[g2].Resize(UBound(re), UBound(re, 2)) = re            '//输出累计数量
  33.     End With
  34. End Sub
复制代码
  1. Sub 作业二CheryBTL()
  2.     Dim ar, re, temp
  3.     Dim i As Long, j As Long, k As Long, R As Integer, C As Integer
  4.     Dim Cnt As Integer, M As Integer, Cnt2 As Integer
  5.     Dim d1 As Object, d2 As Object
  6.     Set d1 = CreateObject("scripting.dictionary")
  7.     Set d2 = CreateObject("scripting.dictionary")
  8.         '//d1为地区的不重复清单及对应的顺序,即行标
  9.         '//d2为品种对应的不重复清单及对应的顺序,即列标(需再加上月份的信息)
  10.     ar = Sheets("作业二").Range("a1").CurrentRegion '//源数据赋值给数组ar
  11.     ReDim re(1 To 31, 1 To 49)  '//根据结果数组的区域,重定义结果数组
  12.     For i = 2 To UBound(ar)
  13.         If Not d2.exists(ar(i, 3)) Then
  14.             '//对品种按出现顺序编号放入字典dR中,其对应的Item为出现的顺序数,即列标
  15.             Cnt2 = Cnt2 + 1
  16.             d2(ar(i, 3)) = Cnt2
  17.         End If
  18.     Next i
  19.     For i = 2 To UBound(ar)
  20.         If Not d1.exists(ar(i, 2)) Then
  21.             '//对地区按出现顺序编号放入字典dR中,其对应的Item为出现的顺序数,即行标
  22.             Cnt = Cnt + 1
  23.             d1(ar(i, 2)) = Cnt
  24.         End If
  25.         M = Month(ar(i, 1)) * 4 - 4 '//月份信息
  26.         R = d1(ar(i, 2))        '//行标
  27.         C = d2(ar(i, 3)) + M    '//列标
  28.         re(R, C) = re(R, C) + ar(i, 4) '//对应品种对应月份累计
  29.         re(R, M + 4) = re(R, M + 4) + ar(i, 4) '//对应地区对应月份累计
  30.         re(R, 49) = re(R, 49) + ar(i, 4) '//对应地区累计
  31.     Next
  32.     With Sheets("作业二")
  33.         .Range("F3:BC50").ClearContents
  34.         .[f3].Resize(d1.Count) = Application.Transpose(d1.keys) '//输出地区数据
  35.         .[g3].Resize(UBound(re), UBound(re, 2)) = re '//输出汇总结果
  36.     End With
  37. End Sub
复制代码
  1. Sub 作业二附加CheryBTL() '//品种增加时自动汇总,但格式没有处理,需要把格式完善了。
  2.     Dim ar, re, temp
  3.     Dim i As Long, j As Long, k As Long, R As Integer, C As Integer
  4.     Dim Cnt As Integer, Cnt2 As Integer, M As Integer
  5.     Dim d1 As Object, d2 As Object
  6.     Set d1 = CreateObject("scripting.dictionary")
  7.     Set d2 = CreateObject("scripting.dictionary")
  8.         '//d1为地区的不重复清单及对应的顺序,即行标
  9.         '//d2为品种对应的不重复清单及对应的顺序,即列标(需再加上月份的信息)
  10.     ar = Sheets("作业二").Range("a1").CurrentRegion '//源数据赋值给数组ar
  11.     For i = 2 To UBound(ar)
  12.         If Not d2.exists(ar(i, 3)) Then
  13.              '//对品种按出现顺序编号放入字典d2中,其对应的Item为出现的顺序数,即列标的参考
  14.             Cnt2 = Cnt2 + 1
  15.             d2(ar(i, 3)) = Cnt2
  16.         End If
  17.     Next i
  18.     d2("小计") = Cnt2 + 1 '//将小计放入字典d2中
  19.     ReDim re(1 To 33, 1 To d2.Count * 12 + 1) '//根据结果区域的大小,定义结果数组
  20.     '//以下对表头进行处理
  21.     '//将字典d2的keys赋值对临时数据temp
  22.     temp = d2.keys
  23.     For i = 1 To UBound(re, 2) - 1
  24.         If i Mod d2.Count = 1 Then re(1, i) = Int((i - 1) / d2.Count) + 1 & "月"
  25.          '//若i为d2.count的整数倍+1时,定义为月份信息
  26.         re(2, i) = temp((i - 1) Mod d2.Count)
  27.         '//按0、1、2、d2.count-1的顺序赋值对第二行表头
  28.     Next i
  29.     re(2, i) = "合计" '//最后一行的数据为合计
  30.     Cnt = 2 '//因为前面有2行表头,数据要从第3行开始,因为起始值为2
  31.     For i = 2 To UBound(ar)
  32.         If Not d1.exists(ar(i, 2)) Then
  33.              '//对地区按出现顺序编号放入字典dR中,其对应的Item为出现的顺序数,即行标
  34.             Cnt = Cnt + 1
  35.             d1(ar(i, 2)) = Cnt
  36.         End If
  37.         M = Month(ar(i, 1)) * d2.Count - d2.Count '月份信息,即月份的间隔
  38.         R = d1(ar(i, 2))        '行标
  39.         C = d2(ar(i, 3)) + M    '列标
  40.         re(R, C) = re(R, C) + ar(i, 4) '//对应品种对应月份累计
  41.         re(R, M + d2.Count) = re(R, M + d2.Count) + ar(i, 4) '//对应地区对应月份累计
  42.         re(R, UBound(re, 2)) = re(R, UBound(re, 2)) + ar(i, 4) '//对应地区累计
  43.     Next
  44.     With Sheets("作业二")
  45.         .Range("G1:VV65536").Clear  '//清楚原数据的内容及格式
  46.         .[f3].Resize(d1.Count) = Application.Transpose(d1.keys)  '//输出地区
  47.         .[g1].Resize(UBound(re), UBound(re, 2)) = re '输出结果数据
  48.         .Range(.Cells(1, 7), .Cells(2, 6 + UBound(re, 2))).Select '//以下都是格式设置的信息,选中表头
  49.             With Selection.Interior '//设置填充色
  50.                 .Pattern = xlSolid
  51.                 .PatternColorIndex = xlAutomatic
  52.                 .ThemeColor = xlThemeColorAccent6
  53.                 .TintAndShade = 0.399975585192419
  54.             End With
  55.         For i = 1 To UBound(re, 2) - 1 Step d2.Count '//设置第一列的合并单元格
  56.             .Range(.Cells(1, i + 6), .Cells(1, i + d2.Count + 5)).Select
  57.             With Selection
  58.                 .HorizontalAlignment = xlCenter
  59.                 .VerticalAlignment = xlCenter
  60.                 .ReadingOrder = xlContext
  61.             End With
  62.             Selection.Merge
  63.         Next i
  64.             .Range(.Cells(1, i + 6), .Cells(2, i + 6)).Select '//设计总计的合并单元格
  65.             With Selection
  66.                 .HorizontalAlignment = xlCenter
  67.                 .VerticalAlignment = xlCenter
  68.                 .ReadingOrder = xlContext
  69.             End With
  70.             Selection.Merge
  71.         .Range(.Cells(1, 6), .Cells(2 + d1.Count, 6 + UBound(re, 2))).Select '增加边框
  72.             With Selection.Borders
  73.                 .LineStyle = xlContinuous
  74.                 .ColorIndex = 0
  75.                 .TintAndShade = 0
  76.                 .Weight = xlThin
  77.             End With
  78.     End With
  79. End Sub
复制代码

点评

第三题未做  发表于 2013-12-11 22:24

评分

参与人数 1金币 +12 收起 理由
cloud-sj + 12 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2013-12-10 15:41 | 显示全部楼层
  1. Option Explicit

  2. Sub 作业一A03开心妙妙()
  3.     Dim D As New Dictionary, DD As New Dictionary, D1 As New Dictionary, D2 As New Dictionary

  4.     Dim Arr, ARR2(), Arr3
  5.     Dim i, s, j, s1, c, r

  6.     Application.ScreenUpdating = False  '禁止屏幕刷新

  7.     Arr = Range("A2:C" & Range("A65536").End(xlUp).Row)    '数据将入数组
  8.     For i = 1 To UBound(Arr)

  9.         If D.Exists(Arr(i, 2)) = False Then D(Arr(i, 2)) = 0    '字典品种
  10.         D(Arr(i, 2)) = D(Arr(i, 2)) + Arr(i, 3)  '品种数据汇总

  11.         If DD.Exists(Arr(i, 1)) = False Then DD(Arr(i, 1)) = 0    '字典地区
  12.         DD(Arr(i, 1)) = DD(Arr(i, 1)) + Arr(i, 3)  '地区数据汇总

  13.         If Not D1.Exists(Arr(i, 1)) Then D1(Arr(i, 1)) = ""    '字典地区
  14.         s = Arr(i, 1) & "|" & Arr(i, 2)  '第一列连第二列作为D2的关键字
  15.         D2(s) = D2(s) + Arr(i, 3)       '地区+品种——数据汇总

  16.     Next i
  17.     c = Range("G1").End(xlToRight).Column    '列号
  18.     r = Range("F2").End(xlDown).Row    '行号

  19.     Range(Cells(1, 7), Cells(1, c)).Clear   '品种列标题内容清空
  20.     Range(Cells(2, 6), Cells(r, c)).Clear   '清空原目标区域内容


  21.     If D1.Count = 0 Then Exit Sub    '如果字典地区条目数是0,退出程序
  22.     ReDim ARR2(1 To D1.Count, 1 To D.Count + 1)  '否则就重置结果数组

  23.     Arr3 = D1.Keys  '将字典地区放入数组Arr3
  24.     For i = 1 To D1.Count  '数组行循环
  25.         ARR2(i, 1) = Arr3(i - 1)    '将地区列放入目标数组第一列
  26.         For j = 2 To D.Count + 1   '数组列循环,第一列是地区,所以从第二列开始循环,列数是品种的条目数
  27.             s = Arr3(i - 1) & "|" & D.Keys(j - 2)    '地区连品种作为关键字
  28.             If D2.Exists(s) Then ARR2(i, j) = D2(s)    '如果关键字存在,那么,将值放进数组中
  29.         Next j
  30.     Next i

  31.     c = D.Count  '品种条目数计算列
  32.     r = DD.Count  '地区条目数计算行

  33.     Range("F2").Resize(r, c + 1) = ARR2   '将Arr2赋值到单元格区域
  34.     Cells(1, c + 7) = "合计"  '最后一列填入"合计"字符

  35.     Range("G1").Resize(, c) = D.Keys    '将品种标题赋值到单元格中
  36.     Range("G1").Resize(, c + 1).HorizontalAlignment = xlCenter    '将品种标题列居中

  37.     With Range("F1").Resize(, c + 2).Interior    '品种标题区域内部对象
  38.         .ThemeColor = xlThemeColorAccent6   '对象设置颜色
  39.         .TintAndShade = 0.799981688894314  '对象颜色减淡
  40.     End With

  41.     Cells(2, c + 7).Resize(r, 1) = Application.WorksheetFunction.Transpose(DD.Items)   '字典地区汇总值放入赋值到合计列

  42.     Cells(r + 2, 6) = "总计"    '最后行填入"总计"字符
  43.     Cells(r + 2, 7).Resize(, c) = D.Items  '字典品种汇总填入区域

  44.     Cells(r + 2, c + 7) = Application.WorksheetFunction.Sum(Range(Cells(2, c + 7), Cells(r + 1, c + 7)))    '汇总K列数据
  45.     Range(Cells(1, 6), Cells(r + 2, c + 7)).Borders.LineStyle = 1  '区域添加框条

  46.     Range(Cells(2, 6), Cells(r + 2, 6)).HorizontalAlignment = xlCenter    '地区列居中

  47.     Application.ScreenUpdating = True   '开启屏幕刷新

  48. End Sub
复制代码

点评

只做了第一题  发表于 2013-12-11 22:10

评分

参与人数 1金币 +4 收起 理由
cloud-sj + 4 淡定

查看全部评分

回复

使用道具 举报

发表于 2013-12-11 09:05 | 显示全部楼层
只做了第一题,第二题实在不会,请老师手下留情。

【VBA字典数组201301班】第五讲作业 A09-ldxhzy.zip

33.38 KB, 下载次数: 19

点评

只做了第一题  发表于 2013-12-11 22:07

评分

参与人数 1金币 +4 收起 理由
cloud-sj + 4 淡定

查看全部评分

回复

使用道具 举报

发表于 2013-12-11 17:08 | 显示全部楼层
A组长:123小木头人   第二题没思路 第三题做了登陆的
Sub 作业一()
Dim d As New Dictionary, d1 As New Dictionary
Dim arr, arr1(1 To 1000, 1 To 10)
Dim i%, m%, n%
'数据源放入数组
arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row).Value

'处理结果放入数组
For i = LBound(arr) To UBound(arr)
   If Not d.Exists(arr(i, 1)) Then d(arr(i, 1)) = d.Count + 1
   If Not d1.Exists(arr(i, 2)) Then d1(arr(i, 2)) = d1.Count + 1
    m = d(arr(i, 1)): n = d1(arr(i, 2))
    arr1(m, n) = arr1(m, n) + arr(i, 3)
Next i
  
  '放入单元格区域
    Range("f:l").ClearContents
    Range("f1") = "    品种" & "    " & Chr(10) & "地区"
    Range("g2").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
    Range("f2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Keys)
    Range("g1").Resize(1, d1.Count) = d1.Keys
End Sub

Sub 作业二()
Dim d As New Dictionary, d1 As New Dictionary, d2 As New Dictionary
Dim arr, arr1(), arr2
Dim i%, m%, n%, str$, j%
arr2 = Array("草莓", "苹果", "葡萄", "小计")
arr = Range("a2:d" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  For i = LBound(arr) To UBound(arr)
    If Not d.Exists(arr(i, 2)) Then d(arr(i, 2)) = d.Count + 1
  Next i
  ReDim arr1(1 To d.Count, 1 To 48)
  For i = LBound(arr) To UBound(arr)
    For j = 1 To d.Count
     For n = 0 To 2
      str = VBA.Month(arr(i, 1)) & d.Keys(j - 1) & arr2(0)
     Next n
    Next j
  Next i
End Sub

Sub 打开论坛(name As String, word As String)
Dim ie As New InternetExplorer
Dim i, arr(1 To 1000)
  With ie
    .Navigate "http://www.excelpx.com"
    .Visible = True
  Do Until .ReadyState = READYSTATE_COMPLETE
  Loop
    .Document.all("username").Value = name
    .Document.all("password").Value = word
    .Document.forms(0).submit
  End With
End Sub

点评

作业二和作业三不正确  发表于 2013-12-11 20:32

评分

参与人数 1金币 +4 收起 理由
cloud-sj + 4 山寨

查看全部评分

回复

使用道具 举报

发表于 2015-1-29 16:20 | 显示全部楼层
俗是俗了点儿。可是我喜欢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 12:22 , Processed in 0.453417 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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