Excel精英培训网

 找回密码
 注册
查看: 3092|回复: 9

[习题] 【VBA字典数组201301班】D组- 第三讲作业上交处

[复制链接]
发表于 2013-11-14 21:26 | 显示全部楼层 |阅读模式
本帖最后由 sliang28 于 2013-11-21 20:30 编辑

本贴为【VBA字典数组201301班】D组 第三讲作业 上交专用,其它学员勿入

1.要求使用字典完成
2.所有的代码均写在按钮指定的过程中
3.要求代码缩进
4.要求有注释(关键代码处)
5.要求强制声明
3-5要求一共占6分,每点2分,6道题最多扣6分
作业上截止时间:2013年11月20日 18:00,原则上在未评分和开贴前上交作业均视为有效
发表于 2013-11-16 17:02 | 显示全部楼层
本帖最后由 fffox 于 2013-11-16 17:22 编辑

先交了
奇怪,以前上交代码都有缩进的,这次怎么就没了?
只能再传个附件了
  1. Option Explicit
  2. '字典采用前期绑定

  3. Sub 求不重复值1()
  4. Dim arr, i As Integer, d1 As New Dictionary
  5. arr = Range("a1:a" & Range("a65536").End(xlUp).Row)
  6. For i = 1 To UBound(arr)
  7. d1.Item(arr(i, 1)) = ""
  8. '通过循环,把A列值存入字典Key里,利用字典Key不重复特征,取得不重复值
  9. Next
  10. Range("c2").Resize(d1.Count) = Application.Transpose(d1.Keys)
  11. '字典Kesy是一维数组,通过转置把Keys写入目标区域
  12. End Sub

  13. Sub 求不重复值2()
  14. Dim arr, i As Integer, d2 As New Dictionary
  15. arr = Range("a1:a" & Range("a65536").End(xlUp).Row)
  16. d2.CompareMode = 1 '设置字典不区分大小写
  17. For i = 1 To UBound(arr)
  18. d2(arr(i, 1)) = ""
  19. Next
  20. '写入目标区域,用Resize(d2.Count)自动扩展目标区域大小
  21. Range("d2").Resize(d2.Count) = Application.Transpose(d2.Keys)
  22. End Sub

  23. Sub 双向求值()
  24. Dim d3 As New Dictionary
  25. Dim i As Byte
  26. Dim arr
  27. arr = Range("a2:b" & Range("b65536").End(xlUp).Row)
  28. For i = 1 To UBound(arr, 1)
  29. d3.Item(arr(i, 1)) = arr(i, 2)
  30. d3.Item(arr(i, 2)) = arr(i, 1)
  31. '通过循环,分别以城市分Key简写为Item,和简写为Key城市为Item存入字典
  32. Next
  33. MsgBox d3.Item(Range("d3").Value) '以d3值为Key查找对应的Item
  34. End Sub

  35. Sub 多条件查找()
  36. Dim d5a As New Dictionary, d5b As New Dictionary
  37. Dim arr, brr, str$, i As Byte
  38. arr = Range("a2:d5")
  39. For i = 1 To UBound(arr)
  40. str = arr(i, 1) & arr(i, 2) '以产品&规格为关键字创建字典
  41. d5a(str) = arr(i, 3) '创建d5a字典,item为数量
  42. d5b(str) = arr(i, 4) '创建d5b字典,item为单价
  43. Next
  44. For i = 12 To 13 '根据单元格内容取值后分别写入目标单元格
  45. str = Cells(i, 1) & Cells(i, 2)
  46. Cells(i, 3) = d5a(str)
  47. Cells(i, 4) = d5b(str)
  48. Next
  49. ' brr = Range("a12:d13") '结果存入数组后一次性写入
  50. ' For i = 1 To UBound(brr)
  51. ' str = brr(i, 1) & brr(i, 2)
  52. ' brr(i, 3) = d5a(str)
  53. ' brr(i, 4) = d5b(str)
  54. ' Next
  55. ' Range("a12").Resize(UBound(brr), 4) = brr
  56. End Sub

  57. Sub 单条件求和()
  58. Dim d4 As New Dictionary
  59. Dim arr, i%
  60. arr = Range("b2:c" & Range("c65536").End(3).Row)
  61. For i = 1 To UBound(arr)
  62. d4(arr(i, 1)) = d4(arr(i, 1)) + arr(i, 2)
  63. '以产品为Key,以数量为Item,通过循环,分别计算Item之和
  64. Next
  65. Range("e2").Resize(d4.Count) = Application.Transpose(d4.Keys)
  66. Range("f2").Resize(d4.Count) = Application.Transpose(d4.Items)
  67. End Sub

  68. Sub 多列求和()
  69. Dim d As New Dictionary
  70. Dim arr, brr()
  71. Dim i As Byte, iRow As Byte, k As Byte, j As Byte
  72. arr = [a2:d6]
  73. For i = 1 To UBound(arr)
  74. If Not d.Exists(arr(i, 1)) Then '当产品在字典中不存在时
  75. k = k + 1 '需要在数组中新增一行
  76. ReDim Preserve brr(1 To 4, 1 To k) '动态扩展数组brr
  77. d(arr(i, 1)) = k '字典中保存对应的行数
  78. For j = 1 To 4
  79. brr(j, k) = arr(i, j) '行列转换存入相应数据
  80. Next
  81. Else
  82. iRow = d(arr(i, 1)) '产品在字典中存在,取得行数
  83. brr(2, iRow) = brr(2, iRow) + arr(i, 2)
  84. brr(3, iRow) = arr(i, 3) '取最新单价
  85. brr(4, iRow) = brr(4, iRow) + arr(i, 4)
  86. End If
  87. Next
  88. Range("a13").Resize(k, 4) = Application.Transpose(brr)
  89. End Sub


  90. Sub 多条件求和()
  91. Dim d As New Dictionary
  92. Dim arr, i As Byte, iRow As Byte, str As String
  93. Dim k As Byte, brr(1 To 10, 1 To 3) '事先声明足够大的目标数组
  94. arr = [a2:c6]
  95. For i = 1 To UBound(arr)
  96. str = arr(i, 1) & arr(i, 2) '以产品&规格为关键字
  97. If Not d.Exists(str) Then '关键字在字典中不存在,直接赋值
  98. k = k + 1
  99. d(str) = k
  100. brr(k, 1) = arr(i, 1)
  101. brr(k, 2) = arr(i, 2)
  102. brr(k, 3) = arr(i, 3)
  103. Else '字典中存在,对应行中数量相加
  104. iRow = d(str)
  105. brr(iRow, 3) = brr(iRow, 3) + arr(i, 3)
  106. End If
  107. Next
  108. Range("a11").Resize(k, 3) = brr
  109. End Sub
复制代码

【VBA字典数组201301班】第三讲 作业-D09-fffox.rar

52.49 KB, 下载次数: 7

点评

不要点回复,直接再下面回复就不会没有缩进了,如果点了回复,粘贴上之后删除,再贴一下就有缩进了  发表于 2013-11-21 15:38

评分

参与人数 1金币 +20 收起 理由
sliang28 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-16 23:30 | 显示全部楼层
D004-风林火山

【VBA字典数组201301班03课】作业-D004-风林火山.rar

53.97 KB, 下载次数: 8

评分

参与人数 1金币 +20 收起 理由
sliang28 + 20 结果正确,后面忘记注释了

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 09:11 | 显示全部楼层
本帖最后由 一杯清荼 于 2013-11-19 16:52 编辑

题1:

  1. Sub 求不重复值1()
  2.     '思路:利用KEY值的唯一性去重
  3.     Dim arr, brr, i As Integer, d As Object
  4.    Set d = CreateObject("Scripting.Dictionary")
  5.         arr = sheets("求不重复值").[a1].CurrentRegion
  6.         For i = 1 To UBound(arr)
  7.             d(arr(i, 1)) = ""
  8.         Next
  9.         sheets("求不重复值").[c2].Resize(d.Count, 1) = Application.Transpose(d.Keys)
  10. End Sub

  11. Sub 求不重复值2()
  12. Dim arr, brr, i As Integer, d As Object
  13.    Set d = CreateObject("Scripting.Dictionary")
  14.    d.CompareMode = vbTextCompare '不区分大小写
  15.         arr =sheets("求不重复值"). [a1].CurrentRegion
  16.         For i = 1 To UBound(arr)
  17.             d(arr(i, 1)) = ""
  18.           '  d(UCase(arr(i, 1))) = ""
  19.         Next
  20.         sheets("求不重复值").[d2].Resize(d.Count, 1) = Application.Transpose(d.Keys)
  21. End Sub
复制代码
题2:
  1. Sub 双向求值()
  2.     Dim arr, i As Integer, d As Dictionary, d2 As Dictionary
  3.     arr = Sheets("双向查找").[a1].CurrentRegion
  4.     Set d = New Dictionary
  5.     Set d2 = New Dictionary
  6.     For i = 2 To UBound(arr)
  7.         d(arr(i, 1)) = arr(i, 2)    '将城市写入字典d
  8.         d2(arr(i, 2)) = arr(i, 1)    '将简写写入字典d1
  9.     Next
  10.     With Sheets("双向查找").Range("d3")
  11.         If d(.Value) = "" Then    '查找值不在d字典中时
  12.             MsgBox d2(.Value)    '就到d2字典中找
  13.         Else
  14.             MsgBox d(.Value)
  15.         End If
  16.     End With
  17. End Sub

复制代码
题3:

  1. Sub 单条件求和()
  2.     Dim arr, i As Integer, d As Object
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     arr =sheets("单条件求和"). [a1].CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 3) '相同KEY值的项相加
  7.     Next
  8.     sheets("单条件求和").[e2].Resize(d.Count, 2) = Application.Transpose(Array(d.Keys, d.Items))
  9. End Sub
复制代码
  1. Sub 多条件查找()
  2. '主要思路:将查找的条件相连接后作为字典的KEY,要查找的内容相连接后作为字典的项,写出入字典中,
  3. '最后按连接的字符分列
  4.     Application.DisplayAlerts = False
  5.     Dim d As Dictionary
  6.     Set d = New Dictionary
  7.     Dim i As Integer, j As Integer, arr, brr, crr(1 To 2)
  8.     arr = [a1].CurrentRegion
  9.     brr = [a11].CurrentRegion
  10.     For i = 2 To UBound(arr)
  11.         d(arr(i, 1) & arr(i, 2)) = arr(i, 3) & ";" & arr(i, 4)
  12.     Next
  13.     For j = 2 To UBound(brr)
  14.         If d.Item(brr(j, 1) & brr(j, 2)) <> "" Then
  15.             crr(j - 1) = d.Item(brr(j, 1) & brr(j, 2))
  16.         Else
  17.             crr(j - 1) = "" & ";" & ""
  18.         End If
  19.     Next
  20.     [c12].Resize(2, 1) = Application.Transpose(crr)
  21.     Range("c12").Resize(2).TextToColumns Other:=True, OtherChar:=";"
  22.     Application.DisplayAlerts = True
  23. End Su

  24. 题5:

  25. Sub 多列求和()
  26. '主要思路:用字典做标记,当有重复时,通过这个标记来改变数组中与之对应的值.
  27.     Dim arr, brr(), i As Integer, j As Integer, n As Byte, d As Object
  28.     Set d = CreateObject("Scripting.Dictionary")
  29.     arr = sheets("多列求和").[a1].CurrentRegion
  30.     ReDim brr(1 To UBound(arr), 1 To 3)
  31.     For i = 2 To UBound(arr)
  32.         If Not d.Exists(arr(i, 1)) Then
  33.             d(arr(i, 1)) = d.Count + 1
  34.             brr(d.Count, 1) = arr(i, 2)
  35.             brr(d.Count, 2) = arr(i, 3)
  36.             brr(d.Count, 3) = arr(i, 4)
  37.         Else
  38.             n = d(arr(i, 1))
  39.             brr(n, 1) = arr(i, 2) + brr(n, 1)
  40.             brr(n, 2) = arr(i, 3)
  41.             brr(n, 3) = arr(i, 4) + brr(n, 3)
  42.         End I
  43.     Next
  44.    sheets("多列求和").[a13].Resize(d.Count) = Application.Transpose(d.Keys)
  45.    sheets("多列求和").[b13].Resize(d.Count, 3) = brr
  46. End Sub
复制代码
题6:

  1. Sub 多条件求和()
  2.     Application.DisplayAlerts = False
  3.     Dim i As Integer, d As Object, arr
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     arr =sheets("多条件求和"). [a1].CurrentRegion
  6.     For i = 2 To UBound(arr)
  7.         If d.Exists(d(arr(i, 1) & ";" & arr(i, 2))) Then
  8.             d(arr(i, 1) & ";" & arr(i, 2)) = arr(i, 3)
  9.         Else
  10.             d(arr(i, 1) & ";" & arr(i, 2)) = d(arr(i, 1) & ";" & arr(i, 2)) + arr(i, 3) '相同的产品累加
  11.         End If
  12.     Next
  13.    sheets("多条件求和"). [a11].Resize(4) = Application.Transpose(d.Keys)
  14.    sheets("多条件求和").[c11].Resize(4) = Application.Transpose(d.Items)
  15.    sheets("多条件求和").Range("a11").Resize(4).TextToColumns Other:=True, OtherChar:=";" '分列
  16.    Application.DisplayAlerts = True
  17. End Sub
复制代码

评分

参与人数 1 +5 金币 +20 收起 理由
sliang28 + 5 + 20 作业做的很好!

查看全部评分

回复

使用道具 举报

发表于 2013-11-18 15:44 | 显示全部楼层
D05:w2001pf
Option Explicit

Sub 求不重复值1()
     Dim arr, i, rowend
    Dim d As New Dictionary    '声明一个字典
    With Sheet2
        rowend = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A1:A" & rowend)
        For i = 1 To UBound(arr)    '
            If d.Exists(arr(i, 1)) = False Then d(arr(i, 1)) = ""    '如果关键字不存在就定义它的项为空
        Next i
        .Range("D2").Resize(d.Count) = Application.Transpose(d.Keys)    '通过转置函数把字典的关键字读入到指定的位置
    End With
End Sub

Sub 求不重复值2()
    Dim arr, i, rowend
    Dim d As New Dictionary    '声明一个字典
    With Sheet2
        rowend = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A1:A" & rowend)
        d.CompareMode = vbTextCompare    '声明不区分大小写
        For i = 1 To UBound(arr)    '
            If d.Exists(arr(i, 1)) = False Then d(arr(i, 1)) = ""    '如果关键字不存在就定义它的项为空
        Next i
        .Range("D2").Resize(d.Count) = Application.Transpose(d.Keys)    '通过转置函数把字典的关键字读入到指定的位置
    End With
End Sub

Sub 双向求值()
    Dim arr, i, rowend, caz, jgz
    Dim d As New Dictionary    '声明一个字典
    With Sheet9
        caz = .Range("D3").Text '用变量caz表示要查找的值
        rowend = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A1:B" & rowend)
        For i = 1 To UBound(arr)
            If d.Exists(arr(i, 1)) = False Then d(arr(i, 1)) = arr(i, 2)    '如果关键字不存在就定义它的项为对应的B列的值
        Next i
        For i = 0 To d.Count - 1    '在字典中循环查找需要查找的值
            If d.Keys(i) = caz Then    '如果关键字中没有找到就到对应的项中查找
                jgz = d.Items(i)
            ElseIf d.Items(i) = caz Then
                jgz = d.Keys(i)
            End If
        Next i
    End With
    MsgBox prompt:=caz & String(2, vbCrLf) & "查找结果是" & jgz, Title:="这是你要的结果吗?"

End Sub

Sub 多条件查找()

    Dim arr, i, rowend, caz, j
    Dim d As New Dictionary    '声明一个字典
    With Sheet8
        .Range("C12:D13") = ""
        caz = .Range("A12:D13") '定义一个数组,装入查找的结果
        rowend = .Range("A1").End(xlDown).Row
        arr = .Range("A2:D" & rowend)
        For i = 1 To UBound(arr)
            d(arr(i, 1) & arr(i, 2)) = arr(i, 3) & "|" & arr(i, 4)  '如果关键字(两个条件)不存在就定义它的项为对应的两列的值
        Next i
        For j = 1 To UBound(caz)
            For i = 0 To d.Count - 1    '在字典中循环查找需要查找的值
                If d.Keys(i) = caz(j, 1) & caz(j, 2) Then    '在关键字中查找
                    caz(j, 3) = Split(d.Items(i), "|")(0) '将关键字对应的项分列为两列装入查找的结果中
                    caz(j, 4) = Split(d.Items(i), "|")(1)

                End If
            Next i
        Next j
        .Range("A12").Resize(UBound(caz), UBound(caz, 2)) = caz
    End With
End Sub

Sub 单条件求和()
    Dim arr, i, rowend
    Dim d As New Dictionary    '声明一个字典
    With Sheet10
        rowend = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("B2:C" & rowend)
        For i = 1 To UBound(arr)    '
            d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)    '关键字的项值累加
        Next i
        .Range("E2").Resize(d.Count) = Application.Transpose(d.Keys)    '通过转置函数把字典的关键字与项读入到指定的位置
        .Range("F2").Resize(d.Count) = Application.Transpose(d.Items)
    End With
End Sub

Sub 多列求和()
    Dim d As New Dictionary '声明一个字典
    Dim i As Long
    Dim j As Long
    Dim arrlx, arr, rowend
    With Sheet12
        arrlx = Range("B1:D1") '定义一个列项目的数组(数量,单价,金额)
        rowend = .Range("A1").End(xlDown).Row
        arr = .Range("A2:D" & rowend)
        For j = 1 To UBound(arrlx, 2)
            d(arrlx(1, j)) = ""
            Set d(arrlx(1, j)) = New Dictionary '声明关键字(列项目的数组(数量,单价,金额))的项为字典,即字典套字典
        Next j
        For i = 1 To UBound(arr)
            For j = 1 To UBound(arrlx, 2)
                If j <> 2 Then
                    d(arrlx(1, j))(arr(i, 1)) = d(arrlx(1, j))(arr(i, 1)) + arr(i, j + 1) '关键字(如A的数量,金额等)的项值累加
                ElseIf j = 2 Then d(arrlx(1, j))(arr(i, 1)) = arr(i, j + 1) '关键字是单价的对应项值就是它本身,因为单价不累加的
                End If
            Next j
        Next i
        .Range("A13").Resize(d("数量").Count, 1) = Application.WorksheetFunction.Transpose(d("数量").Keys) '把数量(字典)的关键字装入到结果中
        For j = 1 To UBound(arrlx, 2)
            Range("B13").Offset(0, j - 1).Resize(d("数量").Count, 1) = Application.WorksheetFunction.Transpose(d(arrlx(1, j)).Items) '把对应的求和结果装入到指定的位置
        Next j
    End With
End Sub


Sub 多条件求和()
    Dim arr, i, rowend, caz, j
    Dim d As New Dictionary    '声明一个字典
    With Sheet13
        .Range("A11:D14") = ""
        rowend = .Range("A1").End(xlDown).Row
        arr = .Range("A2:C" & rowend)
        For i = 1 To UBound(arr)
            d(arr(i, 1) & "|" & arr(i, 2)) = d(arr(i, 1) & "|" & arr(i, 2)) + arr(i, 3)    '关键字(两列)的项值累加
        Next i
        ReDim caz(1 To d.Count, 1 To 3) '定义一个数组,装入查找的结果

        For i = 0 To d.Count - 1    '在字典中循环,把求和结果装入到查找的结果数组中
            caz(i + 1, 1) = Split(d.Keys(i), "|")(0) '将关键字分列为两列装入查找的结果中
            caz(i + 1, 2) = Split(d.Keys(i), "|")(1)
            caz(i + 1, 3) = d.Items(i)

        Next i

        .Range("A11").Resize(UBound(caz), UBound(caz, 2)) = caz
    End With
End Sub

评分

参与人数 1 +3 金币 +20 收起 理由
sliang28 + 3 + 20 可以尝试用简单的方法完成

查看全部评分

回复

使用道具 举报

发表于 2013-11-18 17:15 | 显示全部楼层
本帖最后由 ly258 于 2013-11-19 15:49 编辑

请多多点评,谢谢!
  1. Option Explicit

  2. Sub 求不重复值1()
  3. Dim x, arr
  4. Dim d As New Dictionary
  5. d.CompareMode = 0 '设置比较模式
  6. For Each x In Range("a1:a12").Value '遍历读取数据
  7. If Not d.Exists(x) Then '判断是否重复
  8. d.Add x, ""
  9. End If
  10. Next x
  11. Range("c2").Resize(d.Count, 1) = Application.Transpose(d.Keys) '一次性写入对应区域
  12. End Sub

  13. Sub 求不重复值2()
  14. Dim x, arr
  15. Dim d As New Dictionary
  16. d.CompareMode = 1 '设置比较模式
  17. For Each x In Range("a1:a12").Value '遍历读取数据
  18. If Not d.Exists(x) Then '判断是否重复
  19. d.Add x, ""
  20. End If
  21. Next x
  22. Range("d2").Resize(d.Count, 1) = Application.Transpose(d.Keys) '一次性写入对应区域
  23. End Sub

  24. Sub 双向求值()
  25. Dim x, arr
  26. Dim d As New Dictionary
  27. Dim dd As New Dictionary
  28. d.CompareMode = 0 '设置比较模式
  29. arr = Range("a2:b6 ")
  30. For x = 1 To UBound(arr) '循环读取数据,放到字典d中
  31. d.Add arr(x, 1), arr(x, 2)
  32. dd.Add arr(x, 2), arr(x, 1)
  33. Next x
  34. x = Range("d3").Value
  35. If d.Exists(x) Then '判断单元格中的数据是否在字典中存在
  36. MsgBox d.Item(x)
  37. Else
  38. MsgBox dd.Item(x)
  39. End If
  40. End Sub

  41. Sub 多条件查找()
  42. Dim d As New Dictionary
  43. Dim arr, h, i, arr1, arr2
  44. arr = Range("a2:d5")
  45. arr1 = Range("a12:d13")
  46. For i = 1 To UBound(arr)
  47. d.Add arr(i, 1) & arr(i, 2), arr(i, 3) & "*" & arr(i, 4) '以组合的方式放入字典
  48. Next i
  49. For i = 1 To UBound(arr1)
  50. h = arr1(i, 1) & arr1(i, 2) '把设置的条件进行组合
  51. If d.Exists(h) Then '在字典中查找组合条件
  52. arr2 = Split(d.Item(h), "*") '找到组合条件后以*号进行分割,生成数组
  53. Else
  54. arr2 = Array("", "")
  55. End If
  56. arr1(i, 3) = arr2(0) '生成的数组写入对应数组
  57. arr1(i, 4) = arr2(1)
  58. Next i
  59. Range("a12:d13") = arr1 '一次性写入到对应区域
  60. End Sub

  61. Sub 单条件求和()
  62. Dim d As New Dictionary
  63. Dim arr, h
  64. arr = Range("b2:c5")
  65. For h = 1 To UBound(arr)
  66. If d.Exists(arr(h, 1)) Then '判断新读入的数据是否在字典中存在
  67. d(arr(h, 1)) = d(arr(h, 1)) + arr(h, 2) '累计求和
  68. Else
  69. d.Add arr(h, 1), arr(h, 2) '新增字典中没有KEY
  70. End If
  71. Next h

  72. Range("e2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
  73. Range("f2").Resize(d.Count, 1) = Application.Transpose(d.Items)
  74. End Sub

  75. Sub 多列求和()
  76. Dim d As New Dictionary
  77. Dim arr, h, arr1(1 To 10, 1 To 3), t, s
  78. arr = Range("a2:d6")
  79. s = 1
  80. For h = 1 To UBound(arr)
  81. If d.Exists(arr(h, 1)) Then
  82. t = d.Item(arr(h, 1))
  83. arr1(t, 1) = arr1(t, 1) + arr(h, 2) '计算对应数值
  84. arr1(t, 3) = arr1(t, 3) + arr(h, 4)
  85. If arr(h, 3) > arr1(t, 2) Then '单价统计最大值
  86. arr1(t, 2) = arr(h, 3)
  87. End If
  88. Else
  89. d.Add arr(h, 1), s '数组中新增未找到的产品,并用item作为标记
  90. s = s + 1 '标记记数据器加1
  91. h = h - 1 '改变循环变量,让新增的产品参加统计
  92. End If
  93. Next h
  94. Range("a13").Resize(d.Count, 1) = Application.Transpose(d.Keys) '写入到对应区域
  95. Range("b13").Resize(UBound(arr1, 1), UBound(arr1, 2)) = arr1 '写入到对应区域
  96. End Sub


  97. Sub 多条件求和()
  98. Dim d As New Dictionary
  99. Dim arr, h, s, arr1, arr2, arr3
  100. arr = Range("a2:c6")
  101. For h = 1 To UBound(arr) '以“产品*规格”组合的形式建立字典,并在Item中求和
  102. s = arr(h, 1) & "*" & arr(h, 2)
  103. If d.Exists(s) Then
  104. d.Item(s) = d.Item(s) + arr(h, 3)
  105. Else
  106. d.Add s, arr(h, 3)
  107. End If
  108. Next h
  109. ReDim arr(1 To d.Count, 1 To 3)
  110. arr1 = d.Items '把字典中的KEY,ITEM存到数组
  111. arr2 = d.Keys
  112. For h = 1 To d.Count
  113. arr(h, 3) = arr1(h - 1)
  114. arr3 = Split(arr2(h - 1), "*") '用*号把字典中的KEY进行分割
  115. arr(h, 1) = arr3(0)
  116. arr(h, 2) = arr3(1)
  117. Next h
  118. Range("a11").Resize(UBound(arr, 1), UBound(arr, 2)) = arr '写入到对应区域
  119. End Sub

复制代码

【VBA字典数组201301班】第三讲 作业.rar

50.69 KB, 下载次数: 16

评分

参与人数 1金币 +20 收起 理由
sliang28 + 20 写的很好!掌握熟练

查看全部评分

回复

使用道具 举报

发表于 2013-11-19 13:12 | 显示全部楼层
本帖最后由 阿呆88 于 2013-11-19 13:21 编辑

  1. Sub 多条件求和()
  2. Application.DisplayAlerts = False
  3. Dim i As Integer, d As Object, arr
  4. Set d = CreateObject("Scripting.Dictionary")
  5. arr = [a1].CurrentRegion
  6. For i = 2 To UBound(arr)
  7. If d.Exists(d(arr(i, 1) & ";" & arr(i, 2))) Then
  8. d(arr(i, 1) & ";" & arr(i, 2)) = arr(i, 3)
  9. Else
  10. d(arr(i, 1) & ";" & arr(i, 2)) = d(arr(i, 1) & ";" & arr(i, 2)) + arr(i, 3)
  11. End If
  12. Next
  13. [a11].Resize(4) = Application.Transpose(d.Keys)
  14. [c11].Resize(4) = Application.Transpose(d.Items)
  15. Range("a11").Resize(4).TextToColumns Other:=True, OtherChar:=";" '分列
  16. Application.DisplayAlerts = True
  17. End Sub
  18. Sub 单条件求和()
  19. Dim arr, i As Integer, d As Object
  20. Set d = CreateObject("Scripting.Dictionary")
  21. arr = [a1].CurrentRegion
  22. For i = 2 To UBound(arr)
  23. If Not d.Exists(arr(i, 2)) Then
  24. d(arr(i, 2)) = d(arr(i, 2))
  25. End If
  26. d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 3)
  27. Next
  28. [e2].Resize(d.Count, 2) = Application.Transpose(Array(d.Keys, d.Items))
  29. End Sub
  30. 其他不会
复制代码

点评

但条件求和写入单元格方式不错,还有多条件求和也能写出来,其它题应该没有问题的。难不成你……此处省略7个字^_^  发表于 2013-11-21 17:58

评分

参与人数 1金币 +7 收起 理由
sliang28 + 7 加油

查看全部评分

回复

使用道具 举报

发表于 2013-11-20 15:10 | 显示全部楼层
自己只做了几题目,后面几道题目完全是代码校长的棋盘法的

【VBA字典数组201301班】第三讲 作业-D06-xhrys.rar

47.29 KB, 下载次数: 7

点评

能不掉用工作表函数就不要调用。  发表于 2013-11-21 18:03

评分

参与人数 1金币 +20 收起 理由
sliang28 + 20 结果正确!

查看全部评分

回复

使用道具 举报

发表于 2013-11-20 16:36 | 显示全部楼层
时间来不及了 没有解释 【VBA字典数组201301班】第三讲 作业 D07 联乔.rar (51.46 KB, 下载次数: 12)

点评

^_^ 还多写了个事件  发表于 2013-11-21 18:07

评分

参与人数 1金币 +20 收起 理由
sliang28 + 20 知道你能拿满分的

查看全部评分

回复

使用道具 举报

发表于 2013-11-20 17:57 | 显示全部楼层
Sub 求不重复值1()
Dim d
Dim arr, k
Dim i As Byte
Set d = CreateObject("scripting.dictionary")
d.comparemode = 0
arr = Range("a1:a12")
For i = 1 To UBound(arr)
d(arr(i, 1)) = ""
Next i
k = d.keys
Range("c2").Resize(d.Count, 1) = Application.Transpose(k)
Set d = Nothing
End Sub
Sub 求不重复值2()
Dim d
Dim arr, k
Dim i As Byte
Set d = CreateObject("scripting.dictionary")
d.comparemode = 1
arr = Range("a1:a12")
For i = 1 To UBound(arr)
d(arr(i, 1)) = ""
Next i
k = d.keys
Range("d2").Resize(d.Count, 1) = Application.Transpose(k)
Set d = Nothing
End Sub

评分

参与人数 1金币 +4 收起 理由
sliang28 + 4 加油 第一道题正确

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 19:19 , Processed in 0.311322 second(s), 23 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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