Excel精英培训网

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

[通知] 【VBA字典数组201301班】B组- 第三讲作业上交处

[复制链接]
发表于 2013-11-16 16:01 | 显示全部楼层 |阅读模式
本帖最后由 从从容容 于 2013-11-21 12:32 编辑

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

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

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

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


发表于 2013-11-16 20:14 | 显示全部楼层
Option Explicit
Sub 求不重复值1()
    Dim d As Object, arr, i%, a
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet2.Range("a1:a12")
    For i = LBound(arr) To UBound(arr)
        d(arr(i, 1)) = ""
    Next
    a = d.keys
    [c2].Resize(d.Count) = WorksheetFunction.Transpose(a)
End Sub
Sub 求不重复值2()
    Dim d As Object, arr, i%, a
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 1
    arr = Sheet2.Range("a1:a12")
    For i = LBound(arr) To UBound(arr)
        d(arr(i, 1)) = ""
    Next
    a = d.keys
    [d2].Resize(d.Count) = WorksheetFunction.Transpose(a)
End Sub
Sub 双向求值()
    Dim d As Object, arr, i%, a
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet9.Range("a1:b6")
    For i = LBound(arr) To UBound(arr)
        d(arr(i, 1)) = arr(i, 2)
        d(arr(i, 2)) = arr(i, 1)
    Next
    [e3] = d([d3].Value)
    MsgBox "d3对应的值为" & [e3].Value
End Sub
Sub 多条件查找()
    Dim d As Object, arr, i%, a, b, c
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet8.Range("a2:d5")
    For i = LBound(arr) To UBound(arr)
        If d.exists(arr(i, 1)) = 0 Then
            d(arr(i, 1) & "|" & arr(i, 2)) = arr(i, 3) & "|" & arr(i, 4)
        Else
            d(arr(i, 1) & "|" & arr(i, 2)) = arr(i, 3) & "|" & arr(i, 4) + d(arr(i, 1) & "|" & arr(i, 2))
        End If
    Next
    b = d.keys
    c = d.items
    ReDim a(1 To d.Count, 1 To UBound(arr))
    For i = 0 To d.Count - 1
        a(i + 1, 1) = WorksheetFunction.Transpose(Split(b(i), "|")(0))
        a(i + 1, 2) = WorksheetFunction.Transpose(Split(b(i), "|")(1))
        a(i + 1, 3) = WorksheetFunction.Transpose(Split(c(i), "|")(0))
        a(i + 1, 4) = WorksheetFunction.Transpose(Split(c(i), "|")(1))
    Next
    [a12].Resize(d.Count, 4) = a
End Sub
Sub 单条件求和()
    Dim d As Object, arr, i%, a
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet10.Range("b2:c5")
    For i = LBound(arr) To UBound(arr)
        If d.exists(arr(i, 1)) = 0 Then
            d(arr(i, 1)) = arr(i, 2)
        Else
            d(arr(i, 1)) = arr(i, 2) + d(arr(i, 1))
        End If
    Next
    [e2].Resize(d.Count, 2) = WorksheetFunction.Transpose(Array(d.keys, d.items))
End Sub
Sub 多列求和()
    Dim d As Object, arr, i%, a(1 To 10000, 1 To 4), K%
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet12.Range("a2:d6")
    For i = LBound(arr) To UBound(arr)
        If d.exists(arr(i, 1)) = 0 Then
            K = K + 1
            d(arr(i, 1)) = K
            a(K, 1) = arr(i, 1)
            a(K, 2) = arr(i, 2)
            a(K, 4) = arr(i, 4)
        Else
            a(d(arr(i, 1)), 2) = arr(i, 2) + a(d(arr(i, 1)), 2)
            a(d(arr(i, 1)), 4) = arr(i, 4) + a(d(arr(i, 1)), 4)
        End If
        a(d(arr(i, 1)), 3) = a(d(arr(i, 1)), 4) / a(d(arr(i, 1)), 2)
    Next
    [a13].Resize(d.Count, 4) = a
End Sub
Sub 多条件求和()
    Dim d As Object, arr, i%, a, b, c
    Set d = CreateObject("scripting.dictionary")
    d.comparemode = 0
    arr = Sheet13.Range("a2:c6")
    For i = LBound(arr) To UBound(arr)
        If d.exists(arr(i, 1)) = 0 Then
            d(arr(i, 1) & "|" & arr(i, 2)) = arr(i, 3)
        Else
            d(arr(i, 1) & "|" & arr(i, 2)) = arr(i, 3) + d(arr(i, 1) & "|" & arr(i, 2))
        End If
    Next
    b = d.keys
    c = d.items
    ReDim a(1 To d.Count, 1 To UBound(arr, 2))
    For i = 0 To d.Count - 1
        a(i + 1, 1) = WorksheetFunction.Transpose(Split(b(i), "|")(0))
        a(i + 1, 2) = WorksheetFunction.Transpose(Split(b(i), "|")(1))
        a(i + 1, 3) = WorksheetFunction.Transpose(c(i))
    Next
    [a11].Resize(d.Count, 3) = a
End Sub

点评

多条件查找和多条件求和 代码有点问题,还有没有注释. 其他都不错.  发表于 2013-11-21 10:24

评分

参与人数 1 +4 金币 +18 收起 理由
从从容容 + 4 + 18 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-11-16 20:45 | 显示全部楼层
B09:wp8680
  1. Option Explicit

  2. Sub 求不重复值1()
  3.     Dim d, arr, x%      '创建一些变量
  4.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  5.     d.CompareMode = 0              '设置CompareMode为0,二进制比较
  6.     arr = Range("a1:a12")          '数据存入数组
  7.     For x = 1 To UBound(arr)       '建立循环
  8.         d(arr(x, 1)) = arr(x, 1)   '装入字典
  9.     Next x
  10.     Range("c2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.keys)
  11. End Sub

  12. Sub 求不重复值2()
  13.     Dim d, arr, x%      '创建一些变量
  14.     Set d = CreateObject("Scripting.Dictionary")
  15.     d.CompareMode = 1              '设置CompareMode为1,文本比较
  16.     arr = Range("a1:a12")          '数据存入数组
  17.     For x = 1 To UBound(arr)       '建立循环
  18.         d(arr(x, 1)) = arr(x, 1)   '装入字典
  19.     Next x
  20.     Range("d2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.keys)
  21. End Sub

  22. Sub 双向求值()
  23.     Dim d, arr, x%      '创建一些变量
  24.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  25.     arr = Range("a2:b6")            '数据存入数组
  26.     For x = 1 To UBound(arr)        '建立循环
  27.         d(arr(x, 1)) = arr(x, 2)    '全部装入字典(因为地名不存在重名,简写也没有重名,取巧)
  28.         d(arr(x, 2)) = arr(x, 1)
  29.     Next x
  30.     MsgBox d.Item(Range("d3").Value)  '取出字典注释
  31. End Sub

  32. Sub 多条件查找()
  33.     Dim d, arr, brr, crr, x%   '创建一些变量
  34.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  35.     arr = Range("a2:d5")          '数据存入数组
  36.     brr = Range("a12:b13")        '建立条件区的数组
  37.     crr = Range("c12:d13")        '建立结果区的数组
  38.     For x = 1 To UBound(arr)       '建立循环
  39.         d(arr(x, 1) & "|" & arr(x, 2)) = arr(x, 3) & "|" & arr(x, 4)    '装入字典
  40.     Next x
  41.     For x = 1 To 2                  '结果区逐行循环
  42.         crr(x, 1) = Split(d.Item(brr(x, 1) & "|" & brr(x, 2)), "|")(0)  '结果区逐行的第一列
  43.         crr(x, 2) = Split(d.Item(brr(x, 1) & "|" & brr(x, 2)), "|")(1)  '结果区逐行的第二列
  44.     Next x
  45.     Range("c12:d13") = crr     '把数组写入结果区
  46. End Sub

  47. Sub 单条件求和()
  48.     Dim d, arr, x%      '创建一些变量
  49.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  50.     arr = Range("b2:c5")          '数据存入数组
  51.     For x = 1 To UBound(arr)       '建立循环
  52.         d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2)    '装入字典
  53.     Next x
  54.     Range("e2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.keys)     '把字典key写入结果区
  55.     Range("F2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.items)     '把字典item写入结果区
  56. End Sub

  57. Sub 多列求和()
  58.     Dim d, arr, brr(), x%, y%  '创建一些变量
  59.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  60.     arr = Range("a2:d6")          '数据存入数组
  61.     For x = 1 To UBound(arr)    '建立循环
  62.         If Not d.Exists(arr(x, 1)) Then
  63.             y = y + 1
  64.             d(arr(x, 1)) = y    '装入字典,并以字典Key出现为顺序编号注释
  65.         End If
  66.         ReDim Preserve brr(1 To 3, 1 To y)   '建立动态数组存放数据
  67.         '用arr(x,1)在字典中的注释(即序号)去定义动态数组brr中列位置,然后累加或赋值,我估计我的此方法跟他们说的棋盘法略同规则。
  68.         brr(1, d.Item(arr(x, 1))) = brr(1, d.Item(arr(x, 1))) + arr(x, 2)
  69.         brr(2, d.Item(arr(x, 1))) = arr(x, 3)
  70.         brr(3, d.Item(arr(x, 1))) = brr(3, d.Item(arr(x, 1))) + arr(x, 4)
  71.     Next x
  72.     Range("a13").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.keys)    '把字典key写入结果区
  73.     Range("b13").Resize(d.Count, 3) = Application.WorksheetFunction.Transpose(brr)  '把数组brr写入结果区
  74. End Sub


  75. Sub 多条件求和()
  76.     Dim d, arr, brr, crr(), x%   '创建一些变量
  77.     Set d = CreateObject("Scripting.Dictionary")    '字典后期绑定
  78.     arr = Range("a2:c6")          '数据存入数组
  79.     For x = 1 To UBound(arr)       '建立循环
  80.         d(arr(x, 1) & "|" & arr(x, 2)) = d(arr(x, 1) & "|" & arr(x, 2)) + arr(x, 3)    '装入字典
  81.     Next x
  82.     brr = d.keys
  83.     ReDim crr(1 To d.Count, 1 To 2)
  84.     For x = 1 To d.Count
  85.         crr(x, 1) = Split(brr(x - 1), "|")(0)
  86.         crr(x, 2) = Split(brr(x - 1), "|")(1)
  87.     Next x
  88.     Range("a11").Resize(d.Count, 2) = crr  '把数组crr写入表格
  89.     Range("c11").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.items)    '把字典item写入表格
  90. End Sub
复制代码

点评

答案正确,并能运用前面学习过的动态数组,很好的, 继续努力, 有点小建议,如果在多条件查找和多条件求和 如果能用 字典与数组 组合运用,代码会更简洁.字典做行标,数组做容器......  发表于 2013-11-21 10:38

评分

参与人数 1 +6 金币 +20 收起 理由
从从容容 + 6 + 20 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-11-16 22:01 | 显示全部楼层
B06幽月儿

Option Explicit
Sub 求不重复值1()
    Dim d As Object, arr, i As Integer
    Set d = CreateObject("scripting.dictionary")
    d.CompareMode = 2
    arr = Range("a1:a12")
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = ""
    Next
    [c2].Resize(d.Count) = Application.Transpose(d.keys)
End Sub
Sub 求不重复值2()
    Dim d As Object, arr, i As Integer
    Set d = CreateObject("scripting.dictionary")
    d.CompareMode = 0
    arr = Range("a1:a12")
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = ""
    Next
    [d2].Resize(d.Count) = Application.Transpose(d.keys)
End Sub
Sub 双向求值()
    Dim d As Object, arr, i As Integer
    Set d = CreateObject("scripting.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 d As Object, arr, i As Integer, k, l
    Set d = CreateObject("scripting.dictionary")
    arr = Range("a2:d5")
    For i = 1 To UBound(arr)
        d(arr(i, 1) & "-" & arr(i, 2)) = Array(arr(i, 3), arr(i, 4))
    Next i
    k = d.keys
    l = d.items
    For i = 0 To d.Count - 1
        If [a12].Value & "-" & [b12].Value = k(i) Then
            [c12].Resize(1, 2) = l(i)
        End If
        If [a13].Value & "-" & [b13].Value = k(i) Then
            [c13].Resize(1, 2) = l(i)
        End If
    Next i
End Sub
Sub 单条件求和()
    Dim d As Object, arr, i As Integer
    Set d = CreateObject("scripting.dictionary")
    arr = Range("b2:c5")
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)
    Next i
    [e2].Resize(d.Count) = Application.Transpose(d.keys)
    [f2].Resize(d.Count) = Application.Transpose(d.items)
End Sub
Sub 多列求和()
    Dim arr1(), d As Object, i As Integer, n As Integer, m As Integer, arr
    Set d = CreateObject("scripting.dictionary")
    arr = Range("a2:d6")
    For i = 1 To UBound(arr)
        If Not d.exists(arr(i, 1)) Then
            n = n + 1
            d(arr(i, 1)) = n
            ReDim Preserve arr1(1 To 4, 1 To n)
            arr1(1, n) = arr(i, 1)
            arr1(2, n) = arr(i, 2)
            arr1(3, n) = arr(i, 3)
            arr1(4, n) = arr(i, 4)
        Else
            m = d(arr(i, 1))
            arr1(2, m) = arr1(2, m) + arr(i, 2)
            arr1(3, m) = arr1(3, m) + arr(i, 3)
            arr1(4, m) = arr1(4, m) + arr(i, 4)
        End If
    Next
    [a13].Resize(n, 4) = Application.Transpose(arr1)
End Sub

Sub 多条件求和()
    Dim d As Object, i As Integer, arr, arr1, l, brr
    Set d = CreateObject("scripting.dictionary")
    arr = Range("a2:c6")
    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
    arr1 = d.keys
    l = d.items
    For i = 0 To 3
        brr = VBA.Split(arr1(i), "-")
        Cells(i + 11, 1).Resize(1, 2) = brr
    Next i
    [c11].Resize(d.Count) = Application.Transpose(d.items)
End Sub

点评

求不重复值 1,和2 错位了,多列求和 "单价" 没有处理好,总体很不错, 小建议,多条件查找和多条件求和 还可以再优化.  发表于 2013-11-21 10:48

评分

参与人数 1 +4 金币 +19 收起 理由
从从容容 + 4 + 19 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 18:04 | 显示全部楼层
【VBA字典数组201301班】B组 第三讲作业 b05:zjyxp上交作业,请学委老师批改指点,谢谢!
本次作业字典都是前期绑定
作业一
1、 求不重复值1
  1. Sub 求不重复值1()
  2.     Dim d As New Dictionary
  3.     Dim arr, i As Integer
  4.     Range("c2:c12").ClearContents '清空C2:C12单元格数据
  5.     arr = Range("a1:a12") '将单元格A1:A12读入数组
  6.     d.CompareMode = 0 '设定字典为不区分大小写模式
  7.     For i = 1 To UBound(arr, 1)
  8.         If d.Exists(arr(i, 1)) = False Then d(arr(i, 1)) = "" '判断数组元素在字典里是否存在,不存在创建字典
  9.     Next i
  10.         [c2].Resize(d.Count, 1) = Application.Transpose(d.Keys) '将字典KEYS读入指定位置
  11. End Sub
复制代码
2、求不重复值2()
  1. Sub 求不重复值2()
  2.     Dim d As New Dictionary
  3.     Dim arr, i As Integer
  4.     Range("d2:d12").ClearContents '清空D2:D12单元格数据
  5.     arr = Range("a1:a12") '将单元格A1:A12读入数组
  6.     d.CompareMode = 1 '设定字典为区分大小写模式
  7.     For i = 1 To UBound(arr, 1)
  8.         If d.Exists(arr(i, 1)) = False Then d(arr(i, 1)) = "" '判断数组元素在字典里是否存在,不存在创建字典
  9.     Next i
  10.         [d2].Resize(d.Count, 1) = Application.Transpose(d.Keys) '将字典KEYS读入指定位置
  11. End Sub
复制代码
作业二:双向查找(工作表事件)在sheets("双向查找")中
  1. Private Sub Worksheet_Change(ByVal Target As Range) '设定工作表事件
  2.     Dim arr, d As New Dictionary
  3.     Dim i As Integer
  4.     If Target.Address = "$D$3" Then '设定工作表变化单元格位置
  5.     arr = Range("a2:b6")
  6.     For i = 1 To UBound(arr)
  7.         d(arr(i, 1)) = arr(i, 2) '将数组第一列读入字典
  8.     Next i
  9.     For i = 1 To UBound(arr)
  10.         d(arr(i, 2)) = arr(i, 1) '将数组第二列读入字典
  11.     Next i
  12.         MsgBox d(Target.Value) '读出单元格D3的对应项
  13.     End If
  14. End Sub
复制代码
作业三:单条件求和
  1. Sub 单条件求和()
  2.     Dim arr, d As New Dictionary
  3.     Dim i As Integer
  4.     arr = Range("b2:c5") '将数据读入数组
  5.     For i = 1 To UBound(arr)
  6.         d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '通过循环将字典数组累加
  7.     Next i
  8.         [e2].Resize(d.Count, 1) = Application.Transpose(d.Keys) '将字典的KEYS值读入指定位置
  9.         [f2].Resize(d.Count, 1) = Application.Transpose(d.Items) '将字典的ITEMSS值读入指定位置
  10. End Sub
复制代码
作业四:多条件查找
  1. Sub 多条件查找()
  2.     Dim arr, brr, crr
  3.     Dim d1 As New Dictionary, d2 As New Dictionary
  4.     Dim i As Integer
  5.     '将相关数据放入arr和brr
  6.     arr = Range("a2:d5")
  7.     brr = Range("a12:b13")
  8.     ReDim crr(1 To UBound(brr), 1 To 2) '重新定义crr
  9.     For i = 1 To UBound(arr)
  10.         '将数组放进字典
  11.         d1(arr(i, 1) & "-" & arr(i, 2)) = d1(arr(i, 1) & "-" & arr(i, 2)) + arr(i, 3)
  12.         d2(arr(i, 1) & "-" & arr(i, 2)) = arr(i, 4)
  13.     Next i
  14.     For i = 1 To UBound(brr)
  15.         '将数组从字典中读进crr
  16.         crr(i, 1) = d1.Item(brr(i, 1) & "-" & brr(i, 2))
  17.         crr(i, 2) = d2.Item(brr(i, 1) & "-" & brr(i, 2))
  18.     Next i
  19.         [c12].Resize(UBound(crr), 2) = crr '将crr读进指定区域
  20. End Sub
复制代码
作业五:多列求和

  1. Sub 多列求和()
  2.     Dim arr
  3.     Dim k As Integer
  4.     Dim d1 As New Dictionary, d2 As New Dictionary, d3 As New Dictionary
  5.     arr = Range("a2:d6") '将数据读入数组
  6.     For k = 1 To UBound(arr)
  7.         '通过循环将数据装入各个字典
  8.         d1(arr(k, 1)) = d1(arr(k, 1)) + arr(k, 2)
  9.         d2(arr(k, 1)) = arr(k, 3)
  10.         d3(arr(k, 1)) = d3(arr(k, 1)) + arr(k, 4)
  11.     Next k
  12.         '将相关数据读入指定区域
  13.         Range("a13").Resize(d1.Count, 1) = Application.Transpose(d1.Keys)
  14.         Range("b13").Resize(d1.Count, 1) = Application.Transpose(d1.Items)
  15.         Range("c13").Resize(d1.Count, 1) = Application.Transpose(d2.Items)
  16.         Range("d13").Resize(d1.Count, 1) = Application.Transpose(d3.Items)
  17. End Sub
复制代码
作业六:多条件求和
  1. Sub 多条件求和()
  2.     Dim arr, brr
  3.     Dim d As New Dictionary
  4.     Dim i As Integer
  5.     arr = Range("a2:c6") '将区域数据读入数组
  6.     For i = 1 To UBound(arr)
  7.         '将数组元素1连接元素2组成字典KEY,再进行累加
  8.         d(arr(i, 1) & "-" & arr(i, 2)) = d(arr(i, 1) & "-" & arr(i, 2)) + arr(i, 3)
  9.     Next i
  10.     ReDim brr(1 To d.Count, 1 To 3) '重置数组brr
  11.     For i = 1 To d.Count
  12.         brr(i, 1) = Split(d.Keys(i - 1), "-")(0) '将分割出来的数据入进brr
  13.         brr(i, 2) = Split(d.Keys(i - 1), "-")(1)
  14.         brr(i, 3) = d.Items(i - 1)
  15.     Next i
  16.         [a11].Resize(UBound(brr), UBound(brr, 2)) = brr '将brr读入指定位置
  17. End Sub
复制代码

点评

代码不要,每题分开,不好测试.  发表于 2013-11-21 11:45
双向查找 代码不要写在工作表事件中,没有反应, 代码只要一个循环就可以了, 多条件查找,也有一点问题. 有的定义多个字典,不够简洁.  发表于 2013-11-21 11:43

评分

参与人数 1 +3 金币 +17 收起 理由
从从容容 + 3 + 17 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 20:32 | 显示全部楼层
本帖最后由 雨后彩霞 于 2013-11-18 11:53 编辑

第三题作业。
Sub 求不重复值1()
    Dim i As Long
    Dim d As New Dictionary
    For i = 1 To 12
        d.CompareMode = 1
        d(Cells(i, 1).Value) = d(Cells(i, 1).Value)
    Next i
    Range("c2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Keys)
End Sub
Sub 求不重复值2()
    Dim i As Long
    Dim d As New Dictionary
    For i = 1 To 12
        d(Cells(i, 1).Value) = d(Cells(i, 1).Value)
    Next i
    Range("d2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Keys)
End Sub
Sub 双向求值()
    Dim d As New Dictionary
    Dim arr()
    Dim x, x1, Mys
    arr = Range("A1:B" & Cells(Rows.Count, 1).End(3).Row)    '把数据装入数组
    Mys = [d3]
    If Left(Mys, 1) Like "[a-z]" Then    '判断是否字母
        For x = 1 To UBound(arr)
            d.Add arr(x, 2), arr(x, 1)    '添加字典
        Next x
    ElseIf Not (IsNumeric(Left(Mys, 1))) Then    '判断是否汉字
        For x = 1 To UBound(arr)
            d.Add arr(x, 1), arr(x, 2)    '添加字典
        Next x
    End If
    arr = Range("d3:e3")
    arr(1, 2) = d.Item(arr(1, 1))    '查找
MsgBox arr(1, 2)
     Set d = Nothing
    Erase arr
End Sub


Sub 多条件查找()
    Dim d As New Dictionary
    Dim arr(), brr()
    Dim x, y, m, k
    arr = Range("A2:d5")
    brr = Range("A12:D13")
    For x = 1 To UBound(arr)
        m = arr(x, 1) & vbTab & arr(x, 2)
        d.Add m, arr(x, 3) & "," & arr(x, 4)
    Next x
    For y = 1 To UBound(brr)
        m = brr(y, 1) & vbTab & brr(y, 2)
        If d.Exists(m) Then
            brr(y, 3) = Split(d(m), ",")(0)
            brr(y, 4) = Split(d(m), ",")(1)
        End If
    Next
    [A12].Resize(2, 4) = brr
End Sub
Sub 单条件求和()
    Dim i
    Dim d As New Dictionary
    For i = 2 To 5
        d(Cells(i, 2).Value) = d(Cells(i, 2).Value) + Cells(i, 3)
    Next i
    Range("e2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Keys)
    Range("f2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Items)
End Sub
Sub 多列求和()
    Dim i
    Dim d As New Dictionary
    Dim arr, arr1
    arr = Range("a2:d6")
    ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
    For i = 1 To UBound(arr)
        If d.Exists(arr(i, 1)) = False Then
            d(arr(i, 1)) = d.Count + 1
            arr1(d(arr(i, 1)), 1) = arr(i, 1)
        End If
        arr1(d(arr(i, 1)), 2) = arr1(d(arr(i, 1)), 2) + arr(i, 2)
        arr1(d(arr(i, 1)), 3) = arr1(d(arr(i, 1)), 3) + arr(i, 3)
        arr1(d(arr(i, 1)), 4) = arr1(d(arr(i, 1)), 4) + arr(i, 4)
    Next i
    Range("a13").Resize(d.Count, 4) = arr1
End Sub
Sub 多条件求和()
    Dim x, y
    Dim arr, arr1, arr2(1 To 1000, 1 To 2), arr3
    Dim d As New Dictionary
    arr = Range("a2:c6")
    For x = 1 To UBound(arr)
        d(arr(x, 1) & "-" & arr(x, 2)) = d(arr(x, 1) & "-" & arr(x, 2)) + arr(x, 3)    '把需要汇总的列进行连接
    Next x

    arr1 = d.Keys
    For y = 0 To UBound(arr1)
        arr3 = Split(arr1(y), "-")    '把连接的产品和型号列进行拆分
        arr2(y + 1, 1) = arr3(0)  '拆分后的放进arr2数组中
        arr2(y + 1, 2) = arr3(1)
    Next y
    Range("a11").Resize(d.Count, 2) = arr2
    Range("c11").Resize(d.Count) = Application.Transpose(d.Items)
End Sub

点评

第一题 错位, 双向查找,不够简洁.还可以优化. 多列求和 "单价 "不对, 总体很不错,  发表于 2013-11-21 11:53

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-17 21:13 | 显示全部楼层
B03-zmnyu交第三课时作业:
  1. Sub 求不重复值1()
  2.     Dim d As New Dictionary
  3.     Dim arr()
  4.     Dim i As Integer
  5.     Dim n As Integer
  6.     n = Range("A" & Rows.Count).End(xlUp).Row
  7.     '取A列当前数据的最大行号,赋值给n
  8.     arr() = Range("A1:A" & n).Value
  9.     '把A1:An的值装入数组arr
  10.     For i = 1 To UBound(arr)  '循环arr数组内容
  11.         d(arr(i, 1)) = ""
  12.         '指定字典d内以arr(i,1)为key的item值为空,如果此key不存在,则新建
  13.     Next
  14.     Range("C2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
  15.     '输出字典d的keys到以C2为开始的单元格区域
  16. End Sub
复制代码
  1. Sub 求不重复值2()
  2.     Dim d As New Dictionary
  3.     Dim arr()
  4.     Dim i As Integer
  5.     Dim n As Integer
  6.     n = Range("A" & Rows.Count).End(xlUp).Row
  7.     '取A列当前数据的最大行号,赋值给n
  8.     arr() = Range("A1:A" & n).Value
  9.     '把A1:An的值装入数组arr
  10.     d.CompareMode = 1   '指定字典d的文字对比模式为不区分大小写
  11.     For i = 1 To UBound(arr)    '循环arr数组内容
  12.         d(arr(i, 1)) = ""
  13.         '指定字典d内以arr(i,1)为key的item值为空,如果此key不存在,则新建
  14.     Next
  15.     Range("D2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
  16.     '输出字典d的keys到以D2为开始的单元格区域
  17. End Sub
复制代码
  1. Sub 双向求值()
  2.     Dim d As New Dictionary
  3.     Dim i As Integer
  4.     Dim arr()
  5.     arr() = Range("A2:B6").Value    '把A2:B6的值装入数组arr
  6.     For i = 1 To UBound(arr)       '循环
  7.         d(arr(i, 1)) = arr(i, 2)   '建立字典d的条目,key为arr(i,1),item为arr(i,2)
  8.         d(arr(i, 2)) = arr(i, 1)     '建立字典d的条目,key为arr(i,2),item为arr(i,1)
  9.     Next
  10.     MsgBox "查询条目:" & Range("D3").Value & Chr(10) & "查询结果:" & d(Range("D3").Value), , "B03-zmnyu提示"
  11.     '以消息框显示查询的内容
  12. End Sub
复制代码
  1. Sub 多条件查找()
  2.     Dim i As Integer
  3.     Dim d1 As New Dictionary, d2 As New Dictionary
  4.     Dim arr()
  5.     arr() = Range("A2:D5").Value
  6.     '把数据源区域装入数组arr
  7.     For i = 1 To UBound(arr)
  8.         d1(arr(i, 1) & "-" & arr(i, 2)) = arr(i, 3)
  9.         d2(arr(i, 1) & "-" & arr(i, 2)) = arr(i, 4)
  10.         '通过循环建议d1和d2两个字典的条目
  11.     Next
  12.     arr() = Range("A12:D13").Value
  13.     '把结果区域需要查询的条件装入数组arr
  14.     For i = 1 To UBound(arr)
  15.         arr(i, 3) = d1(arr(i, 1) & "-" & arr(i, 2))
  16.         arr(i, 4) = d2(arr(i, 1) & "-" & arr(i, 2))
  17.         '把查询结果装入数组arr
  18.     Next
  19.     Range("A12:D13") = arr
  20.     '查询结果写入结果区域
  21. End Sub
复制代码
  1. Sub 单条件求和()
  2.     Dim i As Integer
  3.     Dim d As New Dictionary
  4.     Dim arr()
  5.     arr() = Range("B2:C5").Value
  6.     '把区域B2:C5的值装入数组
  7.     For i = 1 To UBound(arr)  '循环
  8.         d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)
  9.         '字典d当前条目的item值等于原来item值加上当前行的数量之和
  10.     Next
  11.     Range("E2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
  12.     '把字典的keys值(即产品名称)输出
  13.     Range("F2").Resize(d.Count, 1) = Application.Transpose(d.Items)
  14.     '把字典的items值(对应产品的数量之和)输出
  15. End Sub
复制代码
  1. Sub 多列求和()
  2.     Dim d1 As New Dictionary, d2 As New Dictionary, d3 As New Dictionary
  3.     Dim i As Integer
  4.     Dim arr()
  5.     arr() = Range("A2:D6").Value
  6.     '把数据源区域装入数组
  7.     For i = 1 To UBound(arr)
  8.         d1(arr(i, 1)) = d1(arr(i, 1)) + arr(i, 2)
  9.         d2(arr(i, 1)) = arr(i, 3)
  10.         d3(arr(i, 1)) = d3(arr(i, 1)) + arr(i, 4)
  11.         '通过循环分别建立字典d1,d2,d3分别存放数量的和,单价,金额的和
  12.     Next
  13.         '以下四句为结果写入
  14.     Range("A13").Resize(d1.Count, 1) = Application.Transpose(d1.Keys)
  15.     Range("B13").Resize(d1.Count, 1) = Application.Transpose(d1.Items)
  16.     Range("C13").Resize(d1.Count, 1) = Application.Transpose(d2.Items)
  17.     Range("D13").Resize(d1.Count, 1) = Application.Transpose(d3.Items)
  18. End Sub
复制代码
  1. Sub 多条件求和()
  2.     Dim i As Integer
  3.     Dim d As New Dictionary
  4.     Dim arr()
  5.     arr() = Range("A2:C6").Value
  6.     '把数据源区域装入数组arr
  7.     For i = 1 To UBound(arr)  '循环
  8.         d(arr(i, 1) & "-" & arr(i, 2)) = d(arr(i, 1) & "-" & arr(i, 2)) + arr(i, 3)
  9.         '以产品和规格中间以“-”连接为条目创建字典,item值为当前item值加上当前行的数量
  10.     Next
  11.     arr = d.Keys   '把字典d的keys装入数组arr
  12.     For i = 1 To d.Count   '循环
  13.         arr(i - 1) = Split(arr(i - 1), "-")
  14.         '把经过连接的产品和规格重新拆分开
  15.     Next
  16.     Range("a11").Resize(UBound(arr) + 1, 2) = Application.Transpose(Application.Transpose(arr))
  17.     '把拆分后的产品名称和规格写入结果区域
  18.     Range("c11").Resize(d.Count, 1) = Application.Transpose(d.Items)
  19.     '把求和后的数量写入结果区域
  20. End Sub
复制代码
B03-zmnyu【VBA字典数组201301班】第三讲 作业.rar (52.5 KB, 下载次数: 32)

评分

参与人数 1 +6 金币 +20 收起 理由
从从容容 + 6 + 20 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-11-18 08:31 | 显示全部楼层
B08:缔造者
  1. Option Explicit

  2. Sub 求不重复值1()
  3.     Dim d As Object '变量d声明为对象变量
  4.     Dim arr '变量arr声明为变体型变量
  5.     Dim i As Integer '变量i声明为整型值变量
  6.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  7.     d.comparemode = 0 '设置字典的比较模式是二进制,即区分大小写
  8.     With Sheets("求不重复值") '执行with语句块
  9.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  10.         For i = 1 To UBound(arr) '遍历数组arr
  11.             d(arr(i, 1)) = "" '将数组的每个值作为关键字添加到字典中,其对应的项为空
  12.         Next i '继续循环下一个变量i
  13.         .[c2].Resize(d.Count) = Application.Transpose(d.keys) '将字典的关键字通过转置赋值给结果区域
  14.     End With '结束with语句块
  15.     Set d = Nothing '释放字典内存
  16. End Sub

  17. Sub 求不重复值2()
  18.     Dim d As Object '变量d声明为对象变量
  19.     Dim arr '变量arr声明为变体型变量
  20.     Dim i As Integer '变量i声明为整型值变量
  21.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  22.     d.comparemode = 1 '设置字典的比较模式是文本,即不区分大小写
  23.     With Sheets("求不重复值") '执行with语句块
  24.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  25.         For i = 1 To UBound(arr) '遍历数组arr
  26.             d(arr(i, 1)) = "" '将数组的每个值作为关键字添加到字典中,其对应的项为空
  27.         Next i '继续循环下一个变量i
  28.         .[d2].Resize(d.Count) = Application.Transpose(d.keys) '将字典的关键字通过转置赋值给结果区域
  29.     End With '结束with语句块
  30.     Set d = Nothing '释放字典内存
  31. End Sub

  32. Sub 双向求值()
  33.     Dim d As Object '变量d声明为对象变量
  34.     Dim arr '变量arr声明为变体型变量
  35.     Dim i As Integer '变量i声明为整型值变量
  36.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  37.     With Sheets("双向查找") '执行with语句块
  38.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  39.         For i = 2 To UBound(arr) '遍历数组arr
  40.             d(arr(i, 1)) = arr(i, 2) '将数组第一列的每个值作为关键字添加到字典中,其对应的项为数组第一列对应的第二列的值
  41.             d(arr(i, 2)) = arr(i, 1) '将数组第二列的每个值作为关键字添加到字典中,其对应的项为数组第二列对应的第一列的值
  42.         Next i '继续循环下一个变量i
  43.         MsgBox .[d3].Value & "的对应值是:" & d(.[d3].Value) '通过消息框提示条件关键字D3单元格里的值所对应的项
  44.     End With '结束with语句块
  45.     Set d = Nothing '释放字典内存
  46. End Sub

  47. Sub 多条件查找()
  48.     Dim d As Object '变量d声明为对象变量
  49.     Dim arr, brr '变量arr和brr声明为变体型变量
  50.     Dim i As Integer, s '变量i声明为整型值变量,变量s声明为变体型变量
  51.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  52.     With Sheets("多条件查找") '执行with语句块
  53.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  54.         For i = 2 To UBound(arr) '遍历数组arr
  55.             d(arr(i, 1) & arr(i, 2)) = arr(i, 3) & "," & arr(i, 4) '将数组第一列连接第二列的每个值作为关键字添加到字典中,其对应的项为数组的第三列与第四列并用逗号分隔
  56.         Next i '继续循环下一个变量i
  57.         brr = .Range("a12:b13") '将条件区域赋值给变量brr,此时变量brr变为二维数组
  58.         For i = 1 To UBound(brr) '遍历数组brr
  59.             If d.exists(brr(i, 1) & brr(i, 2)) Then '如果字典中已存在关键字
  60.                 s = Split(d(brr(i, 1) & brr(i, 2)), ",") '将字典中的项,按逗号拆分并赋值给变量s,此时变量s变为一维数组
  61.                 .Cells(i + 11, 3).Resize(1, 2).Value = Application.Transpose(Application.Transpose(s)) '通过两次转置将数组s的值由文本转为数值并赋值给结果区域
  62.             Else
  63.                 MsgBox "产品或者规格不存在,请修改!" '通过消息框提示不存在的产品或者规格
  64.             End If
  65.         Next i '继续循环下一个变量i
  66.     End With '结束with语句块
  67.     Set d = Nothing '释放字典内存
  68. End Sub

  69. Sub 单条件求和()
  70.     Dim d As Object '变量d声明为对象变量
  71.     Dim arr '变量arr声明为变体型变量
  72.     Dim i As Integer '变量i声明为整型值变量
  73.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  74.     With Sheets("单条件求和") '执行with语句块
  75.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  76.         For i = 2 To UBound(arr) '遍历数组arr
  77.             d(arr(i, 2)) = d(arr(i, 2)) + arr(i, 3) '将数组第二列的每个值作为关键字添加到字典中,其对应的项为累加
  78.         Next i '继续循环下一个变量i
  79.         .[e2].Resize(d.Count) = Application.Transpose(d.keys) '将字典的关键字通过转置赋值给结果区域
  80.         .[f2].Resize(d.Count) = Application.Transpose(d.items) '将字典的项通过转置赋值给结果区域
  81.     End With '结束with语句块
  82.     Set d = Nothing '释放字典内存
  83. End Sub

  84. Sub 多列求和()
  85.     Dim d As Object, d1 As Object, d2 As Object '变量d和d1及d2声明为对象变量
  86.     Dim arr '变量arr声明为变体型变量
  87.     Dim i As Integer '变量i声明为整型值变量
  88.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  89.     Set d1 = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d1
  90.     Set d2 = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d2
  91.     With Sheets("多列求和") '执行with语句块
  92.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  93.         For i = 2 To UBound(arr) '遍历数组arr
  94.             d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '将数组第一列的每个值作为关键字添加到字典中,其对应的项为累加
  95.             d1(arr(i, 1)) = arr(i, 3) '将数组第一列的每个值作为关键字添加到字典中,其对应的项为数组第三列的值
  96.             d2(arr(i, 1)) = d2(arr(i, 1)) + arr(i, 4) '将数组第一列的每个值作为关键字添加到字典中,其对应的项为连接
  97.         Next i '继续循环下一个变量i
  98.         .Cells(13, 1).Resize(d.Count) = Application.Transpose(d.keys) '将字典的关键字通过转置赋值给结果区域
  99.         .[b13].Resize(d.Count) = Application.Transpose(d.items) '将字典的项通过转置赋值给结果区域
  100.         .[c13].Resize(d1.Count) = Application.Transpose(d1.items) '将字典的项通过转置赋值给结果区域
  101.         .[d13].Resize(d2.Count) = Application.Transpose(d2.items) '将字典的项通过转置赋值给结果区域
  102.     End With '结束with语句块
  103.     Set d = Nothing '释放字典内存
  104.     Set d1 = Nothing '释放字典内存
  105.     Set d2 = Nothing '释放字典内存
  106. End Sub


  107. Sub 多条件求和()
  108.     Dim d As Object '变量d声明为对象变量
  109.     Dim arr, brr '变量arr和brr声明为变体型变量
  110.     Dim i As Integer, j As Integer, s '变量i和j声明为整型值变量,变量s声明为变体型变量
  111.     Set d = CreateObject("scripting.dictionary") '创建字典对象,并把字典对象赋值给变量d
  112.     With Sheets("多条件求和") '执行with语句块
  113.         arr = .Range("a1").CurrentRegion '将a1单元格所在的区域赋值给变量arr,此时arr变为数组
  114.         For i = 2 To UBound(arr) '遍历数组arr
  115.             d(arr(i, 1) & " " & arr(i, 2)) = d(arr(i, 1) & " " & arr(i, 2)) + arr(i, 3) '将数组第一列与第二列用空格连接起来的每个值作为关键字添加到字典中,其对应的项为累加
  116.         Next i '继续循环下一个变量i
  117.         s = d.keys '将字典关键字赋值给变量s,此时变量s变为一维数组
  118.         brr = .Range("a11:b" & UBound(s) + 11) '将结果区域赋值给变量brr,此时变量brr变为二维数组
  119.         For j = 1 To 2 '变量j开始循环
  120.             For i = 1 To UBound(s) + 1 '遍历数组s
  121.                 brr(i, j) = Split(s(i - 1), " ")(j - 1) '按空格拆分数组s,分别提取其第1、2项并赋值给二维数组brr对应的行和列
  122.             Next i '继续循环下一个变量i
  123.         Next j '继续循环下一个变量j
  124.         .[a11].Resize(d.Count, 2) = brr '将数组brr赋值给结果区域
  125.         .[c11].Resize(d.Count) = Application.Transpose(d.items) '将字典的项通过转置赋值给结果区域
  126.     End With '结束with语句块
  127.     Set d = Nothing '释放字典内存
  128. End Sub
复制代码

点评

代码注释很清楚,考虑很两到,有一定的功底,很好 小建议,代码还可以优化,如 减少循环次数.  发表于 2013-11-21 12:06

评分

参与人数 1 +6 金币 +20 收起 理由
从从容容 + 6 + 20 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-11-19 14:36 | 显示全部楼层
b10 临时户口
  1. Option Explicit
  2. Public 字典 As New Dictionary    '创建一个公共的字典
  3. Public arr, i

  4. Sub 求不重复值1()  '区分大小写
  5.     Sheet2.Range("c2:c12").ClearContents
  6.     arr = Sheet2.Range("a1:a12").Value
  7.     For i = 1 To UBound(arr)
  8.         字典(arr(i, 1)) = ""           '字典创建关键字
  9.     Next
  10.     Sheet2.Range("c2").Resize(字典.Count) = Application.Transpose(字典.Keys)   '把不重复值装入到单元格中
  11. End Sub

  12. Sub 求不重复值2()    '不区分大小写
  13.     Sheet2.Range("d2:d12").ClearContents
  14.     字典.CompareMode = TextCompare    '进行文字比较来不区分大小写
  15.     arr = Sheet2.Range("a1:a12").Value
  16.     For i = 1 To UBound(arr)
  17.         字典(arr(i, 1)) = ""           '字典创建关键字
  18.     Next
  19.     Sheet2.Range("d2").Resize(字典.Count) = Application.Transpose(字典.Keys)    '把不重复值装入到单元格中
  20. End Sub

  21. Sub 双向求值()
  22.     arr = Sheet9.Range("a2:b6").Value
  23.     For i = 1 To UBound(arr, 1)
  24.         字典(arr(i, 1)) = arr(i, 2)     '创建城市为关键字,简写为item
  25.         字典(arr(i, 2)) = arr(i, 1)     '创建简写为关键字,城市为item
  26.     Next
  27.     MsgBox 字典(Sheet9.Range("d3").Value)
  28. End Sub

  29. Sub 多条件查找()
  30.     On Error Resume Next
  31.     Dim st As String, st1 As String, st2 As String
  32.     Dim arr1, arr2, arr3
  33.     With Sheet8
  34.         arr = .Range("a2:d5").Value
  35.         For i = 1 To UBound(arr)
  36.             st = arr(i, 1) & "-" & arr(i, 2)     '产品和规格连起来为了创建key
  37.             st1 = arr(i, 3) & "-" & arr(i, 4)    '数量和单价连起来为了创建item
  38.             字典.Add st, st1                     '创建字典key和item
  39.         Next
  40.         arr1 = .Range("a12:b13").Value
  41.         ReDim arr2(1 To 2, 1 To 1)
  42.         ReDim arr3(1 To 2, 1 To 2)
  43.         For i = 1 To UBound(arr1)
  44.             arr2(i, 1) = arr1(i, 1) & "-" & arr1(i, 2)   '查找值合并构成与key一致
  45.             arr3 = VBA.Split(字典.Item(arr2(i, 1)), "-")    '把item的值拆分
  46.             .Range("c" & i + 11).Resize(1, UBound(arr3) + 1).Value = arr3
  47.         Next
  48.     End With
  49. End Sub

  50. Sub 单条件求和()
  51.     With Sheet10
  52.         arr = .Range("b2:c5").Value
  53.         For i = 1 To UBound(arr)
  54.             字典(arr(i, 1)) = 字典(arr(i, 1)) + arr(i, 2)   'key对应的item的值在原来的基础上累加
  55.         Next
  56.         .Range("e2").Resize(字典.Count) = Application.Transpose(字典.Keys)
  57.         .Range("f2").Resize(字典.Count) = Application.Transpose(字典.Items)
  58.     End With
  59. End Sub

  60. Sub 多列求和()
  61.     Dim arr1(1 To 100, 1 To 4)
  62.     Dim irow      '存放key在字典里的行数
  63.     Dim k
  64.     With Sheet12
  65.         arr = .Range("a2:d6").Value
  66.         For i = 1 To UBound(arr)
  67.             If 字典.Exists(arr(i, 1)) Then    '判断每行数据在字典中是否存在
  68.                 irow = 字典(arr(i, 1))        '在字典中的行数
  69.                 arr1(irow, 2) = arr1(irow, 2) + arr(i, 2)     '相同的key把数量相加
  70.                 arr1(irow, 4) = arr1(irow, 4) + arr(i, 4)     '相同的key把金额累加
  71.             Else                                'key在字典中不存在新建key
  72.                 k = k + 1
  73.                 字典(arr(i, 1)) = k
  74.                 arr1(k, 1) = arr(i, 1)
  75.                 arr1(k, 2) = arr(i, 2)
  76.                 arr1(k, 3) = arr(i, 3)
  77.                 arr1(k, 4) = arr(i, 4)
  78.             End If
  79.         Next
  80.         .Range("a13").Resize(k, 4) = arr1
  81.     End With
  82. End Sub

  83. Sub 多条件求和()
  84. Dim arr1(1 To 100, 1 To 4)
  85.     Dim irow      '存放key在字典里的行数
  86.     Dim k, st As String
  87.     With Sheet13
  88.         arr = .Range("a2:d6").Value
  89.         For i = 1 To UBound(arr)
  90.         st = arr(i, 1) & "-" & arr(i, 2)  '把产品和规格连起来作为一个key
  91.             If 字典.Exists(st) Then    '判断每行数据在字典中是否存在
  92.                 irow = 字典(st)        '在字典中的行数
  93.                 MsgBox 字典(st)
  94.                 arr1(irow, 3) = arr1(irow, 3) + arr(i, 3)     '相同的key把数量相加
  95.             Else                                'key在字典中不存在新建key
  96.                 k = k + 1
  97.                 字典(st) = k
  98.                 arr1(k, 1) = arr(i, 1)
  99.                 arr1(k, 2) = arr(i, 2)
  100.                 arr1(k, 3) = arr(i, 3)
  101.             End If
  102.         Next
  103.         .Range("a11").Resize(k, 4) = arr1
  104.     End With
  105. End Sub
复制代码

点评

第一题 区分大小写,没有做好,单条件求和,有错误. 多条件求和 有错误.  发表于 2013-11-21 12:26

评分

参与人数 1 +3 金币 +15 收起 理由
从从容容 + 3 + 15 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-11-19 15:08 | 显示全部楼层
【VBA字典数组201301班】B07-shanxiren.rar (42.02 KB, 下载次数: 10)

点评

多列求和 的"单价"有错,总体不错,但代码还可以优化.希望继续努力,  发表于 2013-11-21 12:31

评分

参与人数 1 +5 金币 +19 收起 理由
从从容容 + 5 + 19 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 04:15 , Processed in 0.455040 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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