Excel精英培训网

 找回密码
 注册
查看: 3620|回复: 10

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

[复制链接]
发表于 2013-11-22 17:06 | 显示全部楼层 |阅读模式
本帖最后由 sliang28 于 2013-11-29 15:12 编辑

本贴为【VBA字典数组201301班】D组 第四讲作业 上交专用,其它学员勿入
作业要求:
1.要求使用字典完成
2.所有的代码均写在按钮指定的过程中
3.要求代码缩进
4.要求有注释(关键代码处)
5.要求强制声明

备注:只需要将代码贴出来即可,大家看清楚了{:3912:}


excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-11-23 10:45 | 显示全部楼层
本帖最后由 风林火山 于 2013-11-23 15:08 编辑
  1. Sub work1()
  2.     Dim arr, brr()
  3.     Dim k%, i%, h%, str$
  4.     Dim d As New Dictionary
  5.     arr = Worksheets("源数据一").Range("a1:l" & Worksheets("源数据一").Cells(Rows.Count, 1).End(3).Row)  '数组赋值
  6.     ReDim brr(1 To UBound(arr), 1 To 12) '重新定义数组
  7.     i = 2
  8.     For k = 2 To UBound(arr)
  9.     Rem 定义变量字符串
  10.         str = arr(k, 1) & arr(k, 2) & arr(k, 3) & arr(k, 4) & arr(k, 5) & arr(k, 6) & arr(k, 7) & arr(k, 8)
  11.         '下棋法获取数据:
  12.         If d.Exists(str) = False Then
  13.             d.Item(str) = i '用字典保存行号
  14.             brr(i, 1) = arr(k, 1): brr(i, 2) = arr(k, 2)
  15.             brr(i, 3) = arr(k, 3): brr(i, 4) = arr(k, 4)
  16.             brr(i, 5) = arr(k, 5): brr(i, 6) = arr(k, 6)
  17.             brr(i, 7) = arr(k, 7): brr(i, 8) = arr(k, 8)
  18.             brr(i, 9) = arr(k, 9): brr(i, 10) = arr(k, 10)
  19.             brr(i, 11) = arr(k, 11): brr(i, 12) = arr(k, 12)
  20.             i = i + 1
  21.         Else
  22.             h = d.Item(str) '提取行号
  23.             brr(h, 9) = brr(h, 9) & " " & arr(k, 9)
  24.             brr(h, 10) = brr(h, 10) + arr(k, 10)
  25.             brr(h - 1, 12) = ""
  26.         End If
  27.     Next k
  28.     '定义标题
  29.     brr(1, 1) = ("生产日期"): brr(1, 2) = ("编号")
  30.     brr(1, 3) = ("周期"): brr(1, 4) = ("月份")
  31.     brr(1, 5) = ("产品型号"): brr(1, 6) = ("生产线")
  32.     brr(1, 7) = ("班组"): brr(1, 8) = ("不良类型")
  33.     brr(1, 9) = ("不良位置"): brr(1, 10) = ("不良数量")
  34.     brr(1, 11) = ("备注"): brr(1, 12) = ("产量")
  35.    
  36.     Worksheets.Add '新建工作表
  37.     ActiveSheet.[a1].Resize(UBound(brr), 12) = brr '显示数据
  38.     ActiveSheet.Name = "第一题答案" & "-" & Format(Time, "hhmm") '工作表命名
  39. End Sub
  40. Sub work2()
  41.     Dim arr, brr, crr(1 To 10000, 1 To 6)
  42.     Dim i&, k&, n&, str1, str2
  43.     Dim d1 As New Dictionary
  44.     On Error Resume Next '容错
  45.     arr = Range("a2:f" & Cells(Rows.Count, 6).End(xlUp).Row) '数组赋值
  46.     brr = Range("h2:m" & Cells(Rows.Count, 13).End(xlUp).Row) '数组赋值
  47.     For i = 1 To UBound(arr) - 1
  48.         str1 = arr(i, 1) & "@" & arr(i, 2) & "@" & arr(i, 3) & "@" & arr(i, 4) & "@" & arr(i, 5) & "@" & arr(i, 6)
  49.         d1.Item(str1) = "" 'A组数据生成不重复数据
  50.     Next i
  51.     For k = 1 To UBound(brr) - 1
  52.         str2 = brr(k, 1) & "@" & brr(k, 2) & "@" & brr(k, 3) & "@" & brr(k, 4) & "@" & brr(k, 5) & "@" & brr(k, 6)
  53.         If d1.Exists(str2) = True Then '判断B组数据和A组数据相同数据
  54.             n = n + 1
  55.             '生成数据
  56.             crr(n, 1) = brr(k, 1): crr(n, 2) = brr(k, 2): crr(n, 3) = brr(k, 3): crr(n, 4) = brr(k, 4): crr(n, 5) = brr(k, 5): crr(n, 6) = brr(k, 6)
  57.         End If
  58.     Next k
  59. '显示数据
  60.     Range("o:t").ClearComments
  61.     Range("o1") = "C"
  62.     Range("o1:t1").Merge
  63.     Range("o1:t1").HorizontalAlignment = xlCenter
  64.     Range("o2").Resize(UBound(crr), 6) = crr
  65. End Sub
  66. Sub work3()
  67.     Dim arr, brr()
  68.     Dim d As New Dictionary
  69.     Dim k%, i%, m%, str As String
  70.     arr = Worksheets("作业三").Range("a1:c25")
  71.     For k = 2 To UBound(arr)
  72.         str = arr(k, 1) & " " & arr(k, 2) & " " & arr(k, 3)
  73.         If InStr(str, "湖北") Then    '生成包含湖北的不重复数据
  74.             d.Item(str) = k
  75.         End If
  76.     Next k
  77.    
  78.     ReDim brr(1 To d.Count, 1 To 3)    '重新定义数组
  79.     For i = 1 To d.Count
  80.         For m = 1 To 3
  81.             brr(i, m) = Split(d.Keys(i - 1), " ")(m - 1)    '拆分数据
  82.         Next m
  83.     Next i
  84.    
  85.     Worksheets("作业三").[e2].Resize(d.Count, 3) = brr    '显示数据
  86. End Sub
复制代码

点评

作业3结果不正确  发表于 2013-11-28 11:06

评分

参与人数 1金币 +14 收起 理由
sliang28 + 14 其它都很好!

查看全部评分

回复

使用道具 举报

发表于 2013-11-23 17:57 | 显示全部楼层
D05:w2001pf

Sub 作业1()
    Dim arr1, t, t2, sr
    Dim d1 As New Dictionary
    Dim i As Long, j As Long, k As Long, m As Long
    t = Timer
    Sheets("源数据一").Select    '定义一个装结果的数组
    arr1 = Sheets("源数据一").Range("A1:L" & Cells(Rows.Count, "A").End(xlUp).Row).Value    '把源数据装入数组中
    ReDim arrjg(1 To UBound(arr1), 1 To UBound(arr1, 2))
    For i = 1 To UBound(arr1)
        sr = arr1(i, 1) & "," & arr1(i, 5) & "," & arr1(i, 6) & "," & arr1(i, 7) & "," & arr1(i, 8)
        If d1.Exists(sr) = False Then    '当关键字第一次出现时
            k = k + 1
            d1(sr) = k    '计算关键字第一次的行数
            For j = 1 To UBound(arr1, 2)    '关键字第一次出现时,把相应的内容写入数组中
                arrjg(k, j) = arr1(i, j)
            Next j
        Else
            m = d1(sr)
            arrjg(m, 9) = arrjg(m, 9) & " " & arr1(i, 9)    '当关键字不是第一次出现时,把位置连接起来,把数量相加
            arrjg(m, 10) = arrjg(m, 10) + arr1(i, 10)
        End If
    Next
    t2 = Timer - t
    Worksheets.Add after:=Sheets(Sheets.Count)  '在所有表最右边插入一表
    ActiveSheet.Name = "第一题答案-" & t2
    On Error Resume Next
    ActiveSheet.Select
    Range("A1").Resize(UBound(arrjg), UBound(arrjg, 2)) = arrjg
    Cells.Columns.AutoFit
End Sub
Sub 作业2()
    Dim arr1, arr2, arrjg(), arrgd
    Dim d1 As New Dictionary
    Dim d2 As New Dictionary
    Dim i As Long, j As Long

    arr1 = Range("A2:F" & Cells(Rows.Count, "A").End(xlUp).Row).Value    '把A组数据装入数组中
    arr2 = Range("H2:M" & Cells(Rows.Count, "H").End(xlUp).Row).Value    '把B组数据装入数组中
    For i = 1 To UBound(arr1)
        d1(arr1(i, 1) & "," & arr1(i, 2) & "," & arr1(i, 3) & "," & arr1(i, 4) & "," & arr1(i, 5) & "," & arr1(i, 6)) = ""
        '通过字典d1去掉A组数据的重复值,把A组数据的一行六列作为关键字
    Next

    For i = 1 To UBound(arr2)
        If d1.Exists(arr2(i, 1) & "," & arr2(i, 2) & "," & arr2(i, 3) & "," & arr2(i, 4) & "," & arr2(i, 5) & "," & arr2(i, 6)) Then
            d2(arr2(i, 1) & "," & arr2(i, 2) & "," & arr2(i, 3) & "," & arr2(i, 4) & "," & arr2(i, 5) & "," & arr2(i, 6)) = ""
        End If '如果A组数据中存在的就在B组数据中去掉重复值
    Next
    arrgd = d2.Keys
    ReDim arrjg(1 To d2.Count, 1 To UBound(arr1, 2)) '定义一个结果数组
    For i = 0 To d2.Count - 1
        For j = 0 To 5
            arrjg(i + 1, j + 1) = Split(arrgd(i), ",")(j) '通过Split函数分列字典d2的关键字装入结果数组中
        Next j
    Next i
    Range("O2:T" & Cells(Rows.Count, "O").End(xlUp).Row).ClearContents
    Range("O2").Resize(UBound(arrjg), UBound(arrjg, 2)) = arrjg
End Sub
Sub 作业3()
    Dim arr1, arr2, arrjg(), arrgd, arrss
    Dim d1 As New Dictionary
    Dim d2 As New Dictionary
    Dim i As Long, j As Long

    arr1 = Range("A2:C" & Cells(Rows.Count, "A").End(xlUp).Row).Value    '把源数据装入数组中
    For i = 1 To UBound(arr1)
        If arr1(i, 3) <> "" Then d1(arr1(i, 1) & "," & arr1(i, 2)) = ""
        '如果第三列不为空,则通过字典d1去掉源数据的重复值,把源数据的一行两列作为关键字
    Next
    arrss = d1.Keys '把字典d1的关键字装入数组中
    For j = 0 To d1.Count - 1
        For i = 1 To UBound(arr1)
            If arr1(i, 1) & "," & arr1(i, 2) = arrss(j) Then
                d2(arr1(i, 1) & "," & arr1(i, 2) & "," & arr1(i, 3)) = ""
            End If    '如果字典d1的关键字存在的就在源数据中去掉重复值
        Next
    Next j
    arrgd = d2.Keys
    ReDim arrjg(1 To d2.Count, 1 To UBound(arr1, 2))    '定义一个结果数组
    For i = 0 To d2.Count - 1
        For j = 0 To 2
            arrjg(i + 1, j + 1) = Split(arrgd(i), ",")(j)    '通过Split函数分列字典d2的关键字装入结果数组中
        Next j
    Next i
    Range("E2:G" & Cells(Rows.Count, "E").End(xlUp).Row).ClearContents
    Range("E2").Resize(UBound(arrjg), UBound(arrjg, 2)) = arrjg
End Sub

点评

2,这就存在bug Range("E2:G" & Cells(Rows.Count, "E").End(xlUp).Row).ClearContents  发表于 2013-11-26 09:32
1-可以使用变量来代替连接字符串,增强代码可读性。  发表于 2013-11-26 09:31

评分

参与人数 1金币 +19 收起 理由
sliang28 + 19 结果正确,有点小瑕疵,扣1分

查看全部评分

回复

使用道具 举报

发表于 2013-11-25 10:15 | 显示全部楼层
交作业了
  1. Option Explicit

  2. Sub 作业一()    'by D09:fffox
  3.     Dim arr, arr1, brr(), t
  4.     Dim d As New Dictionary
  5.     Dim str$, i As Byte, j As Byte, k As Byte, iRow As Byte
  6.     Dim sh As Object
  7.     t = Timer
  8.    
  9.     With Sheets("源数据一")
  10.         arr = .Range("a2", .Cells(Rows.Count, "l").End(xlUp)).Value
  11.         arr1 = .Range("a1:l1").Value
  12.     End With
  13.     '按数值区域大小创建足够大的目标数组brr
  14.     ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  15.    
  16.     For i = LBound(arr) To UBound(arr)
  17.         '以数据源前8列为关键字进行对比
  18.         str = ""
  19.         For j = 1 To 8
  20.             str = str & arr(i, j)
  21.         Next j
  22.         If Not d.Exists(str) Then
  23.         '字典中不存在,则相应数据存入目标数组
  24.             k = k + 1
  25.             d(str) = k
  26.             For j = LBound(arr, 2) To UBound(arr, 2) - 1
  27.                 brr(k, j) = arr(i, j)
  28.             Next
  29.             '产量列,如果不良类型为“连锡”则为空,否则取值
  30.             If arr(i, 8) = "连锡" Then
  31.                 brr(k, 12) = ""
  32.             Else
  33.                 brr(k, 12) = arr(i, 12)
  34.             End If
  35.         Else
  36.         '如果字典存在,则在对应行进行处理
  37.             iRow = d(str)
  38.             brr(iRow, 9) = brr(iRow, 9) & " " & arr(i, 9)   '不良位置
  39.             brr(iRow, 10) = brr(iRow, 10) + arr(i, 10)      '不良数量增加
  40.         End If
  41.     Next
  42.    
  43.     '创建新工作表并写入数据,工作表命名
  44.     Set sh = Sheets.Add
  45.     With sh
  46.         .Range("a1:l1") = arr1
  47.         .Range("a2").Resize(k, UBound(arr, 2)) = brr
  48.         .Columns("a:l").AutoFit
  49.         .Name = "第一题答案-" & Timer - t
  50.     End With
  51.     Set sh = Nothing
  52. End Sub

  53. Sub 作业二()    'by D09:fffox
  54.     Dim d1 As New Dictionary
  55.     Dim str$, i&, j As Byte, k&
  56.     Dim arr, brr() As Byte, t
  57.     t = Timer
  58.    
  59.     With Sheets("作业二")
  60.         arr = .Range("a2").CurrentRegion
  61.         '在A组中循环,以每一行数值为关键字创建字典
  62.         For i = 2 To UBound(arr)
  63.             For j = 1 To 6
  64.                 str = str & "*" & arr(i, j)
  65.             Next
  66.             d1(str) = ""
  67.             str = ""
  68.         Next

  69.         arr = .Range("h2").CurrentRegion
  70.         '在B组中循环,以每行数值为关键字判断字典是否存在
  71.         '若存在,则说明该行数据一样,保存到数组brr中
  72.         For i = 2 To UBound(arr)
  73.             For j = 1 To 6
  74.                 str = str & "*" & arr(i, j)
  75.             Next
  76.             If d1.Exists(str) Then
  77.                 k = k + 1
  78.                 ReDim Preserve brr(1 To 6, 1 To k) As Byte
  79.                 For j = 1 To 6
  80.                     brr(j, k) = arr(i, j)
  81.                 Next
  82.             End If
  83.             str = ""
  84.         Next
  85.         '清空目标区域并把数组brr写入目标区域
  86.         .Range("o2", Cells(Rows.Count, "t")).ClearContents
  87.         .Range("o2").Resize(k, 6) = Application.Transpose(brr)
  88.     End With
  89.     Debug.Print Timer - t
  90. End Sub


  91. Sub 作业三()    'by D09:fffox
  92.     Dim dic As New Dictionary
  93.     Dim arr, brr()
  94.     Dim i%, j%, k%, str1$, str2$
  95.    
  96.     With Sheets("作业三")
  97.         arr = .Range("a2").CurrentRegion
  98.         For i = 2 To UBound(arr)
  99.             If arr(i, 3) = "" Then GoTo 100
  100.             '根据题目要求,县区为空的跳过
  101.             str1 = arr(i, 1) & arr(i, 2)
  102.             If Not dic.Exists(str1) Then
  103.                 dic(str1) = ""      '为第一次出现的省市创建字典
  104.                 For j = i To UBound(arr)
  105.                     str2 = arr(j, 1) & arr(j, 2)
  106.                     '省市相同且省市县首次出现的,创建字典并为目标数组赋值
  107.                     If str1 = str2 And Not dic.Exists(str2 & arr(j, 3)) Then
  108.                         dic(str2 & arr(j, 3)) = ""
  109.                         k = k + 1
  110.                         ReDim Preserve brr(1 To 3, 1 To k)
  111.                         brr(1, k) = arr(j, 1)
  112.                         brr(2, k) = arr(j, 2)
  113.                         brr(3, k) = arr(j, 3)
  114.                     End If
  115.                 Next
  116.             End If
  117. 100
  118.         Next
  119.         .Range("e2", Cells(Rows.Count, "g")).ClearContents
  120.         .Range("e2").Resize(k, 3) = WorksheetFunction.Transpose(brr)
  121.         .Columns("e:g").HorizontalAlignment = xlCenter  '居中
  122.     End With
  123. End Sub
复制代码

点评

写入前清除时要将工作表先激活就更好了  发表于 2013-11-26 09:43

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-25 15:15 | 显示全部楼层
本帖最后由 一杯清荼 于 2013-11-25 18:05 编辑

  1. Sub 作业一()
  2. '主要思路:下棋法
  3.   
  4.     Dim i As Integer, j As Integer, m As Integer, st As String, t As Double
  5.     Dim d As New Dictionary, arr, brr(1 To 200, 1 To 12)
  6.     t = Timer
  7.     arr = [a1].CurrentRegion
  8.     For i = 1 To UBound(arr)
  9.         st = arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 7) & arr(i, 8)
  10.         If Not d.Exists(st) Then
  11.             d(st) = d.Count + 1
  12.             For j = 1 To 11
  13.                 brr(d.Count, j) = arr(i, j)
  14.             Next
  15.             If brr(d.Count, 9) <> "IC" Then brr(d.Count, 12) = arr(i, 12) '不良位置为IC的产量为空
  16.         Else
  17.             m = d(st)
  18.             brr(m, 9) = brr(m, 9) & " " & arr(i, 9) '汇总假焊的所有不良位置
  19.             brr(m, 10) = brr(m, 10) + arr(i, 10) '同种不良类型的不良数量之和
  20.         End If
  21.     Next
  22.     Worksheets.Add.Name = "第一题答案-" & Timer - t
  23.     [a1].Resize(UBound(brr), 12) = brr
  24.     Columns("A:L").Select
  25.     Selection.Columns.AutoFit '自动调整列宽
  26. End Sub
复制代码

  1. Sub 作业三()
  2. '思路:将县区不为空的省市县区连接作为KEY写入字典,再用连接符分割写入数组
  3. Dim arr, brr(1 To 25, 1 To 3), d As Dictionary, i As Integer, crr
  4. Set d = New Dictionary
  5. arr = [a1].CurrentRegion
  6. For i = 2 To UBound(arr)
  7.     If arr(i, 3) <> "" Then
  8.     d(arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3)) = d.Count + 1
  9.    crr = Split(d.Keys(d.Count - 1), ",")
  10.    brr(d.Count, 1) = crr(0): brr(d.Count, 2) = crr(1): brr(d.Count, 3) = crr(2)
  11.     End If
  12. Next
  13.     [e2].Resize(d.Count, 3) = brr
  14. End Sub
复制代码
  1. Sub 作业二()
  2. '主要思路:将A列数据连接后写入字典,B列数据连接后如果在字典D中,则放入数组中。
  3.     Dim arr, brr, crr(), i As Double, d As New Dictionary, s As String, s2 As String, m As Double, k As Integer
  4.     arr = [a1].CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         s = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4) & "," & arr(i, 5) & "," & arr(i, 6)
  7.         d(s) = d.Count + 1
  8.     Next
  9.         brr = [h8].CurrentRegion
  10.         
  11.         For i = 2 To UBound(brr)
  12.             s2 = brr(i, 1) & "," & brr(i, 2) & "," & brr(i, 3) & "," & brr(i, 4) & "," & brr(i, 5) & "," & brr(i, 6)
  13.         If d.Exists(s2) Then
  14.              m = m + 1
  15.             ReDim Preserve crr(1 To 6, 1 To m) '因只能改变最未位的维位,固先将行列调换下位置,输出时转置下即可
  16.                  For k = 1 To 6
  17.                     crr(k, m) = arr(d(s2) + 1, k)
  18.                 Next
  19.         End If
  20.         Next
  21.         [o7].Resize(m, 6) = WorksheetFunction.Transpose(crr)
  22. End Sub
复制代码

点评

作业三结果不正确  发表于 2013-11-28 11:14

评分

参与人数 1金币 +14 收起 理由
sliang28 + 14 我没看清楚作业三,你也是

查看全部评分

回复

使用道具 举报

发表于 2013-11-26 10:35 | 显示全部楼层
作业三,实现三级下拉列表
  1. Option Explicit
  2. Dim arr, i%

  3. Private Sub Worksheet_Change(ByVal Target As Range)
  4.     Dim iList1$, iList2$
  5.     Dim d1 As New Dictionary
  6.     '如果选择的单元格不合要求则退出
  7.     If Target.Count > 1 Then Exit Sub
  8.     If Target.Row = 1 Or Target.Row > 50 Then Exit Sub
  9.     If Target.Column <> 5 And Target.Column <> 6 Then Exit Sub
  10.    
  11.     If Target <> "" Then
  12.         If Target.Column = 5 Then       '单元格在“省”这一列
  13.             For i = 1 To UBound(arr)
  14.                 If arr(i, 1) = Target.Value Then
  15.                     d1(arr(i, 2)) = ""  '以该省所辖市创建字典
  16.                 End If
  17.             Next
  18.             iList1 = Join(d1.Keys, ",") '市名的字符串,用于数据有效性
  19.             With Target.Offset(0, 1).Validation '创建右边单元格的数据有效性
  20.                 .Delete
  21.                 .Add Type:=xlValidateList, Formula1:=iList1
  22.             End With
  23.             Target.Offset(0, 1) = ""    '右边的单元格清空,方便正确输入
  24.         Else                            '单元格在“市”这一列
  25.             For i = 1 To UBound(arr)
  26.                 If arr(i, 2) = Target.Value And arr(i, 1) = Target.Offset(0, -1).Value Then
  27.                     d1(arr(i, 3)) = ""  '以所辖县区名为关键字创建字典
  28.                 End If
  29.             Next
  30.             iList2 = Join(d1.Keys, ",")
  31.             With Target.Offset(0, 1).Validation '设置县区单元格的数据有效性
  32.                 .Delete
  33.                 .Add Type:=xlValidateList, Formula1:=iList2
  34.             End With
  35.             Target.Offset(0, 1) = ""
  36.         End If
  37.     End If
  38. End Sub

  39. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  40.     Dim d As New Dictionary
  41.     Dim iList$
  42.     '如果点选的单元格不合要求则退出循环
  43.     If Target.Count > 1 Then Exit Sub
  44.     If Target.Column <> 5 Then Exit Sub
  45.     If Target.Row = 1 Or Target.Row > 50 Then Exit Sub
  46.     '读入源数据到arr数组
  47.     arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row)
  48.     For i = 1 To UBound(arr)
  49.         d(arr(i, 1)) = ""       '以省名为关键字创建字典
  50.     Next
  51.     iList = Join(d.Keys, ",")
  52.     '把不重复省名保存为字符串,用于数据有效性
  53.    
  54.     With Target.Validation      '创建有数据有效性
  55.         .Delete
  56.         .Add Type:=xlValidateList, Formula1:=iList
  57.     End With
  58.     Target.Offset(0, 1).Resize(1, 2) = ""
  59. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-26 13:35 | 显示全部楼层
  1. Sub 作业1()
  2.     Dim D As New Dictionary
  3.     Dim d1 As New Dictionary
  4.     Dim d2 As New Dictionary
  5.     Dim i, j, t, arr, arr1
  6.     arr = Range("a1:l" & Cells(Rows.Count, 1).End(3).Row)
  7.     D(arr(1, 1) & arr(1, 2) & arr(1, 5) & arr(1, 8)) = 1
  8.     For i = 2 To UBound(arr)
  9.         D(arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 8)) = i                                                                          '用字典D.ITEM记录唯一值在ARR数组中的行数
  10.         d1(arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 8)) = d1.Item(arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 8)) & " " & arr(i, 9)  '不良位置按条件进行连接的值放到字典d1中
  11.         d2(arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 8)) = d2.Item(arr(i, 1) & arr(i, 2) & arr(i, 5) & arr(i, 8)) + arr(i, 10)       '不良数据累加放到字典d2中
  12.     Next i
  13.     ReDim arr1(1 To D.Count, 1 To UBound(arr, 2))
  14.     t = 1
  15.     For Each i In D.Items
  16.         For j = 1 To UBound(arr1, 2)
  17.             arr1(t, j) = arr(i, j)          '把D.ITEM所记录的数据放到ARR1中
  18.         Next j
  19.         If t <> 1 Then
  20.             arr1(t, 9) = Mid(d1.Item(arr1(t, 1) & arr1(t, 2) & arr1(t, 5) & arr1(t, 8)), 2)     '同条件的不良位置用D1中的值替换
  21.             arr1(t, 10) = d2.Item(arr1(t, 1) & arr1(t, 2) & arr1(t, 5) & arr1(t, 8))            '同条件的不良数量用D2中的值替换
  22.         End If
  23.         If arr1(t, 9) = "IC" Then arr1(t, 12) = ""                                              '不良位置=CI的产量为空
  24.         t = t + 1
  25.     Next i
  26.     Sheets("效果一").Range("a1").Resize(Rows.Count, Columns.Count).Clear
  27.     Sheets("效果一").Range("a1").Resize(UBound(arr1, 1), UBound(arr1, 2)) = arr1
  28. End Sub



  29. Sub 作业2()
  30.     Dim D As New Dictionary
  31.     Dim arr, arr1, arr2, i, j, t, s
  32.     arr = Range("A2:f40000")
  33.     arr1 = Range("h2:m40000")
  34.     ReDim arr2(1 To 40000, 1 To 6)
  35.     For i = 1 To UBound(arr1)
  36.         D(arr1(i, 1) & arr1(i, 2) & arr1(i, 3) & arr1(i, 4) & arr1(i, 5) & arr1(i, 6)) = ""             '用B组数据建立字典
  37.     Next i
  38.     t = 1
  39.     For i = 1 To UBound(arr)
  40.         If D.Exists(arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4) & arr(i, 5) & arr(i, 6)) Then
  41.             For j = 1 To UBound(arr, 2)
  42.                 arr2(t, j) = arr(i, j)                                                                   '相同条件下,A组数据在字典D中能找到,把对应A组数据放到数组ARR2中
  43.             Next j
  44.             t = t + 1
  45.         End If
  46.     Next i
  47.     Range("o2").Resize(t, UBound(arr2, 2)) = arr2
  48. End Sub






  49. Sub 作业3()
  50.     Dim D As New Dictionary
  51.     Dim arr, arr1, i, t, s
  52.     arr = Range("a2:c25")
  53.     For i = 1 To UBound(arr)
  54.         If arr(i, 3) <> "" Then
  55.             D(arr(i, 1) & arr(i, 2) & arr(i, 3)) = i  '用省+市+县区建立字典D,ITEM记录数组ARR中的行数
  56.         End If
  57.     Next i
  58.     ReDim arr1(1 To D.Count, 1 To 3)                 '用D.COUNT重新定义数组长度
  59.     t = 1
  60.     For Each i In D.Items
  61.         For s = 1 To 3
  62.             arr1(t, s) = arr(i, s)                   '在ARR数组中,以ITEM所记录值的对应数据,放到数组ARR1中,
  63.         Next s
  64.         t = t + 1
  65.     Next i
  66.     Range("e2").Resize(UBound(arr1, 1), UBound(arr1, 2)) = arr1
  67.     With ActiveWorkbook.Worksheets("作业三").Sort        '排序
  68.         .SetRange Range("E1:G12")
  69.         .Header = xlYes
  70.         .MatchCase = False
  71.         .Orientation = xlTopToBottom
  72.         .SortMethod = xlPinYin
  73.         .Apply
  74.     End With
  75. End Sub
复制代码

点评

虽然排序了,但是作业三还是不正确。 加油  发表于 2013-11-28 11:18

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-27 10:10 | 显示全部楼层
  1. Sub 作业二()
  2.     Dim arr, brr, crr(), i As Double, d As New Dictionary, s As String, s2 As String, l As Double, o As Integer
  3.     arr = [a1].CurrentRegion
  4.     For i = 2 To UBound(arr)
  5.         s = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4) & "," & arr(i, 5) & "," & arr(i, 6)
  6.         d(s) = d.Count + 1
  7.     Next
  8.         brr = [h8].CurrentRegion
  9.         
  10.         For i = 2 To UBound(brr)
  11.             s2 = brr(i, 1) & "," & brr(i, 2) & "," & brr(i, 3) & "," & brr(i, 4) & "," & brr(i, 5) & "," & brr(i, 6)
  12.         If d.Exists(s2) Then
  13.              l = l + 1
  14.             ReDim Preserve crr(1 To 6, 1 To l)
  15.                  For o = 1 To 6
  16.                     crr(k, m) = arr(d(s2) + 1, o)
  17.                 Next
  18.         End If
  19.         Next
  20.         [o7].Resize(m, 6) = WorksheetFunction.Transpose(crr)
  21. End Sub
复制代码

点评

数组定义的大小有问题,加油  发表于 2013-11-28 11:21
回复

使用道具 举报

发表于 2013-11-27 14:56 | 显示全部楼层
  1. Sub homework1()
  2.     Dim dic As New Dictionary
  3.     Dim lrow As Long    '总行数
  4.     Dim x&, y%
  5.     Dim str As String
  6.     Dim k%, iRow
  7.     Dim arr(1 To 10000, 1 To 12)
  8.     Dim hArr
  9.     Dim t
  10.     t = Timer
  11.     With Sheets("源数据一")
  12.         hArr = .Range("a1:l1")
  13.         lrow = .Range("a" & .Rows.Count).End(3).Row
  14.         For x = 2 To lrow
  15.             str = ""
  16.             For y = 1 To 8
  17.                 str = str & "|" & .Cells(x, y)
  18.             Next y
  19.             If dic.Exists(str) Then
  20.                 iRow = dic(str)
  21.                 arr(iRow, 9) = arr(iRow, 9) & " " & .Cells(x, 9)
  22.                 arr(iRow, 10) = arr(iRow, 10) + .Cells(x, 10)

  23.             Else
  24.                 k = k + 1
  25.                 dic(str) = k
  26.                 For y = 1 To 11
  27.                     arr(k, y) = .Cells(x, y)
  28.                     If .Cells(x, 8) = "假焊" Then arr(k, 12) = .Cells(x, 12)
  29.                 Next y
  30.             End If
  31.         Next x
  32.     End With
  33.     Sheets.Add
  34.     With ActiveSheet
  35.         .Range("a1").Resize(1, 12) = hArr
  36.         .Range("a2").Resize(lrow - 1, 12) = arr
  37.         .Name = "第一题答案-" & Timer - t
  38.     End With
  39. End Sub
复制代码
  1. Sub homework2()
  2.     Dim dic As New Dictionary
  3.     Dim arr, brr, crr(1 To 100000, 1 To 6)
  4.     Dim k As Long
  5.     Dim x As Long
  6.     Dim str As String
  7.   
  8.     arr = Range("a2").CurrentRegion
  9.     For x = 2 To UBound(arr)
  10.         str = ""
  11.         For y = 1 To 6
  12.             str = str & "|" & arr(x, y)
  13.         Next y
  14.         dic(str) = ""
  15.     Next x
  16.     brr = Range("h2").CurrentRegion
  17.     For x = 2 To UBound(brr)
  18.         str = ""
  19.         For y = 1 To 6
  20.             str = str & "|" & brr(x, y)
  21.         Next y
  22.         If dic.Exists(str) Then
  23.             k = k + 1
  24.             For y = 1 To 6
  25.                 crr(k, y) = brr(x, y)
  26.             Next y
  27.         End If
  28.     Next x
  29.     Range("o2").Resize(k, 6) = crr
  30. End Sub
复制代码
  1. Sub homework3()
  2.     Dim dic As New Dictionary, dic1 As New Dictionary
  3.     Dim x%, y%, k%
  4.     Dim arr(1 To 100, 1 To 3), brr
  5.     brr = Range("a2:c25")
  6.     For x = 1 To 24
  7.         If brr(x, 1) = "湖北" Then
  8.             dic(brr(x, 2)) = brr(x, 2)
  9.         End If
  10.     Next x
  11.     For y = 0 To dic.Count - 1
  12.         For x = 1 To 24
  13.             If brr(x, 2) = dic.Items(y) Then
  14.                 If Not dic1.Exists(brr(x, 3)) Then
  15.                     k = k + 1
  16.                     arr(k, 1) = brr(x, 1): arr(k, 2) = brr(x, 2): arr(k, 3) = brr(x, 3)

  17.                     dic1(brr(x, 3)) = ""
  18.                 End If
  19.             End If
  20.         Next x
  21.     Next y
  22.     Range("e2").Resize(k, 3) = arr
  23. End Sub

复制代码

点评

D组的骄傲  发表于 2013-11-28 11:23

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-27 15:47 | 显示全部楼层
本帖最后由 xhrys 于 2013-11-28 12:34 编辑

在外地出差,没时间听课做作业,勉强做了一题,越来越跟不上讲课的进度了……

附件上传不上去
  1. Sub 作业二()
  2.     Dim arr1, arr2, arr3(1 To 10000)
  3.     Dim d1 As New Dictionary
  4.     Dim d2 As New Dictionary
  5.     Dim i As Long
  6.     Dim j As Long, k As Long

  7.     arr1 = Range("a2:f" & Cells(Rows.Count, "a").End(xlUp).Row).Value
  8.     arr2 = Range("h2:m" & Cells(Rows.Count, "a").End(xlUp).Row).Value
  9.     For i = 1 To UBound(arr1, 1)
  10.         d1(arr1(i, 1) & "-" & arr1(i, 2) & "-" & arr1(i, 3) & "-" & arr1(i, 4) & "-" & arr1(i, 5) & "-" & arr1(i, 6)) = ""
  11.     Next

  12.     For i = 1 To UBound(arr2, 1)
  13.         If d1.Exists(arr2(i, 1) & "-" & arr2(i, 2) & "-" & arr2(i, 3) & "-" & arr2(i, 4) & "-" & arr2(i, 5) & "-" & arr2(i, 6)) Then
  14.            d2(arr2(i, 1) & "-" & arr2(i, 2) & "-" & arr2(i, 3) & "-" & arr2(i, 4) & "-" & arr2(i, 5) & "-" & arr2(i, 6)) = ""
  15.         End If
  16.     Next

  17.     Range("o2:t65536").ClearContents
  18.     Range("v1").Resize(d2.Count) = WorksheetFunction.Transpose(d2.Keys)
  19.     j = Range("v1").End(xlDown).Row
  20.    
  21.     For k = 1 To j
  22.       arr3(k) = Split(Cells(k, "v").Value, "-")   'CInt为什么不起作用?
  23.       Range("o" & k + 1 & ":t" & k + 1) = arr3(k)
  24.     Next
  25.     Columns("v").ClearContents
  26.    
  27.    
  28.         Range("V1").Select
  29.     Application.CutCopyMode = False
  30.     Selection.Copy
  31.     Range("O2").Select
  32.     Range(Selection, Selection.End(xlToRight)).Select
  33.     Range(Selection, Selection.End(xlDown)).Select
  34.     Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
  35.         False, Transpose:=False
  36.    
  37. End Sub
复制代码

点评

结果正确,偷懒的做法,可以通过  发表于 2013-11-28 13:15
代码呢?  发表于 2013-11-28 11:24

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 15:59 , Processed in 0.288132 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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