Excel精英培训网

 找回密码
 注册
查看: 2299|回复: 5

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

[复制链接]
发表于 2013-12-7 18:38 | 显示全部楼层 |阅读模式
本帖最后由 sliang28 于 2013-12-20 09:22 编辑

【VBA字典数组201301班】D组 - 第五讲作业上交专用,其它成员忽入

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

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

作业上交截止时间:2013年12月11日  20:00
原则上未评分和未开贴前上交均视为有效,不能按时上交的请提前告知!!

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-12-10 18:58 | 显示全部楼层
本帖最后由 风林火山 于 2013-12-10 19:01 编辑

Sub work1()
    Dim arr, brr, crr, drr
    Dim d_dq As Object, d_pz As Object, d_hz As Object
    Dim k%, i%, j%, m%, n%, str1$, str2$
    Set d_dq = CreateObject("scripting.dictionary")
    Set d_pz = CreateObject("scripting.dictionary")
    Set d_hz = CreateObject("scripting.dictionary")
    '数组赋值
    arr = Range("A1").CurrentRegion
    '生成字典数据
    For k = 2 To UBound(arr)
        If d_dq.exists(arr(k, 1)) = False Then d_dq(arr(k, 1)) = ""
        If d_pz.exists(arr(k, 2)) = False Then d_pz(arr(k, 2)) = ""
        str1 = arr(k, 1) & arr(k, 2)
        If d_hz.exists(str1) = False Then
            d_hz(str1) = arr(k, 3)
        Else
            d_hz(str1) = d_hz(str1) + arr(k, 3)
        End If
    Next k
    '重新定义数组维度
    ReDim brr(1 To d_dq.Count + 1, 1 To d_pz.Count + 1)
    '字典转成数组数据
    crr = d_dq.keys
    drr = d_pz.keys
    '数据填充
    For i = 0 To UBound(crr)
        brr(i + 2, 1) = crr(i)
    Next i
    For j = 0 To UBound(drr)
        brr(1, j + 2) = drr(j)
    Next j
    For m = 2 To UBound(brr)
        For n = 2 To UBound(brr, 2)
            str2 = brr(m, 1) & brr(1, n)
            brr(m, n) = d_hz(str2)
        Next n
    Next m
    brr(1, 1) = "    品种" & "    " & Chr(10) & "地区"
    '数据显示和格式设置
    Range("f:l").Delete
    Range("f1").Resize(UBound(brr), UBound(brr, 2)) = brr
    Range("f1").CurrentRegion.Borders.LineStyle = xlContinuous
    Range("f1").Borders(xlDiagonalDown).LineStyle = xlContinuous
End Sub

Sub work1_2()
    Dim arr, brr()
    Dim d_dq As Object, d_pz As Object
    Dim k%, i%, j%, m%, n%, str1$, str2$
    Set d_dq = CreateObject("scripting.dictionary")
    Set d_pz = CreateObject("scripting.dictionary")
    '数组赋值
    arr = Range("A1").CurrentRegion
    '生成不重复地区和品种数据,并汇总
    For k = 2 To UBound(arr)
        If d_dq.exists(arr(k, 1)) = False Then d_dq(arr(k, 1)) = d_dq.Count + 1
        If d_pz.exists(arr(k, 2)) = False Then d_pz(arr(k, 2)) = d_pz.Count + 1
        ReDim Preserve brr(1 To UBound(arr), 1 To d_pz.Count + 1)
        m = d_dq(arr(k, 1)) + 1: n = d_pz(arr(k, 2)) + 1
        brr(m, n) = brr(m, n) + arr(k, 3)
    Next k
   
    brr(1, 1) = "    品种" & "    " & Chr(10) & "地区"
    '数据显示和格式设置
    Range("f:l").Delete
    Range("f1").Resize(UBound(brr), UBound(brr, 2)) = brr
    Range("f2").Resize(d_dq.Count, 1) = Application.WorksheetFunction.Transpose(d_dq.keys)
    Range("g1").Resize(1, d_pz.Count) = d_pz.keys
    Range("f1").CurrentRegion.Borders.LineStyle = xlContinuous
    Range("f1").Borders(xlDiagonalDown).LineStyle = xlContinuous
End Sub

Sub work2()
    Dim arr, brr()
    Dim k%, i%, j%, hb%, m%, n%, str1$
    Dim d1 As Object, d2 As Object
    Set d1 = CreateObject("scripting.dictionary")
    Set d2 = CreateObject("scripting.dictionary")
    '数组赋值
    arr = Sheets("作业二").Range("a1").CurrentRegion
    '重新定义数组维数
    ReDim brr(1 To UBound(arr), 1 To 100)
    Application.ScreenUpdating = False
    '用字典保存数据所在列数和第二行列标题赋值
    For k = 1 To 12
        d1(k & "月" & "草莓") = d1.Count + 1: brr(2, k * 4 - 2) = "草莓": brr(1, k * 4 - 2) = k & "月"
        d1(k & "月" & "苹果") = d1.Count + 1: brr(2, k * 4 - 1) = "苹果"
        d1(k & "月" & "葡萄") = d1.Count + 1: brr(2, k * 4) = "葡萄"
        d1(k & "月" & "小计") = d1.Count + 1: brr(2, k * 4 + 1) = "小计"
    Next k
    d1("总计") = ""
    '需要合并的单元格单独赋值
    brr(1, 1) = "省份": brr(1, 50) = "总计"
    '通过字典汇总3类数据,品种、小计、总计
    For i = 2 To UBound(arr)
    If d2.exists(arr(i, 2)) = False Then
    d2(arr(i, 2)) = d2.Count + 3 '+3的目的是为下面循环做准备,也就是直接就是不包括标题行循环
    End If
    '分别取出行号m、列号n和总计列号j,循环赋值
    m = d2(arr(i, 2)): n = d1(Month(arr(i, 1)) & "月" & arr(i, 3)) + 1: j = d1(Month(arr(i, 1)) & "月小计") + 1
    brr(m, n) = brr(m, n) + arr(i, 4)
    brr(m, j) = brr(m, j) + arr(i, 4)
    brr(m, 50) = brr(m, 50) + arr(i, 4)
    Next i
    '在指定区域显示数据
    [f1].Resize(UBound(brr), UBound(brr, 2)) = brr
    '添加省份数据
    Range("f3").Resize(d2.Count, 1) = Application.WorksheetFunction.Transpose(d2.keys)
    '循环合并首行月份标题
    For hb = 1 To 12
        Sheets("作业二").Range(Cells(1, hb * 4 + 3), Cells(1, hb * 4 + 6)).Select
        Selection.HorizontalAlignment = xlCenter
        Selection.Merge
    Next hb
    '合并总计和省份标题
    Sheets("作业二").[bc1:bc2].Select
    Selection.HorizontalAlignment = xlCenter
    Selection.Merge
    Sheets("作业二").[f1:f2].Select
    Selection.HorizontalAlignment = xlCenter
    Selection.Merge
    '数据区域格式设置
    Sheets("作业二").Range("f1").CurrentRegion.Borders.LineStyle = xlContinuous
    Sheets("作业二").Range("f1").CurrentRegion.Select
    Selection.Interior.ColorIndex = 45
    Sheets("作业二").Range("g3:bc13").Select
    Selection.Interior.ColorIndex = 34
    Application.ScreenUpdating = True
    [f1].Select
End Sub
Sub 自动发帖()
'    On Error Resume Next
    With CreateObject("internetexplorer.application")
        .Visible = True
        .Navigate "http://www.excelpx.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&username=用户名&password=pass"    '登录
        Do Until .ReadyState = 4
            DoEvents
        Loop
        .Navigate "http://www.excelpx.com/forum.php?mod=post&action=newthread&fid=99&referer=http%3A//www.excelpx.com/forum-99-1.html"
      
    End With

End Sub

评分

参与人数 1 +10 金币 +15 收起 理由
sliang28 + 10 + 15 进步很快,这么长的代码写的很流畅,加油

查看全部评分

回复

使用道具 举报

发表于 2013-12-10 22:05 | 显示全部楼层
D09:fffox上交作业
作业一:
  1. Sub 作业一_a()
  2.     Dim arr, brr(), Dq, Pz
  3.     Dim d_dq, d_pz, d
  4.     Dim i&, j%
  5.     Set d_dq = CreateObject("scripting.dictionary")     '地区
  6.     Set d_pz = CreateObject("scripting.dictionary")     '品种
  7.     Set d = CreateObject("scripting.dictionary")        '数量
  8.     arr = Sheets("作业一").Range("a1").CurrentRegion
  9.     For i = 2 To UBound(arr)    '源数组内循环,分别以地区、品种及地区&品种为关键字创建字典
  10.         d_dq(arr(i, 1)) = ""
  11.         d_pz(arr(i, 2)) = ""
  12.         d(arr(i, 1) & arr(i, 2)) = d(arr(i, 1) & arr(i, 2)) + arr(i, 3)
  13.     Next
  14.     Pz = d_pz.Keys
  15.     Dq = d_dq.Keys
  16.     '根据地区、品种字典大小,重新定义结果数组
  17.     ReDim brr(1 To d_dq.Count + 1, 1 To d_pz.Count + 1)
  18.     brr(1, 1) = "    品种" & vbCrLf & "地区"
  19.     For j = 2 To UBound(brr, 2) '标题行
  20.         brr(1, j) = Pz(j - 2)
  21.     Next
  22.     For i = 2 To UBound(brr)
  23.         brr(i, 1) = Dq(i - 2)   '地区列
  24.         For j = 2 To UBound(brr, 2)
  25.             brr(i, j) = d(brr(i, 1) & brr(1, j))    '从字典中取数
  26.         Next
  27.     Next
  28.     With Sheets("作业一").Range("f1")       '设置格式及数据写入目标区域
  29.         .Resize(Rows.Count, 7).Clear
  30.         .Borders(xlDiagonalDown).LineStyle = 1      '斜线
  31.         .Offset(0, 1).Resize(1, d_pz.Count).HorizontalAlignment = xlCenter  '水平距中
  32.         .Offset(1, 0).Resize(d_dq.Count).HorizontalAlignment = xlCenter
  33.         With .Resize(d_dq.Count + 1, d_pz.Count + 1)
  34.             .Value = brr
  35.             .Borders(7).LineStyle = 1   '区域左边的边框
  36.             .Borders(8).LineStyle = 1   '区域顶部的边框
  37.             .Borders(9).LineStyle = 1   '区域底部的边框
  38.             .Borders(10).LineStyle = 1  '区域右边的边框
  39.             .Borders(11).LineStyle = 1  '区域中所有单元格的垂直边框
  40.             .Borders(12).LineStyle = 1  '区域中所有单元格的水平边框
  41.         End With
  42.     End With
  43. End Sub

  44. Sub 作业一_b()
  45.     Dim arr, brr(1 To 100, 1 To 100), d_dq, d_pz
  46.     Dim i&, j%, iRow As Byte, iCol As Byte, k_Row%, k_Col%
  47.     Set d_dq = CreateObject("scripting.dictionary")
  48.     Set d_pz = CreateObject("scripting.dictionary")
  49.     arr = Sheets("作业一").Range("a1").CurrentRegion
  50.     k_Row = 1: k_Col = 1
  51.     For i = 2 To UBound(arr)
  52.         If Not d_dq.Exists(arr(i, 1)) Then
  53.             k_Row = k_Row + 1   '数值增加1
  54.             iRow = k_Row        '行号
  55.             d_dq(arr(i, 1)) = k_Row '新行号存入字典
  56.             brr(iRow, 1) = arr(i, 1)    '地区
  57.         Else
  58.             iRow = d_dq(arr(i, 1))  '从字典中取行号
  59.         End If
  60.         If Not d_pz.Exists(arr(i, 2)) Then
  61.             k_Col = k_Col + 1   '列数值增加1
  62.             iCol = k_Col        '列号
  63.             d_pz(arr(i, 2)) = iCol  '列号存入字典
  64.             brr(1, iCol) = arr(i, 2)    '品种
  65.         Else
  66.             iCol = d_pz(arr(i, 2))  '从字典中取列号
  67.         End If
  68.         brr(iRow, iCol) = brr(iRow, iCol) + arr(i, 3)
  69.     Next
  70.     brr(1, 1) = "    品种" & vbCrLf & "地区"
  71.     With Sheets("作业一").Range("t1")
  72.         .Resize(Rows.Count, 7).Clear
  73.         .Borders(xlDiagonalDown).LineStyle = 1      '斜线
  74.         .Offset(0, 1).Resize(1, d_pz.Count).HorizontalAlignment = xlCenter  '水平距中
  75.         .Offset(1, 0).Resize(d_dq.Count).HorizontalAlignment = xlCenter
  76.         With .Resize(d_dq.Count + 1, d_pz.Count + 1)
  77.             .Value = brr
  78.             .Borders(7).LineStyle = 1  '单元格边框线
  79.             .Borders(8).LineStyle = 1
  80.             .Borders(9).LineStyle = 1
  81.             .Borders(10).LineStyle = 1
  82.             .Borders(11).LineStyle = 1
  83.             .Borders(12).LineStyle = 1
  84.         End With
  85.     End With
  86. End Sub
复制代码
作业二:
  1. Sub 作业二A()
  2.     Dim arr, brr(), d
  3.     Dim i%, j As Byte, iRow%, iCol%, k%
  4.     Const str As String = "草莓苹果葡萄"
  5.    
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Sheets("作业二").Range("a1").CurrentRegion
  8.    
  9.     For i = 2 To UBound(arr)
  10.         '计算结果数组中的列号
  11.         iCol = (Month(arr(i, 1)) - 1) * 4 + (InStr(str, arr(i, 3)) + 1) / 2 + 1
  12.         If Not d.Exists(arr(i, 2)) Then
  13.             k = k + 1
  14.             iRow = k    '行号
  15.             d(arr(i, 2)) = k
  16.             ReDim Preserve brr(1 To 50, 1 To k)     '重新定义结果数组
  17.             brr(1, k) = arr(i, 2)
  18.         Else
  19.             iRow = d(arr(i, 2))
  20.         End If
  21.         brr(iCol, iRow) = brr(iCol, iRow) + arr(i, 4)   '结果数组赋值
  22.     Next
  23.     For i = 1 To k      '计算小计及合计
  24.         For j = 1 To 12
  25.             brr(4 * j + 1, i) = brr(4 * j - 2, i) + brr(4 * j - 1, i) + brr(4 * j, i)
  26.             brr(50, i) = brr(50, i) + brr(4 * j + 1, i)
  27.         Next
  28.     Next
  29.     With Sheets("作业二").Range("f3")
  30.         .Resize(1000, 50).ClearContents
  31.         .Resize(k, 50) = WorksheetFunction.Transpose(brr)
  32.     End With
  33. End Sub
复制代码
作业二:附加,可自动适应月份、品种变化增减标题
  1. Sub 作业二B()
  2.     Dim arr, brr()
  3.     Dim dMon As New Dictionary  '创建月份字典
  4.     Dim dDq As New Dictionary   '创建地区字典
  5.     Dim dPz As New Dictionary   '创建品种字典
  6.     Dim d As New Dictionary     '创建数量字典
  7.     Dim x%, y%, z%, k%, str$, ColEnd%, RowEnd%
  8.     Dim Mon, Dq, Pz
  9.     '读入源数据,字典赋值
  10.     arr = Sheets("作业二").Range("a1").CurrentRegion
  11.     For x = 0 To 2
  12.         dPz.Add Array("草莓", "苹果", "葡萄")(x), ""
  13.     Next
  14.     For x = 2 To UBound(arr)
  15.         str = Month(arr(x, 1)) & "月" & arr(x, 2) & arr(x, 3)
  16.         d(str) = d(str) + arr(x, 4)
  17.         dMon(Month(arr(x, 1))) = ""
  18.         dDq(arr(x, 2)) = ""
  19.         If Not dPz.Exists(arr(x, 3)) Then dPz(arr(x, 3)) = ""
  20.     Next
  21.    
  22.     '重新声明结果数组,标题行赋值
  23.     k = dPz.Count + 1
  24.     ColEnd = dMon.Count * k + 2
  25.     RowEnd = dDq.Count + 2
  26.     ReDim brr(1 To RowEnd, 1 To ColEnd)
  27.     For x = 1 To dMon.Count
  28.         brr(1, k * (x - 1) + 2) = dMon.Keys(x - 1) & "月"
  29.         For y = 1 To k - 1
  30.             brr(2, k * (x - 1) + y + 1) = dPz.Keys(y - 1)
  31.         Next
  32.         brr(2, k * (x - 1) + y + 1) = "小计"
  33.     Next
  34.     brr(1, 1) = "省份"
  35.     brr(1, ColEnd) = "合计"
  36.    
  37.     For x = 3 To RowEnd
  38.         brr(x, 1) = dDq.Keys(x - 3)
  39.         For y = 1 To dMon.Count
  40.             For z = 1 To k - 1
  41.                 str = brr(1, k * (y - 1) + 2) & brr(x, 1) & brr(2, k * (y - 1) + z + 1)
  42.                 brr(x, k * (y - 1) + z + 1) = d(str)
  43.                 brr(x, k * y + 1) = brr(x, k * y + 1) + brr(x, k * (y - 1) + z + 1) '小计
  44.             Next
  45.         brr(x, ColEnd) = brr(x, ColEnd) + brr(x, k * y + 1)     '合计
  46.         Next
  47.     Next
  48.     '目标区域赋值,格式设置
  49.     With Sheets("作业二")
  50.         .Range("bf1", .Cells(Rows.Count, .Cells(1, Columns.Count).End(xlToLeft).Column)).Clear
  51.         With .Range("bf1")
  52.             .Resize(2, ColEnd).HorizontalAlignment = xlCenter   '标题行居中
  53.             .Resize(2, ColEnd).Interior.Color = RGB(255, 204, 153)
  54.             .Resize(RowEnd).HorizontalAlignment = xlCenter      '地区列居中
  55.             .Resize(RowEnd).Interior.Color = RGB(255, 204, 153)
  56.             .Resize(2).Merge                        '单元格合并
  57.             .Offset(0, ColEnd - 1).Resize(2).Merge
  58.             For x = 1 To dMon.Count
  59.                 .Offset(0, k * (x - 1) + 1).Resize(1, k).Merge
  60.             Next
  61.             With .Resize(RowEnd, ColEnd)
  62.                 .Value = brr
  63.                 .Borders(7).LineStyle = 1   '单元格边框
  64.                 .Borders(8).LineStyle = 1
  65.                 .Borders(9).LineStyle = 1
  66.                 .Borders(10).LineStyle = 1
  67.                 .Borders(11).LineStyle = 1
  68.                 .Borders(12).LineStyle = 1
  69.             End With
  70.         End With
  71.     End With
  72. End Sub
复制代码
作业三:用了个笨方法实现循环发贴
经测试,IE6,IE8均成功。
  1. Sub 作业三()
  2.     Dim ie
  3.     Dim i%
  4.     For i = 2 To 4
  5.         Set ie = CreateObject("internetexplorer.application")
  6.         With ie
  7.             .Navigate "http://www.excelpx.com/forum-99-1.html"  '打开指定的网页
  8.             .Visible = True    '显示网页
  9.             Do Until .ReadyState = READYSTATE_COMPLETE     '如果IE加载宏完成
  10.                 DoEvents
  11.             Loop
  12.             With .Document
  13.                 .getElementById("typeid_fast").Click    '点击选择主题分类
  14.                 .all.tags("li")(1).Click                    '点击选择文字
  15.                 .all("subject").Value = Sheets("作业三").Cells(i, 1).Value
  16.                 .all("message").Value = Sheets("作业三").Cells(i, 2).Value
  17.                 .forms(2).submit        '提交表单
  18.             End With
  19.             While .ReadyState <> 4 Or .Busy
  20.                 DoEvents
  21.             Wend
  22.             .Quit
  23.         End With
  24.         Set ie = Nothing
  25.         Application.Wait (Now + TimeValue("0:00:10"))       '间隔10秒后再继续
  26.     Next
  27. End Sub
复制代码

评分

参与人数 1 +10 金币 +20 收起 理由
sliang28 + 10 + 20 D组的高手

查看全部评分

回复

使用道具 举报

发表于 2013-12-11 00:03 | 显示全部楼层
本帖最后由 一杯清荼 于 2013-12-11 00:11 编辑

  1. Sub 作业二()
  2.     Dim diqu As New Dictionary, pinzhong As New Dictionary
  3.     Dim i As Integer, x As Integer, y As Integer, n As Integer
  4.     Dim arr, brr
  5.     arr = [a1].CurrentRegion
  6.     ReDim brr(1 To UBound(arr), 1 To UBound(arr))
  7.     For i = 2 To UBound(arr)
  8.         If Not diqu.Exists(arr(i, 2)) Then
  9.             diqu(arr(i, 2)) = diqu.Count + 1 '标记地区位置
  10.         End If
  11.     Next
  12.     For i = 1 To 12                                      '标记每个月品种的位置
  13.         pinzhong(i & "月草莓") = pinzhong.Count + 1
  14.         pinzhong(i & "月苹果") = pinzhong.Count + 1
  15.         pinzhong(i & "月葡萄") = pinzhong.Count + 1
  16.         pinzhong(i & "月小计") = pinzhong.Count + 1
  17.     Next
  18.     pinzhong("合计") = pinzhong.Count + 1
  19.         For i = 2 To UBound(arr)
  20.         x = diqu(arr(i, 2)) '行的位置
  21.         y = pinzhong(Month(arr(i, 1)) & "月" & arr(i, 3)) '列的位置
  22.         n = pinzhong(Month(arr(i, 1)) & "月小计") '每月小计的位置
  23.         brr(x, y) = brr(x, y) + arr(i, 4) '每月同个地区相同品种的总数量
  24.         brr(x, n) = brr(x, n) + arr(i, 4) '每月小计
  25.         brr(x, pinzhong("合计")) = brr(x, pinzhong("合计")) + arr(i, 4) '合计
  26.     Next
  27.     Range("f3").Resize(diqu.Count) = Application.WorksheetFunction.Transpose(diqu.Keys)
  28.     Range("g3").Resize(diqu.Count, pinzhong.Count) = brr
  29. End Sub
复制代码
  1. Sub 作业一()
  2. '下棋法
  3.     Dim diqu As New Dictionary, pinzhong As New Dictionary
  4.      Dim i As Integer, x As Integer, y As Integer
  5.      Dim arr, brr
  6.     arr = [a1].CurrentRegion
  7.     ReDim brr(1 To UBound(arr), 1 To UBound(arr))
  8.         For i = 2 To UBound(arr, 1)
  9.             If Not diqu.Exists(arr(i, 1)) Then
  10.                 diqu(arr(i, 1)) = diqu.Count + 1 '标记地区的位置
  11.             End If
  12.             If Not pinzhong.Exists(arr(i, 2)) Then
  13.                 pinzhong(arr(i, 2)) = pinzhong.Count + 1 '标记品种的位置
  14.             End If
  15.             x = diqu(arr(i, 1))    '行的位置
  16.             y = pinzhong(arr(i, 2)) '列的位置
  17.             brr(x, y) = brr(x, y) + arr(i, 3) '同个地区的同种品种之和
  18.         Next i
  19.          Range("f2").Resize(diqu.Count) = WorksheetFunction.Transpose(diqu.Keys)
  20.          Range("g1").Resize(1, pinzhong.Count) = pinzhong.Keys
  21.          Range("g2").Resize(diqu.Count, pinzhong.Count) = brr
  22. End Sub

复制代码

评分

参与人数 1 +10 金币 +15 收起 理由
sliang28 + 10 + 15 代码工整,喜欢看这样的代码

查看全部评分

回复

使用道具 举报

发表于 2013-12-11 16:23 | 显示全部楼层
D05:w2001pf
Option Explicit
Sub 作业1()
    Dim d As New Dictionary
    Dim d1 As New Dictionary
    Dim arr
    Dim hs, ls
    Dim arr1, j, k, i
    With Sheets("作业一")
        arr1 = .Range("a2:c" & Range("a65536").End(xlUp).Row)    '把数据源装入数组arr1
        For i = 1 To UBound(arr1)    '在数据源中循环,找到所有的品种
            d1(arr1(i, 2)) = ""
        Next i
        .Range("g1").Resize(, d1.Count) = d1.Keys    '把品种读入到表格中
        ReDim arr(1 To 20, 1 To d1.Count + 1)    '声明一个数组arr,把结果写入到数组arr中
        For j = 1 To UBound(arr1)
            For i = 0 To d1.Count - 1
                If arr1(j, 2) = d1.Keys(i) Then
                    ls = i + 2    '找到汇总的列数,列数用ls表示
                End If
            Next i
            If d.Exists(arr1(j, 1)) Then
                hs = d(arr1(j, 1))    '当关键字存在时,用hs来记录行数,也就是后面用k表示的行数
                arr(hs, ls) = arr(hs, ls) + arr1(j, 3)
            Else
                k = k + 1
                d(arr1(j, 1)) = k    '当关键字不存在时,用k表示行数
                arr(k, 1) = arr1(j, 1)
                arr(k, ls) = arr1(j, 3)
            End If
        Next j
        .Range("f2").Resize(k, d1.Count + 1) = arr    '把结果读入到表格中
    End With
End Sub
Sub 作业2()
    Dim i As Long
    Dim d1 As New Dictionary
    Dim d2 As New Dictionary
    Dim arr1, arr2, arr, hs
    With Sheets("作业二")
        .Range("F3:BC65536").ClearContents
        arr1 = .Range("a2:d" & Range("a65536").End(xlUp).Row)    '把数据源装入数组arr1
        arr2 = .Range("g2:bc2")    '把标题行装入数组arr2
        For i = 1 To UBound(arr1)
            If d1.Exists(arr1(i, 2)) = False Then
                d1(arr1(i, 2)) = d1.Count    '用字典d1确定结果数组的行数
            End If
        Next i
        For i = 1 To UBound(arr2, 2) - 1
            d2(((i - 1) \ 4 + 1) & "月" & arr2(1, i)) = d2.Count    '用字典d2确定结果数组的列数
        Next i
        d2("合计") = i
        ReDim arr(1 To d1.Count, 1 To d2.Count + 1)    '声明一个数组arr,把结果写入到数组arr中
        For i = 1 To UBound(arr1)
            arr(d1(arr1(i, 2)) + 1, 1) = arr1(i, 2)    '列出各地区名称
            arr(d1(arr1(i, 2)) + 1, d2(Month(arr1(i, 1)) & "月" & arr1(i, 3)) + 2) = arr(d1(arr1(i, 2)) + 1, d2(Month(arr1(i, 1)) & "月" & arr1(i, 3)) + 2) + arr1(i, 4)
            '按地区分月汇总各种水果的数量
            arr(d1(arr1(i, 2)) + 1, d2(Month(arr1(i, 1)) & "月小计") + 2) = arr(d1(arr1(i, 2)) + 1, d2(Month(arr1(i, 1)) & "月小计") + 2) + arr1(i, 4)
            '按地区分月汇总本月所有水果的数量
            arr(d1(arr1(i, 2)) + 1, d2("合计") + 1) = arr(d1(arr1(i, 2)) + 1, d2("合计") + 1) + arr1(i, 4)
            '按地区汇总本地区所有水果的数量
        Next i
        .Range("f3").Resize(d1.Count, d2.Count + 1) = arr    '把结果读入到表格中
    End With
End Sub

评分

参与人数 1 +10 金币 +15 收起 理由
sliang28 + 10 + 15 05同学进步快,都成高手了

查看全部评分

回复

使用道具 举报

发表于 2013-12-11 17:59 | 显示全部楼层
只作了1,2题

【VBA字典数组201301班】第五讲作业-ly258.rar

40.51 KB, 下载次数: 7

评分

参与人数 1 +10 金币 +15 收起 理由
sliang28 + 10 + 15 结果正确,代码还能简化

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:12 , Processed in 0.324637 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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