Excel精英培训网

 找回密码
 注册
查看: 7672|回复: 13

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

[复制链接]
发表于 2013-11-14 12:04 | 显示全部楼层 |阅读模式
本帖最后由 无聊的疯子 于 2013-11-21 17:05 编辑

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

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

3-5要求一共占6分,每点2分,6道题最多扣6分

对于《求不重复值》添加一个附加题
要求:写一个带参数的公用过程来解(根据自己的情况来,凡是正确了的,给经验2点)

作业上截止时间:2013年11月20日 18:00,原则上在未评分和开贴前上交作业均视为有效

若因特殊情况,需要申请延后上交的请提前与我联系

发表于 2013-11-14 14:59 | 显示全部楼层
本帖最后由 xdragon 于 2013-11-15 14:32 编辑

C08:xdragon
  1. Option Explicit

  2. Sub 求不重复值1()
  3.   Dim arr(), i As Byte
  4.   arr = Range("A1:A12").Value
  5.   With CreateObject("Scripting.Dictionary")
  6.   '利用字典key唯一性原则(默认为区分大小写),将数组依次导入key
  7.     For i = 1 To UBound(arr)
  8.       If Not .exists(arr(i, 1)) Then .Add arr(i, 1), ""
  9.     Next
  10.     '导出字典key中存放的内容到单元格
  11.     Range("C2").Resize(.Count) = Application.Transpose(.keys)
  12.   End With
  13. End Sub

  14. Sub 求不重复值2()
  15. 'comparemode=1 为不区分大小写,其他同上
  16.   Dim arr(), i As Byte
  17.   arr = Range("A1:A12").Value
  18.   With CreateObject("Scripting.Dictionary")
  19.   .comparemode = 1
  20.     For i = 1 To UBound(arr)
  21.       If Not .exists(arr(i, 1)) Then .Add arr(i, 1), ""
  22.     Next
  23.     Range("D2").Resize(.Count) = Application.Transpose(.keys)
  24.   End With
  25. End Sub

  26. Sub 双向求值()
  27.   Dim arr(), i As Byte, d As Object
  28.   arr = Range("A2:B6").Value
  29.   Set d = CreateObject("scripting.dictionary")
  30.   '循环两次,分别将两列对应的值导入一个字典中,然后根据D3单元格的值在字典查找并返回对应的item
  31.   For i = 1 To UBound(arr)
  32.     d(arr(i, 1)) = arr(i, 2)
  33.   Next
  34.   For i = 1 To UBound(arr)
  35.     d(arr(i, 2)) = arr(i, 1)
  36.   Next
  37.   MsgBox d([d3].Value), , "查找结果"
  38. End Sub

  39. Sub 多条件查找()
  40.   Dim arr(), brr(), crr(), i As Byte, j As Byte
  41.   arr = Range("A2:D5").Value
  42.   With CreateObject("scripting.dictionary")
  43.     For i = 1 To UBound(arr)
  44.       If Not .exists(arr(i, 1) & "|" & arr(i, 2)) Then '将产品和规格合并视为一个字典的key处理
  45.         j = j + 1
  46.         .Item(arr(i, 1) & "|" & arr(i, 2)) = j '当字典中没有新出现的词条时,添加此词条到key,并对此key计数(此计数唯一)
  47.         ReDim Preserve crr(1 To 2, 1 To j)
  48.         crr(1, j) = arr(i, 3): crr(2, j) = arr(i, 4) '将数组中数量和单价分别赋值给crr对应的列中
  49.       End If
  50.     Next
  51.     brr = Range("A12:B13").Value
  52.     ReDim arr(1 To 2, 1 To 2)
  53.     '根据查找区域的值查找对应的item,没有找到的显示为“无记录”
  54.     For i = 1 To UBound(brr)
  55.       If .exists(brr(i, 1) & "|" & brr(i, 2)) Then
  56.         arr(i, 1) = crr(1, .Item(brr(i, 1) & "|" & brr(i, 2)))
  57.         arr(i, 2) = crr(2, .Item(brr(i, 1) & "|" & brr(i, 2)))
  58.       Else
  59.         arr(i, 1) = "无记录"
  60.         arr(i, 2) = "无记录"
  61.       End If
  62.     Next
  63.     '导出数组至单元格
  64.     Range("C12:D13") = arr
  65.   End With
  66. End Sub

  67. Sub 单条件求和()
  68.   Dim arr(), i As Byte
  69.   arr = Range("A2:C5").Value
  70.   With CreateObject("scripting.dictionary")
  71.   '循环数组,累计相同key对应的item
  72.     For i = 1 To UBound(arr)
  73.       .Item(arr(i, 2)) = .Item(arr(i, 2)) + arr(i, 3)
  74.     Next
  75.   '结果导出至单元格
  76.     [e2].Resize(.Count) = Application.Transpose(.keys)
  77.     [f2].Resize(.Count) = Application.Transpose(.items)
  78.   End With
  79. End Sub

  80. Sub 多列求和()
  81.   Dim arr(), brr(), i As Byte, j As Byte
  82.   arr = Range("A2:D6").Value
  83.   With CreateObject("scripting.dictionary")
  84.     For i = 1 To UBound(arr)
  85.     'i为arr数组行循环计数变量,j为不重复产品的计数变量
  86.       If Not .exists(arr(i, 1)) Then '当arr(i,1)不存在字典中时,添加arr中各字段到brr中
  87.         j = j + 1
  88.         .Item(arr(i, 1)) = j
  89.         ReDim Preserve brr(1 To 4, 1 To j)
  90.           brr(1, j) = arr(i, 1)
  91.           brr(2, j) = arr(i, 2)
  92.           brr(3, j) = arr(i, 3)
  93.           brr(4, j) = arr(i, 4)
  94.       Else '当arr(i,1)存在字典中时,合计第二列和第四列的值,第三列保存为最后一个单价(不知道是不是这题的bug,我觉得应该是我下面注译中的值才对。。。)
  95.           brr(2, .Item(arr(i, 1))) = brr(2, .Item(arr(i, 1))) + arr(i, 2)
  96.           brr(4, .Item(arr(i, 1))) = brr(4, .Item(arr(i, 1))) + arr(i, 4)
  97.           brr(3, .Item(arr(i, 1))) = arr(i, 3)
  98.           'brr(3, .Item(arr(i, 1))) = brr(4, .Item(arr(i, 1))) / brr(2, .Item(arr(i, 1))) '是否应该是平均单价?。。。
  99.       End If
  100.     Next
  101.     Range("A13").Resize(UBound(brr, 2), 4) = Application.Transpose(brr) '导出数组brr到单元格
  102.   End With
  103. End Sub


  104. Sub 多条件求和()
  105. '这题的方法和上题几乎一模一样。。。不同处下面已标注译
  106.   Dim arr(), brr(), i As Byte, j As Byte
  107.   arr = Range("A2:C6").Value
  108.   With CreateObject("scripting.dictionary")
  109.     For i = 1 To UBound(arr)
  110.       If Not .exists(arr(i, 1) & "|" & arr(i, 2)) Then '将产品与规格合并,视为一个字段作为字典的key
  111.         j = j + 1
  112.         .Item(arr(i, 1) & "|" & arr(i, 2)) = j
  113.         ReDim Preserve brr(1 To 3, 1 To j)
  114.           brr(1, j) = arr(i, 1)
  115.           brr(2, j) = arr(i, 2)
  116.           brr(3, j) = arr(i, 3)
  117.       Else
  118.           brr(3, .Item(arr(i, 1) & "|" & arr(i, 2))) = brr(3, .Item(arr(i, 1) & "|" & arr(i, 2))) + arr(i, 3)
  119.       End If
  120.     Next
  121.     Range("A11").Resize(UBound(brr, 2), 3) = Application.Transpose(brr)
  122.   End With
  123. End Sub
复制代码
通用sub过程
  1. Sub 求不重复值1()
  2.   Call distinct(Range("A1:A12"), Range("C14:C15"))
  3. End Sub

  4. Sub 求不重复值2()
  5.   Call distinct(Range("A1:A12"), Range("D2"), , 1)
  6. End Sub

  7. Sub distinct(RngSource As Range, RngOutput As Range, Optional compare As Byte, Optional ListBy As Byte)
  8.   If ListBy <> 1 And ListBy <> 2 And ListBy <> 0 Then MsgBox "请输入正确的显示方式(1为按列排列,2为按行排列)", , "提示": Exit Sub
  9.   If compare <> 0 And compare <> 1 Then MsgBox "请输入正确的比较方式(1为不区分大小写,0为区分大小写)", , "提示": Exit Sub
  10.   Dim arr(), ar
  11.   arr = RngSource.Value
  12.   With CreateObject("Scripting.Dictionary")
  13.     .comparemode = compare
  14.     For Each ar In arr
  15.       If Not .exists(ar) Then .Item(ar) = ""
  16.     Next
  17.   RngOutput.Resize(IIf(ListBy = 1 Or ListBy = 0, .Count, 1), IIf(ListBy = 2, .Count, 1)) = IIf(ListBy = 2, .keys, Application.Transpose(.keys))
  18.   End With
  19. End Sub
复制代码

评分

参与人数 1 +2 金币 +20 收起 理由
无聊的疯子 + 2 + 20 结果正确,自定义过程略为复杂,

查看全部评分

回复

使用道具 举报

发表于 2013-11-14 22:03 | 显示全部楼层
  1. Option Explicit

  2. Sub 求不重复值1()
  3. Dim arrData, arrRes, i, d
  4. With Sheets("求不重复值")
  5.   arrData = .Range("a1").CurrentRegion
  6.   Set d = CreateObject("scripting.dictionary")
  7.   For i = 1 To UBound(arrData)
  8.     d(arrData(i, 1)) = ""
  9.   Next
  10.   arrRes = d.keys
  11.   .Range("c2").Resize(UBound(arrRes), 1).ClearContents
  12.   .Range("c2").Resize(UBound(arrRes) + 1, 1) = Application.Transpose(arrRes)
  13. End With
  14. End Sub

  15. Sub 求不重复值2()
  16. Dim arrData, arrRes, i, d
  17. With Sheets("求不重复值")
  18.   arrData = .Range("a1").CurrentRegion
  19.   Set d = CreateObject("scripting.dictionary")
  20.   For i = 1 To UBound(arrData)
  21.     If Not d.exists(UCase(arrData(i, 1))) Then d(arrData(i, 1)) = ""
  22.   Next
  23.   arrRes = d.keys
  24.   .Range("d2").Resize(UBound(arrRes), 1).ClearContents
  25.   .Range("d2").Resize(UBound(arrRes) + 1, 1) = Application.Transpose(arrRes)
  26. End With
  27. End Sub

  28. Sub 双向求值()
  29. Dim arrData, i, d
  30. Set d = CreateObject("scripting.dictionary")
  31. arrData = Sheets("双向查找").Range("a1").CurrentRegion
  32. For i = 1 To UBound(arrData)
  33.   d(arrData(i, 1)) = arrData(i, 2)
  34.   d(arrData(i, 2)) = arrData(i, 1)
  35. Next
  36. MsgBox d(Sheets("双向查找").Range("d3").Value)
  37. End Sub

  38. Sub 多条件查找()
  39. Dim arrData, arrRes, i, d
  40. Set d = CreateObject("scripting.dictionary")
  41. With Sheets("多条件查找")
  42.   .Range("c12:D13").ClearContents
  43.   arrRes = .Range("a12:d13")
  44.   arrData = .Range("a1").CurrentRegion
  45.   For i = 2 To UBound(arrData)
  46.     d(arrData(i, 1) & "|" & arrData(i, 2)) = CStr(arrData(i, 3)) & "|" & CStr(arrData(i, 4))
  47.   Next
  48.   For i = 1 To 2
  49.     If d.exists(arrRes(i, 1) & "|" & arrRes(i, 2)) Then
  50.       arrRes(i, 3) = Split(d(arrRes(i, 1) & "|" & arrRes(i, 2)), "|")(0)
  51.       arrRes(i, 4) = Split(d(arrRes(i, 1) & "|" & arrRes(i, 2)), "|")(1)
  52.     End If
  53.   Next
  54.   .Range("a12").Resize(UBound(arrRes), UBound(arrRes, 2)) = arrRes
  55. End With
  56. End Sub

  57. Sub 单条件求和()
  58. Dim arrData, i, d, arrRes(1 To 2)
  59. arrData = Sheets("单条件求和").Range("a1").CurrentRegion.Offset(1)
  60. Set d = CreateObject("scripting.dictionary")
  61. For i = 1 To UBound(arrData) - 1
  62.   d(arrData(i, 2)) = arrData(i, 3) + d(arrData(i, 2))
  63. Next
  64.   arrRes(1) = d.keys
  65.   arrRes(2) = d.items
  66.   Sheets("单条件求和").Range("e2").Resize(UBound(arrRes(1)) + 1, 1) = Application.Transpose(arrRes(1))
  67.   Sheets("单条件求和").Range("f2").Resize(UBound(arrRes(2)) + 1, 1) = Application.Transpose(arrRes(2))
  68. End Sub

  69. Sub 多列求和()
  70. Dim arrData, i, arrRes(1 To 2, 1 To 4), d
  71. With Sheets("多列求和")
  72.   arrData = .Range("a1").CurrentRegion
  73.   Set d = CreateObject("scripting.dictionary")
  74.   For i = 2 To UBound(arrData)
  75.     If Not d.exists(arrData(i, 1)) Then
  76.       d(arrData(i, 1)) = d.Count + 1
  77.     End If
  78.     arrRes(d(arrData(i, 1)), 1) = arrData(i, 1)
  79.     arrRes(d(arrData(i, 1)), 2) = arrRes(d(arrData(i, 1)), 2) + arrData(i, 2)
  80.     arrRes(d(arrData(i, 1)), 3) = arrData(i, 3)
  81.     arrRes(d(arrData(i, 1)), 4) = arrRes(d(arrData(i, 1)), 4) + arrData(i, 4)
  82.   Next
  83.   .Range("A13").Resize(2, 4) = arrRes
  84. End With
  85. End Sub

  86. Sub 多条件求和()
  87. Dim arrData, arrRes(), i, d
  88. With Sheets("多条件求和")
  89.   arrData = .Range("a1").CurrentRegion
  90.   ReDim arrRes(1 To UBound(arrData), 1 To UBound(arrData, 2))
  91.   Set d = CreateObject("scripting.dictionary")
  92.   For i = 2 To UBound(arrData)
  93.       If Not d.exists(arrData(i, 1) & "|" & arrData(i, 2)) Then
  94.         d(arrData(i, 1) & "|" & arrData(i, 2)) = d.Count + 1
  95.         arrRes(d.Count, 1) = arrData(i, 1)
  96.         arrRes(d.Count, 2) = arrData(i, 2)
  97.         arrRes(d.Count, 3) = arrData(i, 3)
  98.       Else
  99.         arrRes(d(arrData(i, 1) & "|" & arrData(i, 2)), 3) = arrRes(d(arrData(i, 1) & "|" & arrData(i, 2)), 3) + arrData(i, 3)
  100.       End If
  101.   Next
  102.   .Range("a11").Resize(UBound(arrData), UBound(arrData, 2)) = arrRes
  103. End With

  104. End Sub
复制代码

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-15 09:22 | 显示全部楼层
本帖最后由 hrpotter 于 2013-11-15 13:05 编辑
  1. Option Explicit
  2. Sub 求不重复值1()
  3.     Dim arr, brr
  4.     arr = Range("a1").CurrentRegion      '将待处理数据放入数组
  5.     求不重复值 arr, brr                  '调用过程求不重复值,第三参数省略,区分大小写
  6.     Range("c2:c12").ClearContents
  7.     Range("c2").Resize(UBound(brr)) = brr
  8. End Sub
  9. Sub 求不重复值2()
  10.     Dim arr, brr
  11.     arr = Range("a1").CurrentRegion      '将待处理数据放入数组
  12.     求不重复值 arr, brr, False           '调用过程求不重复值,第三参数false,不区分大小写
  13.     Range("d2:d12").ClearContents
  14.     Range("d2").Resize(UBound(brr)) = brr
  15. End Sub
  16. Sub 求不重复值(arr As Variant, brr As Variant, Optional cm As Boolean = True)
  17. '第一参数为源数据,第二参数为结果数组,第三参数为是否区分大小写,默认为true
  18.     Dim d As Object, i As Long, j As Long
  19.     Set d = CreateObject("scripting.dictionary") '创建字典
  20.     If cm = False Then                           '如果第三参数为false
  21.         d.comparemode = vbTextCompare            '使用文本比较,不区分大小写
  22.     End If
  23.     If IsArray(arr) Then                         '如果源数据为数组
  24.         For i = 1 To UBound(arr)                 '循环数组添加字典
  25.             For j = 1 To UBound(arr, 2)
  26.                 d(arr(i, j)) = ""
  27.             Next
  28.         Next
  29.     Else                                         '如果源数据不为数组
  30.         d(arr) = ""                              '直接添加字典
  31.     End If
  32.     brr = Application.Transpose(d.keys)          '将字典关键字转化为数组输出
  33. End Sub
  34. Sub 双向求值()
  35.     Dim arr, d
  36.     Dim i As Long
  37.     Set d = CreateObject("scripting.dictionary")
  38.     arr = Range("a1").CurrentRegion
  39.     For i = 2 To UBound(arr)
  40.         d(arr(i, 1)) = arr(i, 2)                 '将城市名放入key,简写放入item
  41.         d(arr(i, 2)) = arr(i, 1)                 '将简写放入key,城市名放入item
  42.     Next
  43.     MsgBox d(Range("d3").Value)
  44. End Sub
  45. Sub 多条件查找()
  46.     Dim arr, d, brr(1 To 2, 1 To 2)
  47.     Dim i As Long
  48.     Set d = CreateObject("scripting.dictionary")  '创建字典
  49.     arr = Range("a1").CurrentRegion
  50.     For i = 2 To UBound(arr)
  51.         d(arr(i, 1) & "|" & arr(i, 2)) = arr(i, 3) & "|" & arr(i, 4)
  52.         '将产品和规格以“|”连接放入key,将数量和单价以"|"连接放入item
  53.     Next
  54.     arr = Range("a12:b13")
  55.     For i = 1 To 2
  56.         brr(i, 1) = Split(d(arr(i, 1) & "|" & arr(i, 2)), "|")(0)    '取出对应产品和规格的对应的数量
  57.         brr(i, 2) = Split(d(arr(i, 1) & "|" & arr(i, 2)), "|")(1)    '出出对应产品和规格的对应的单价
  58.     Next
  59.     Range("c12").Resize(2, 2) = brr
  60. End Sub
  61. Sub 单条件求和()
  62.     Dim arr, d
  63.     Dim i As Long
  64.     Set d = CreateObject("scripting.dictionary")                  '创建字典
  65.     arr = Range("a1").CurrentRegion
  66.     For i = 2 To UBound(arr)
  67.         d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 3)                   '循环数组,相同产品名的,数量累加
  68.     Next
  69.     Range("e2:f1000").ClearContents
  70.     Range("e2").Resize(d.Count) = Application.Transpose(d.keys)   '将产品名写入
  71.     Range("f2").Resize(d.Count) = Application.Transpose(d.items)  '将对应的汇总数量写入
  72. End Sub
  73. Sub 多列求和()
  74.     Dim arr, d, brr(1 To 100, 1 To 4)
  75.     Dim i As Long, j As Long, k As Long, n As Long
  76.     Set d = CreateObject("scripting.dictionary")      '创建字典
  77.     arr = Range("a1").CurrentRegion
  78.     For i = 2 To UBound(arr)
  79.         If d.exists(arr(i, 1)) Then                   '如果产品在字典中存在
  80.             j = d(arr(i, 1))                          '取出产品在字典中对应的数字即结果数组中的对应行
  81.             brr(j, 2) = brr(j, 2) + arr(i, 2)         '结果数组中对应的累计数量加源数据数组中的数量
  82.             brr(j, 3) = arr(i, 3)                     '结果数组中对应的单价等于源数据数组中的单价
  83.             brr(j, 4) = brr(j, 4) + arr(i, 4)         '结果数组中对应的累计金额加源数据数组中的金额
  84.         Else                                          '如果该产品在字典中不存在
  85.             k = k + 1                                 '字典key增加一条
  86.             d(arr(i, 1)) = k                          '以产品为key,字典的条目数量为item增加一条
  87.             For n = 1 To 4                            '循环将源数据数组产品数量单价金额依次赋入结果数组
  88.                 brr(k, n) = arr(i, n)
  89.             Next
  90.         End If
  91.     Next
  92.     Range("a13:d100").ClearContents
  93.     Range("a13").Resize(k, 4) = brr                   '赋值
  94. End Sub
  95. Sub 多条件求和()
  96.     Dim d, arr, brr(1 To 100, 1 To 3)
  97.     Dim i As Long, j As Long, k As Long, n As Long, s As String
  98.     Set d = CreateObject("scripting.dictionary")                 '创建字典
  99.     arr = Range("a1").CurrentRegion
  100.     For i = 2 To UBound(arr)
  101.         s = arr(i, 1) & "|" & arr(i, 2)                '将产品和规格用"|"连接放放字符串s中
  102.         If d.exists(s) Then                            '如果以s为key在字典中存在
  103.             j = d(s)                                   '取出s为key对应的item即结果数组中的行数
  104.             brr(j, 3) = brr(j, 3) + arr(i, 3)          '结果数组对应的数量累加当前数组中对应的数量
  105.         Else                                           '如果不存在,计数累加,字典中增加一条新的key
  106.             k = k + 1
  107.             d(arr(i, 1) & "|" & arr(i, 2)) = k
  108.             For n = 1 To 3                             '将源数据数组中的数据赋值给结果数组
  109.                 brr(k, n) = arr(i, n)
  110.             Next
  111.         End If
  112.     Next
  113.     Range("a11:c20").ClearContents
  114.     Range("a11").Resize(k, 3) = brr                    '赋值
  115. End Sub
复制代码

评分

参与人数 1 +3 金币 +20 收起 理由
无聊的疯子 + 3 + 20 结果正确,公用过程的byref利用得很好

查看全部评分

回复

使用道具 举报

发表于 2013-11-16 09:37 | 显示全部楼层
本帖最后由 sayloveyou2010 于 2013-11-17 00:18 编辑

字典数组班C01:小妮子

  1. '第一题:
  2. Sub 求不重复值1()
  3.     Dim dic As New Dictionary, arr(), x%
  4.     arr = Range("A1:A" & Cells(Rows.Count, 1).End(3).Row) '把数据装入数组
  5.     dic.CompareMode = 0 '区分大小写
  6.     For x = 1 To UBound(arr)
  7.         If Not dic.Exists(arr(x, 1)) Then '如果不存在
  8.             dic.Add arr(x, 1), "" '将关键字添加到字典
  9.         End If
  10.     Next x
  11.     [C2].Resize(dic.Count, 1) = Application.Transpose(dic.Keys) '读出
  12.     Set dic = Nothing
  13.     Erase arr
  14. End Sub

  15. Sub 求不重复值2()
  16.     Dim dic As New Dictionary, arr(), x%
  17.     arr = Range("A1:A" & Cells(Rows.Count, 1).End(3).Row) '把数据装入数组
  18.     dic.CompareMode = 1 '不区分大小写
  19.     For x = 1 To UBound(arr)
  20.         If Not dic.Exists(arr(x, 1)) Then '如果不存在
  21.             dic.Add arr(x, 1), "" '将关键字添加到字典
  22.         End If
  23.     Next x
  24.     [d2].Resize(dic.Count, 1) = Application.Transpose(dic.Keys) '读出
  25.     Set dic = Nothing
  26.     Erase arr
  27. End Sub
  28. Sub 附加题()
  29.     Dim rgSource As Range
  30.     Dim rgDest As Range
  31.     Dim bMold

  32.     On Error Resume Next
  33.     Set rgSource = Application.InputBox("请选择需要分组的单元格区域", "选择", Type:=8)
  34.     '通过对话框选择要去重的单元格区域
  35.     If rgSource Is Nothing Then
  36.         MsgBox "没有选择要去重的单元格区域"
  37.         Exit Sub
  38.     End If

  39.     Set rgDest = Application.InputBox("请选择去重数据写入的位置", "选择", Type:=8)
  40.     '通过对话框选择分组后的数据需写入的单元格
  41.     If rgDest Is Nothing Then
  42.         MsgBox "没有选择要去重的单元格区域"
  43.         Exit Sub
  44.     End If

  45.     bMold = Application.InputBox("请输入要去重的类型,0区分大小写,1不区分大小写)", "选择", Default:=0, Type:=2)
  46.     '通过对话框输入是否区分大小写
  47.     If Val(bMold) > 1 Or Val(bMold) < 0 Then
  48. '        检测行数的合法性
  49.         MsgBox prompt:="输入的类型不对" & String(2, vbCrLf) & "请输入有效数字", Title:="错误提示"
  50.         Exit Sub
  51.     End If

  52.     Call 去重(rgSource, rgDest, Val(bMold))
  53.     '调用分组过程
  54. End Sub
  55. Sub 去重(rgSource As Range, rgDest As Range, bMold As Byte)
  56.     Dim dic As New Dictionary, arr(), x%, y%
  57.     arr = rgSource.Value '将选区数据装入数组arr
  58.     If bMold = 0 Then
  59.         dic.CompareMode = 0 '区分大小写
  60.     Else
  61.         dic.CompareMode = 1 '不区分大小写
  62.     End If
  63.     For x = 1 To UBound(arr)
  64.         For y = 1 To UBound(arr, 2)
  65.             If Not dic.Exists(arr(x, y)) Then '如果不存在
  66.                 dic.Add arr(x, y), "" '将关键字添加到字典
  67.             End If
  68.         Next y
  69.     Next x
  70.     rgDest.Resize(dic.Count, 1) = Application.Transpose(dic.Keys) '读出
  71.     Set dic = Nothing
  72.     Erase arr
  73. End Sub
  74. '第二题:
  75. Sub 双向求值()
  76.     Dim dic As New Dictionary, arr(), x%, x1%, Mys$
  77.     arr = Range("A1:B" & Cells(Rows.Count, 1).End(3).Row) '把数据装入数组
  78.     Mys = [d3]
  79.     If Left(Mys, 1) Like "[a-z]" Then '判断是否字母
  80.         For x = 1 To UBound(arr)
  81.             dic.Add arr(x, 2), arr(x, 1) '添加字典
  82.         Next x
  83.     ElseIf Not (IsNumeric(Left(Mys, 1))) Then '判断是否汉字
  84.         For x = 1 To UBound(arr)
  85.             dic.Add arr(x, 1), arr(x, 2) '添加字典
  86.         Next x
  87.     End If
  88.     arr = Range("d3:e3")
  89.     arr(1, 2) = dic.Item(arr(1, 1)) '查找
  90.     [d3].Resize(1, 2) = arr '读出
  91.     Set dic = Nothing
  92.     Erase arr
  93. End Sub
  94. '第三题:
  95. Sub 多条件查找()
  96.     Dim dic As New Dictionary, arr(), brr(), x%, y%, m$, n$
  97.     arr = Range("A2:d5")
  98.     brr = Range("A12:D13")
  99.     For x = 1 To UBound(arr)
  100.         m = arr(x, 1) & vbTab & arr(x, 2) '条件key连接
  101.         n = arr(x, 3) & "/" & arr(x, 4) 'item连接
  102.         dic.Add m, n '增加字典
  103.     Next x
  104.     For x = 1 To UBound(brr)
  105.         m = brr(x, 1) & vbTab & brr(x, 2) '结果数组里的key连接
  106.         If dic.Exists(m) Then '甉在字典中是否存在
  107.             brr(x, 3) = Split(dic.Item(m), "/")(0) '取值
  108.             brr(x, 4) = Split(dic.Item(m), "/")(1) '取值
  109.         Else
  110.             MsgBox "未找到相关内容"
  111.         End If
  112.     Next x
  113.     [A12].Resize(2, 4) = brr
  114.     Erase arr, brr
  115.     Set dic = Nothing
  116. End Sub
  117. '第四题:
  118. Sub 单条件求和()
  119.     Dim dic As New Dictionary, arr(), brr(), x%, k%, y%
  120.     arr = Range("A2:C" & Cells(Rows.Count, 1).End(3).Row) '把数据装入数组
  121.     ReDim brr(1 To UBound(arr), 1 To 2) '重新定义结果数组
  122.     For x = 1 To UBound(arr)
  123.         If dic.Exists(arr(x, 2)) Then '判断是否存在,如果存在
  124.             brr(dic(arr(x, 2)), 2) = brr(dic(arr(x, 2)), 2) + arr(x, 3) '累加数量
  125.         Else
  126.             k = k + 1 '计数器
  127.             dic.Add arr(x, 2), k '添加
  128.             brr(k, 1) = arr(x, 2) '产品
  129.             brr(k, 2) = arr(x, 3) '数量
  130.         End If
  131.     Next x
  132.     [E2].Resize(k, 2) = brr '读出
  133.     Erase arr, brr
  134.     Set dic = Nothing
  135. End Sub
  136. '第五题:
  137. Sub 多列求和()
  138.     Dim dic As New Dictionary, arr(), brr(), x%, m$, k%, y%
  139.     arr = Range("A2:D6")
  140.     ReDim brr(1 To UBound(arr), 1 To 4)
  141.     For x = 1 To UBound(arr)
  142.         If Not dic.Exists(arr(x, 1)) Then '判断是否存在
  143.             k = k + 1 '计数器
  144.             dic.Add arr(x, 1), k '增加字典
  145.             For y = 1 To UBound(brr, 2)
  146.                 brr(k, y) = arr(x, y) '相关内容写入结果数组
  147.             Next y
  148.         Else '已存在则
  149.             For y = 2 To UBound(brr, 2)
  150.                 brr(dic(arr(x, 1)), y) = brr(dic(arr(x, 1)), y) + arr(x, y) '累加
  151.             Next y
  152.         End If
  153.     Next x
  154.     For x = 1 To UBound(arr)
  155.         brr(dic(arr(x, 1)), 3) = arr(x, 3) '修改单价
  156.     Next x
  157.     [A13].Resize(UBound(brr), 4) = brr '读出
  158.     Erase arr, brr
  159.     Set dic = Nothing
  160. End Sub
  161. '第六题:
  162. Sub 多条件求和()
  163.     Dim dic As New Dictionary, arr(), x%, m$, k%
  164.     arr = Range("A2:C6")
  165.     ReDim brr(1 To UBound(arr), 1 To 3)
  166.     For x = 1 To UBound(arr)
  167.         m = arr(x, 1) & vbTab & arr(x, 2) '连接条件key
  168.         If Not dic.Exists(m) Then '判断是否存在
  169.             k = k + 1
  170.             dic.Add m, k '添加字典
  171.             brr(x, 1) = Split(m, vbTab)(0) '产品
  172.             brr(x, 2) = Split(m, vbTab)(1)
  173.             brr(x, 3) = brr(x, 3) + arr(x, 3) '规格
  174.         Else
  175.             brr(dic.Item(m), 3) = brr(dic.Item(m), 3) + arr(x, 3) '累加数量
  176.         End If
  177.     Next x
  178.     [A11].Resize(UBound(brr), 3) = brr '读出
  179.     Erase arr, brr
  180.     Set dic = Nothing
  181. End Sub
复制代码

评分

参与人数 1 +2 金币 +20 收起 理由
无聊的疯子 + 2 + 20 结果正确,公用过程直接改的,会偷懒

查看全部评分

回复

使用道具 举报

发表于 2013-11-16 10:59 | 显示全部楼层
本帖最后由 箫风 于 2013-11-16 19:22 编辑

C05:箫风

  1. Sub 求不重复值1()
  2.     不重复值 0, "C"
  3. End Sub

  4. Sub 求不重复值2()
  5.     不重复值 1, "D"
  6. End Sub
  7. '通过设置字典的比较模式参数实现区分大小写和不区分大小写,设置列参数以将不同的去重方式放入相应的位置
  8. Sub 不重复值(dm As Integer, rg As String)
  9.     Dim arr()
  10.     Dim i As Integer
  11.     Dim d As New Dictionary
  12.     d.CompareMode = dm
  13.     Range(rg & "2" & ":" & rg & 100).ClearContents
  14.     arr = Range("A1:A12").Value
  15.     For i = LBound(arr) To UBound(arr)
  16.         d(arr(i, 1)) = ""
  17.     Next i
  18.     Range(rg & "2").Resize(d.Count) = Application.WorksheetFunction.Transpose(d.Keys)
  19. End Sub

  20. Sub 双向求值()
  21.     Dim arr()
  22.     Dim i As Integer
  23.     Dim d1 As New Dictionary
  24.     Dim d2 As New Dictionary
  25.     arr = Range("A2:B6").Value
  26.     '将城市、简写和简写、城市分别放入不同的字典以实现双向查找
  27.     For i = LBound(arr) To UBound(arr)
  28.         d1(arr(i, 1)) = arr(i, 2)
  29.         d2(arr(i, 2)) = arr(i, 1)
  30.     Next i
  31.     '通过判断要查找的内容是城市名称还是拼音简写实现不同的查找
  32.     If VBA.Asc(Range("D3")) >= 65 And VBA.Asc(Range("D3")) <= 122 Then
  33.         MsgBox d2.Item(Range("D3").Value)
  34.     Else
  35.         MsgBox d1.Item(Range("D3").Value)
  36.     End If
  37. End Sub
  38. Sub 单条件求和()
  39.     Dim arr()
  40.     Dim i As Integer, j As Integer
  41.     Dim d As New Dictionary
  42.     Range("E2:F3").ClearContents
  43.     arr = Range("B2:C5").Value
  44.     '将产品名称放入字典以剔除重复的产品名称
  45.     For i = LBound(arr) To UBound(arr)
  46.         d(arr(i, 1)) = ""
  47.     Next i
  48.     ReDim arr2(d.Count - 1)
  49.     '通过两层循环,将数据源中的数量汇总至同类的产品名称中
  50.     For i = 0 To d.Count - 1
  51.         For j = LBound(arr) To UBound(arr)
  52.             If arr(j, 1) = d.Keys(i) Then
  53.                 arr2(i) = arr2(i) + arr(j, 2)
  54.             End If
  55.         Next j
  56.     Next i
  57.     Range("E2").Resize(d.Count) = Application.WorksheetFunction.Transpose(d.Keys)
  58.     Range("F2").Resize(d.Count) = Application.WorksheetFunction.Transpose(arr2)
  59. End Sub

  60. Sub 多条件查找()
  61.     Dim i As Integer
  62.     Dim arr1
  63.     Dim d1 As New Dictionary
  64.     Dim d2 As New Dictionary
  65.     Range("C12:D100").ClearContents
  66.     arr1 = Range("A2:D5")
  67.     '将产品和规格连成一个字符串放入字典以剔除重复的产品和规格
  68.     For i = LBound(arr1, 1) To UBound(arr1, 1)
  69.         d1.Add arr1(i, 1) & arr1(i, 2), arr1(i, 3)
  70.         d2.Add arr1(i, 1) & arr1(i, 2), arr1(i, 4)
  71.     Next i
  72.     '在数据源中查找相应的产品和规格的数量和单价
  73.     For i = 1 To 2
  74.         Range("C" & i + 11) = d1(Range("A" & i + 11).Value & Range("B" & i + 11).Value)
  75.         Range("D" & i + 11) = d2(Range("A" & i + 11).Value & Range("B" & i + 11).Value)
  76.     Next i
  77. End Sub

  78. Sub 多列求和()
  79. Dim arr()
  80.     Dim i As Integer, j As Integer
  81.     Dim d As New Dictionary
  82.     Range("A13:D100").ClearContents
  83.     arr = Range("A2:D6").Value
  84.     '将产品名称放入字典以剔除重复的产品名称
  85.     For i = LBound(arr) To UBound(arr)
  86.         d(arr(i, 1)) = ""
  87.     Next i
  88.     ReDim arr1(1 To d.Count, 1 To 4)
  89.     '通过两层循环,将数据源中的数量、单价和金额汇总至同类的产品名称中
  90.     For i = 1 To d.Count
  91.         For j = LBound(arr, 1) To UBound(arr, 1)
  92.         arr1(i, 1) = d.Keys(i - 1)
  93.         If arr(j, 1) = d.Keys(i - 1) Then
  94.             arr1(i, 2) = arr1(i, 2) + arr(j, 2)
  95.             arr1(i, 3) = arr(j, 3)
  96.             arr1(i, 4) = arr1(i, 4) + arr(j, 4)
  97.         End If
  98.         Next j
  99.     Next i
  100. Range("A13").Resize(d.Count, 4) = arr1
  101. End Sub

  102. Sub 多条件求和()
  103.     Dim i As Integer, j As Integer
  104.     Dim arr1
  105.     Dim d As New Dictionary
  106.     Range("A11:C100").ClearContents
  107.     arr1 = Range("A2:C6")
  108.     '将产品和规格连成一个字符串放入字典以剔除重复的产品和规格
  109.     For i = LBound(arr1, 1) To UBound(arr1, 1)
  110.         d(arr1(i, 1) & arr1(i, 2)) = ""
  111.     Next i
  112.     ReDim arr2(1 To d.Count, 1 To 3)
  113.     '通过两层循环,将数据源中的数量累加至同类的产品和规格中
  114.     For i = 1 To d.Count
  115.         For j = LBound(arr1, 1) To UBound(arr1, 1)
  116.             arr2(i, 1) = VBA.Left(d.Keys(i - 1), 1)
  117.             arr2(i, 2) = VBA.Right(d.Keys(i - 1), 2)
  118.             If arr1(j, 1) & arr1(j, 2) = d.Keys(i - 1) Then
  119.                 arr2(i, 3) = arr2(i, 3) + arr1(j, 3)
  120.             End If
  121.         Next j
  122.     Next i
  123.     Range("A11").Resize(UBound(arr2, 1), UBound(arr2, 2)) = arr2
  124. End Sub
复制代码

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 00:43 | 显示全部楼层
……

C04-笨熊猫.rar

54.78 KB, 下载次数: 21

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 00:56 | 显示全部楼层
c02:monicaj
Option Explicit

Sub 求不重复值1()
    Dim arr   '用于存放源数据
    Dim i As Integer

    Dim d As New Dictionary
    d.CompareMode = BinaryCompare   '设置为区分大小写

    arr = Range("a1:a12")
    For i = 1 To UBound(arr)


        d(arr(i, 1)) = ""   '将源数据存入字典,重复的自动覆盖
    Next
    Range("c2").Resize(d.Count) = Application.Transpose(d.Keys)


End Sub

Sub 求不重复值2()
    Dim arr   '用于存放源数据
    Dim i As Integer

    Dim d As New Dictionary
    d.CompareMode = TextCompare   '设置为不区分大小写

    arr = Range("a1:a12")
    For i = 1 To UBound(arr)


        d(arr(i, 1)) = ""   '将源数据存入字典,重复的自动覆盖
    Next
    Range("d2").Resize(d.Count) = Application.Transpose(d.Keys)


End Sub

Sub 双向求值()
    Dim arr   '用于存放源数据
    Dim i As Integer

    Dim d As New Dictionary

    arr = Range("a2:b6")
    For i = 1 To UBound(arr)


        d(arr(i, 1)) = arr(i, 2)   '将两列源数据分别存入字典,重复的自动覆盖

        d(arr(i, 2)) = arr(i, 1)
    Next
    MsgBox d(Range("d3").Value)



End Sub

Sub 多条件查找()
    Dim arr   '用于存放源数据
    Dim i As Integer
    Dim str1 As String  '用于将结果第一行产品和规格连接起来,统一查找
    Dim str2 As String    '用于将结果第二行产品和规格连接起来,统一查找
    Dim str As String    '用于将源数据产品和规格连接起来,统一查找



    Dim d1 As New Dictionary   '用于存放数量列
    Dim d2 As New Dictionary   '用于存放单价列


    arr = Range("a2:d5")
    For i = 1 To UBound(arr)

        str = arr(i, 1) & "-" & arr(i, 2)
        d1(str) = arr(i, 3)   '将产品规格连接作为key,item存放数量列
        d2(str) = arr(i, 4)     '将产品规格连接作为key,item存放单价列

    Next
    str1 = Range("a12") & "-" & Range("b12")   '将产品规格连接起来查找
    str2 = Range("a13") & "-" & Range("b13")

    If d1.Exists(str1) Then

        Range("c12") = d1(str1)
        Range("d12") = d2(str1)
    Else

        Range("c12") = 0   '如果是不存在的产品、规格组合,设定数量、单价为0

        Range("d12") = 0
    End If

    If d1.Exists(str2) Then

        Range("c13") = d1(str2)
        Range("d13") = d2(str2)
    Else

        Range("c13") = 0
        Range("d13") = 0
    End If

End Sub

Sub 单条件求和()
    Dim arr   '用于存放源数据
    Dim i As Integer

    Dim d As New Dictionary

    arr = Range("b2:c5")
    For i = 1 To UBound(arr)


        d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)    '将两列源数据分别存入字典,字典的item值是在原基础上加新的数量


    Next
    Range("e2").Resize(d.Count) = Application.Transpose(d.Keys)
    Range("f2").Resize(d.Count) = Application.Transpose(d.Items)


End Sub

Sub 多列求和()
    Dim arr   '用于存放源数据
    Dim i As Integer
    Dim k As Integer      '用于某产品首次出现在结果数组中的计数
    Dim brr(1 To 10, 1 To 4)    '用于存放结果数据
    Dim line As Integer     '用于记录某产品在结果数组中的行数

    Dim d As New Dictionary

    arr = Range("a2:d6")



    For i = 1 To UBound(arr)
        If d.Exists(arr(i, 1)) = False Then   '如果某产品不存在于字典中

            k = k + 1     '计数器加1,作为在brr中的行数
            d(arr(i, 1)) = k    '将产品名称作为key,将其在brr中的行数计入字典的item

            brr(k, 1) = arr(i, 1)    '将该行数据计入结果数组中

            brr(k, 2) = arr(i, 2)


            brr(k, 4) = arr(i, 4)
            brr(k, 3) = arr(i, 4) / arr(i, 2)
        Else    '如果某产品已经存在于字典中

            line = d(arr(i, 1))    '读取在结果数组中的行数
            brr(line, 2) = brr(line, 2) + arr(i, 2)    '以下三行,将现有的数量、金额加到在结果数组中的所在行,计算单价


            brr(line, 4) = brr(line, 4) + arr(i, 4)

            brr(line, 3) = brr(line, 4) / brr(line, 2)
        End If


    Next
    Range("a13").Resize(UBound(brr), 4) = brr

End Sub


Sub 多条件求和()
    Dim arr   '用于存放源数据
    Dim i As Integer
    Dim str As String
    Dim k As Integer    '用于某产品首次出现在结果数组中的计数
    Dim line As Integer     '用于记录某产品在结果数组中的行数

    Dim brr(1 To 10, 1 To 3)    '用于存放结果数据

    Dim d As New Dictionary

    arr = Range("a2:c6")
    For i = 1 To UBound(arr)

        str = arr(i, 1) & "-" & arr(i, 2)   '用于将产品和规格连接起来,统一查找

        If d.Exists(str) = False Then   '如果某产品不存在于字典中
            k = k + 1     '计数器加1,作为在brr中的行数

            d(str) = k    '将产品名称和规格作为key,将其在brr中的行数计入字典的item
            brr(k, 1) = arr(i, 1)    '将该行数据计入结果数组中
            brr(k, 2) = arr(i, 2)
            brr(k, 3) = arr(i, 3)
        Else
            line = d(str)   '读取在结果数组中的行数
            brr(line, 3) = brr(line, 3) + arr(i, 3)   '将现有的数量加到在结果数组中的所在行




        End If
        Range("a11").Resize(UBound(brr), 3) = brr


    Next

End Sub

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确,下次请以发代码方式发贴

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 12:59 | 显示全部楼层
本帖最后由 cxloen 于 2013-11-17 16:11 编辑

{:011:}

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

52.08 KB, 下载次数: 36

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 16:46 | 显示全部楼层
  1. Option Explicit

  2. Sub 求不重复值1()
  3.     Dim arr, s
  4.     Dim d As New Dictionary '定义一个字典对象
  5.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  6.     For Each s In arr '遍历数组
  7.         If Not d.Exists(s) Then d.Add s, "" '判断每一数组元素是否已在字典对象中,如果没有,则增加到字典中
  8.     Next
  9.     Range("c2").Resize(10000).ClearComments '清空指定单元格区域内容
  10.     Range("c2").Resize(d.Count) = Application.Transpose(d.Keys) '将字典的关键字放入指定单元格
  11.     Set d = Nothing '释放字典对象
  12. End Sub

  13. Sub 求不重复值2()
  14.     Dim arr, s
  15.     Dim d As New Dictionary '定义一个字典对象
  16.     d.CompareMode = TextCompare  '字典对象的字符串比较模式为文本比较,即不区分大小写
  17.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  18.     For Each s In arr '遍历数组
  19.         If Not d.Exists(s) Then d.Add s, "" '判断每一数组元素是否已在字典对象中,如果没有,则增加到字典中
  20.     Next
  21.     Range("d2").Resize(10000).ClearComments '清空指定单元格区域内容
  22.     Range("d2").Resize(d.Count) = Application.Transpose(d.Keys) '将字典的关键字放入指定单元格
  23.     Set d = Nothing '释放字典对象
  24. End Sub

  25. Sub 双向求值()
  26.     Dim arr, s$, i%
  27.     Dim d As New Dictionary '定义一个字典对象
  28.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  29.     s = Range("d3").Value '将查询的内容赋给变量
  30.     For i = 1 To UBound(arr) '对数组进行循环
  31.         d.Add arr(i, 1), arr(i, 2) '将城市作关键字,简写作为项目,增加到字典中
  32.         d.Add arr(i, 2), arr(i, 1) '将项目作关键字,城市作项目,增加到字典中
  33.     Next i
  34.     MsgBox s & "对应的" & IIf(s > d.Item(s), "简写是:", "城市:") & d.Item(s) '消息框显示结果
  35.     Set d = Nothing '释放字典对象
  36. End Sub

  37. Sub 多条件查找()
  38.     Dim arr, i%, s1$, s2$
  39.     Dim d As New Dictionary '定义一个字典对象
  40.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  41.     For i = 2 To UBound(arr) '对数组进行循环
  42.          d(arr(i, 1) & "|" & arr(i, 2)) = Array(arr(i, 3), arr(i, 4)) '将产品结合规格作关键字,数量和单价的数组作业项目,增加到字典中
  43.     Next i
  44.     s1 = Range("a12") & "|" & Range("b12") '将查找的产品规格赋给一个变量
  45.     s2 = Range("a13") & "|" & Range("b13")
  46.     Range("c12:d13").ClearContents '清空指定单元格区域内容
  47.     If d.Exists(s1) Then Range("c12:d12") = d.Item(s1) '将字典的项目放入指定单元格
  48.     If d.Exists(s2) Then Range("c13:d13") = d.Item(s2)
  49.     Set d = Nothing '释放字典对象

  50. End Sub

  51. Sub 单条件求和()
  52.     Dim arr, i%
  53.     Dim d As New Dictionary '定义一个字典对象
  54.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  55.     For i = 2 To UBound(arr) '对数组进行循环
  56.          d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 3) '将产品作关键字,数量作项目,增加到字典中,并进行累计求和
  57.     Next i
  58.     Range("e2:d1000").ClearContents '清空指定单元格区域内容
  59.     Range("e2").Resize(d.Count) = Application.Transpose(d.Keys) '将字典的关键字放入指定单元格
  60.     Range("f2").Resize(d.Count) = Application.Transpose(d.Items) '将字典的项目放入指定单元格
  61.     Set d = Nothing '释放字典对象

  62. End Sub

  63. Sub 多列求和()
  64.     Dim arr, brr, temparr, i%
  65.     Dim d As New Dictionary '定义一个字典对象
  66.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  67.     For i = 2 To UBound(arr) '对数组进行循环
  68.          If d.Exists(arr(i, 1)) Then '如果关键字已经存在
  69.              temparr = d(arr(i, 1)) '将关键字对应的项目赋给一个临时数组
  70.              temparr(0) = temparr(0) + arr(i, 2) '将临时数组中的数量加上新的数量
  71.              temparr(2) = temparr(2) + arr(i, 4) '将临时数组中的金额加上新的金额
  72.              d(arr(i, 1)) = temparr '将关键字对应的项目变更为新的临时数组,实现累计求和的要求
  73.          Else '如果关键字不存在
  74.             d(arr(i, 1)) = Array(arr(i, 2), arr(i, 3), arr(i, 4)) '将产品作关键字,数量/单价/金额作项目,增加到字典中
  75.          End If
  76.     Next i
  77.     Range("a13:d1000").ClearContents '清空指定单元格区域内容
  78.     Range("a13").Resize(d.Count) = Application.Transpose(d.Keys) '将字典的关键字放入指定单元格
  79.     Range("b13").Resize(d.Count, 3) = Application.Transpose(Application.Transpose(d.Items)) '将字典的项目放入指定单元格
  80.     Set d = Nothing '释放字典对象

  81. End Sub


  82. Sub 多条件求和()
  83.     Dim arr, i%, s$, s2$
  84.     Dim d As New Dictionary '定义一个字典对象
  85.     arr = Range("a1").CurrentRegion.Value '将数据源赋给一个数组
  86.     ReDim brr(1 To UBound(arr), 1 To 3)  '重新定义一个数组大小,用于存放结果

  87.     For i = 2 To UBound(arr) '对数组进行循环
  88.         s = arr(i, 1) & "|" & arr(i, 2) '将产品结合规格赋给一个变量
  89.         If d.Exists(s) Then '如果关键字已经存在
  90.             brr(d(s), 3) = brr(d(s), 3) + arr(i, 3) '将此关键字对应的数量进行累加
  91.         Else '如果关键字不存在
  92.             d(s) = d.Count + 1 '将此变量作关键字,关键字计数作项目,增加到字典中
  93.             brr(d(s), 1) = arr(i, 1) '将产品写入数组
  94.             brr(d(s), 2) = arr(i, 2) '将规格写入数组
  95.             brr(d(s), 3) = arr(i, 3) '将数量写入数组
  96.         End If
  97.     Next i
  98.     Range("a11:c1000").ClearContents '清空指定单元格区域内容
  99.     Range("a11").Resize(d.Count, 3) = brr '将结果写入指定单元格
  100.     Set d = Nothing '释放字典对象

  101. End Sub
  102. '=====附加题
  103. Function NoRepeat(Rng As Range, Optional CompM As Byte = 0)
  104.     Dim arr, s
  105.     Dim d As New Dictionary '定义一个字典对象i
  106.    
  107.     If CompM <> 1 Or CompM <> 0 Then NoRepeat = "": Exit Function '如果第二参数不为0或1,则结果为空,退出过程
  108.    
  109.     If Rng.Count = 1 Then NoRepeat = Rng.Value: Exit Function '如果单元格区域为单个单元格,则结果为该单元格的值,退出过程
  110.    
  111.     d.CompareMode = CompM '字典对象的字符串比较模式为第二参数
  112.     arr = Rng.Value '将单元格区域的值赋给一个数组
  113.     For Each s In arr '遍历数组
  114.         If Not d.Exists(s) Then d.Add s, "" '判断每一数组元素是否已在字典对象中,如果没有,则增加到字典中
  115.     Next
  116.     NoRepeat = Application.Transpose(d.Keys) '将字典的关键字返回给过程结果
  117.     Set d = Nothing '释放字典对象
  118. End Function

复制代码
来交作业:

评分

参与人数 1 +2 金币 +20 收起 理由
无聊的疯子 + 2 + 20 结果正确

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 18:21 , Processed in 0.465304 second(s), 20 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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