Excel精英培训网

 找回密码
 注册
查看: 5745|回复: 19

[习题] [字典与数组二期1班] 第2讲作业上交帖

  [复制链接]
发表于 2011-12-25 21:59 | 显示全部楼层 |阅读模式
本帖最后由 研究研究 于 2011-12-28 18:03 编辑

关于作业的几点说明:
1.必做一,第一参数为单元格区域的时候,没有限制为一行或一列,可 为多行多列;第二参数是以出现的次数进行返回,出现的相同次数的元素是统一返回的。
2.选做一,那个筛选界面是我用来说明返回何种结果的,代码过程不用筛选。
3.选做二,就是不可以随机到相同的行次内容。随机选取的10行,要为原数据中不同的行次。


直接贴代码。

评分

参与人数 4 +52 收起 理由
sunjing-zxl + 21 辛苦了
liuguansky + 10 学委辛苦了。
rxj_0414 + 9 很给力!
windimi007 + 12 很给力!

查看全部评分

发表于 2011-12-25 23:12 | 显示全部楼层

  1. Sub rxj_0414附加题()
  2.     Dim D As New Dictionary, sht As Worksheet
  3.     Dim arr, arr2(), i As Long, j As Long, x As Integer, cnt As Long
  4.     With Sheet10
  5.         arr = .Range("A2:S" & .Range("B" & .Rows.Count).End(3).Row)
  6.         For i = 1 To UBound(arr)
  7.             D(arr(i, 14)) = D.Count
  8.         Next i
  9.         For x = 0 To D.Count - 1
  10.             Erase arr2
  11.             cnt = 0
  12.             For i = 1 To UBound(arr)
  13.                 If arr(i, 14) = D.Keys(x) Then
  14.                     cnt = cnt + 1
  15.                     ReDim Preserve arr2(1 To UBound(arr, 2), 1 To cnt)
  16.                     For j = 1 To UBound(arr, 2)
  17.                         arr2(j, cnt) = arr(i, j)
  18.                     Next j
  19.                 End If
  20.             Next i
  21.             For Each sht In Sheets
  22.                 If sht.Name = D.Keys(x) Then
  23.                     sht.Delete
  24.                 End If
  25.             Next sht
  26.             Set sht = Sheets.Add()
  27.             sht.Name = D.Keys(x)
  28.             sht.Rows(1) = .Rows(1).Value
  29.             sht.Range("A2").Resize(UBound(arr2, 2), UBound(arr2, 1)) = Application.Transpose(arr2)
  30.         Next x
  31.     End With
  32. End Sub
  33. Sub rxj_0414选做二()
  34.     Dim D As New Dictionary
  35.     Dim arr, arr2(), i As Long, j As Integer
  36.     arr = Sheet11.Range("A1:G" & Sheet11.Cells(Sheet11.Rows.Count, 1).End(3).Row)
  37.     Do
  38.         D(1 + Int(Rnd() * UBound(arr))) = ""
  39.     Loop Until D.Count = 10
  40.       
  41.     ReDim arr2(1 To D.Count, 1 To UBound(arr, 2))
  42.     For i = 1 To D.Count
  43.         For j = 1 To UBound(arr, 2)
  44.             arr2(i, j) = arr(D.Keys(i - 1), j)
  45.         Next j
  46.     Next i
  47.         Sheets("选做二").Range("A1:G10").ClearContents
  48.         Sheets("选做二").Range("A1:G10") = arr2
  49. End Sub
  50. Sub rxj_0414选做一()
  51.     Dim D As New Dictionary
  52.     Dim arr, i As Long, Str As String
  53.     Sheet4.Range("E2:E" & Sheet4.Cells(Sheet4.Rows.Count, 2).End(3).Row).ClearContents
  54.     arr = Sheet4.Range("A2:B" & Sheet4.Cells(Sheet4.Rows.Count, 2).End(3).Row).Formula
  55.     For i = 1 To UBound(arr)
  56.         If D.Exists(arr(i, 1)) Then
  57.             D.Item(arr(i, 1)) = D.Item(arr(i, 1)) & "+" & VBA.Mid(arr(i, 2), 2)
  58.         Else
  59.             D.Item(arr(i, 1)) = VBA.Mid(arr(i, 2), 2)
  60.         End If
  61.     Next i
  62.     If D.Count > 0 Then
  63.         Str = D("" & Sheet4.[e1] & "")
  64.     End If
  65.     If Len(Str) = 0 Then
  66.         MsgBox "没这个型号"
  67.         Exit Sub
  68.     End If
  69.     Erase arr
  70.     arr = VBA.Split(Str, "+", -1)
  71.     Sheet4.[E2].Resize(UBound(arr) + 1) = Application.Transpose(arr)
  72. End Sub

  73. Sub rxj_0414必做二()
  74.     Dim D As New Dictionary, arr, i As Long, sht As Worksheet
  75.     For Each sht In Sheets
  76.         If sht.Tab.Color = Sheet3.Tab.Color And sht.Index <> Sheet3.Index Then
  77.             arr = sht.Range("A2:B" & sht.Cells(sht.Rows.Count, 2).End(3).Row)
  78.             For i = 1 To UBound(arr)
  79.                 If D.Exists(arr(i, 1)) Then
  80.                     D(arr(i, 1)) = D(arr(i, 1)) + Val(arr(i, 2))
  81.                 Else
  82.                     D(arr(i, 1)) = Val(arr(i, 2))
  83.                 End If
  84.             Next i
  85.             Erase arr
  86.         End If
  87.     Next sht
  88.     Sheet3.Range("A:B").ClearContents
  89.     Sheet3.[A1].Resize(D.Count) = Application.Transpose(D.Keys)
  90.     Sheet3.[B1].Resize(D.Count) = Application.Transpose(D.Items)
  91. End Sub
  92. Function Jc(all, Optional n As Long = 1)
  93.     Dim D As New Dictionary, D2 As New Dictionary
  94.     Dim i As Long, a, arr
  95.     arr = all
  96.     For Each a In arr
  97.         D.Item(a) = D.Item(a) + 1
  98.     Next a
  99.     For i = 0 To D.Count - 1
  100.         If D2.Exists(D.Items(i)) Then
  101.             D2(D.Items(i)) = D2(D.Items(i)) & "|" & D.Keys(i)
  102.         Else
  103.             D2(D.Items(i)) = D.Keys(i)
  104.         End If
  105.     Next i
  106.     Jc_2 = D2(n)
  107. End Function

  108. Function Jc_2(all, Optional n As Long = 1)
  109.     Dim D As New Dictionary, D1 As New Dictionary
  110.     Dim arr, a, i As Long, j As Long, tmp
  111.     arr = all
  112.     On Error GoTo Err1
  113.     For Each a In arr
  114.         D(a) = D(a) + 1
  115.     Next a
  116.     If D.Count <= 1 Then
  117.         Jc = "没数据"
  118.         Exit Function
  119.     End If
  120.     For i = 0 To D.Count - 1
  121.         If D1.Exists(D.Items(i)) Then
  122.             D1(D.Items(i)) = D1(D.Items(i)) & "|" & D.Keys(i)
  123.         Else
  124.             D1(D.Items(i)) = D.Keys(i)
  125.         End If
  126.     Next i
  127.     Erase arr
  128.     arr = D1.Keys
  129.     For i = 0 To UBound(arr) - 1
  130.         For j = i + 1 To UBound(arr)
  131.             If arr(i) < arr(j) Then
  132.                 tmp = arr(i)
  133.                 arr(i) = arr(j)
  134.                 arr(j) = tmp
  135.             End If
  136.         Next j
  137.     Next i
  138.     If n - 1 > UBound(arr) Then
  139.         Jc = "最少元素排No." & UBound(arr) + 1
  140.     Else
  141.         Jc = D1(arr(n - 1))
  142.         If Jc = "" Then Jc = "空格"
  143.     End If
  144.     Exit Function
  145. Err1:
  146.     Jc = "第一参数应为数组"
  147. End Function
复制代码

点评

能检测到没有的型号,说明你考虑的很全面  发表于 2011-12-28 18:00
回复

使用道具 举报

发表于 2011-12-26 09:34 | 显示全部楼层

  1. '必做一:
  2. Function Jc(ar, Optional j As Long = 1)
  3. Dim s, arr, i As Long, d As New Dictionary
  4. Application.Volatile
  5. arr = ar
  6. For Each s In arr
  7.     d(s) = d(s) + 1
  8. Next s
  9. 'If j > d.Count Then Exit Function
  10. For i = 0 To d.Count - 1
  11.     If d.Items(i) = Application.Large(d.Items, j) Then
  12.         Jc = Jc & d.Keys(i) & "|"
  13.     End If
  14. Next i
  15. Jc = Left(Jc, Len(Jc) - 1)
  16. End Function

  17. '必做二:
  18. Sub 必做二()
  19. Dim sht As Worksheet, d As New Dictionary, i&, arr
  20. Application.ScreenUpdating = False
  21. With Sheets("必做二")
  22.     For Each sht In Sheets
  23.         If sht.Name <> "必做二" Then
  24.             If sht.Tab.ColorIndex = .Tab.ColorIndex Then
  25.                 arr = sht.Range("A2:B" & sht.Range("A" & sht.Rows.Count).End(3).Row)
  26.                 For i = 1 To UBound(arr)
  27.                     d(arr(i, 1)) = d(arr(i, 1)) + Val(arr(i, 2))
  28.                 Next i
  29.                 Erase arr
  30.             End If
  31.         End If
  32.     Next sht
  33.     .Range("A2:B" & .Range("A" & .Rows.Count).Row).ClearContents
  34.     .[A1] = "产品型号"
  35.     .[B1] = "数量汇总"
  36.     .[A2].Resize(d.Count) = Application.Transpose(d.Keys)
  37.     .[B2].Resize(d.Count) = Application.Transpose(d.Items)
  38. End With
  39. Application.ScreenUpdating = True
  40. End Sub

  41. '选做一:
  42. Private Sub Worksheet_Change(ByVal Target As Range)
  43. Dim arr, brr(1 To 10000), i&, k&, str$
  44. If Target.Address = "$E$1" Then
  45.     Range("E2:E" & Rows.Count).ClearContents
  46.     str = Target
  47.     arr = Range("A2:B" & Range("A" & Rows.Count).End(3).Row).FormulaR1C1
  48.     For i = 1 To UBound(arr)
  49.         If arr(i, 1) = str Then
  50.             k = k + 1
  51.             brr(k) = arr(i, 2)
  52.         End If
  53.     Next i
  54.     For i = 1 To k
  55.         [E1].Offset(i, 0) = Replace(brr(i), "=", "'=")
  56.     Next i
  57. End If
  58. End Sub

  59. '选做二:
  60. Sub 选做二()
  61. Dim arr, brr(1 To 10, 1 To 7), i&, j As Byte, k As Byte, d As New Dictionary
  62. With Sheets("选做二数据源")
  63.     arr = .Range("A1:G" & .Cells(.Rows.Count, 1).Row)
  64. End With
  65. Do
  66.     i = Int(Rnd() * 58600 + 1)
  67.     d(i) = ""
  68. Loop Until d.Count = 10
  69. For j = 1 To 10
  70.     For k = 1 To 7
  71.         brr(j, k) = arr(d.Keys(j - 1), k)
  72.     Next k
  73. Next j
  74. Sheets("选做二").[A1].Resize(10, 7) = ""
  75. Sheets("选做二").[A1].Resize(10, 7) = brr
  76. End Sub

  77. '附加题:
  78. Sub 附加题()
  79. Dim arr, i&, j&, k&, sh As Worksheet
  80. Application.DisplayAlerts = False
  81. With Sheets("附加题")
  82.     arr = .Range("N1:N" & .Range("N" & .Rows.Count).End(3).Row + 1)
  83.     For i = 2 To UBound(arr) - 1
  84.         j = i
  85.         While arr(i, 1) = arr(j, 1)
  86.             i = i + 1
  87.         Wend
  88.         For Each sh In Sheets
  89.             If sh.Name = arr(j, 1) Then
  90.                 k = MsgBox("是否删除" & arr(j, 1) & "工作表?", vbYesNo)
  91.                 If k = 6 Then sh.Delete
  92.             End If
  93.         Next sh
  94.         Set sh = Sheets.Add
  95.         sh.Name = arr(j, 1)
  96.         sh.[A1].Resize(1, 19) = .[A1].Resize(1, 19).Value
  97.         sh.[A2].Resize(i - j, 19) = .Range("A" & j).Resize(i - j, 19).Value
  98.         i = i - 1
  99.     Next i
  100. End With
  101. Application.DisplayAlerts = True
  102. End Sub

复制代码

点评

很好  发表于 2011-12-28 18:01
回复

使用道具 举报

发表于 2011-12-26 15:55 | 显示全部楼层
  1. Function Jc(rg, Optional n As Integer = 1)
  2. Dim arr, arr1()
  3. Dim d As New Dictionary
  4. Dim dc As New Dictionary
  5. Dim x As Long, ma
  6. arr = rg
  7. For x = 1 To UBound(arr) '
  8. d(arr(x, 1)) = d(arr(x, 1)) + 1
  9. Next x
  10. ma = Application.WorksheetFunction.Large(d.Items, n)
  11. For x = 1 To UBound(arr)
  12. If d(arr(x, 1)) = ma And Not dc.Exists(arr(x, 1)) Then
  13. dc.Add (arr(x, 1)), ""
  14. End If
  15. Next
  16. arr1 = dc.Keys
  17. For x = 1 To dc.Count
  18. Jc1 = Jc1 & arr1(x - 1) & "|"
  19. Next
  20. Jc = Left(Jc1, Len(Jc1) - 1)
  21. End Function
复制代码
  1. Sub 必做二()
  2. Dim d As New Dictionary
  3. Dim arr, brr, i As Long
  4. For Each sh In Sheets
  5. If sh.Tab.ColorIndex = Sheets("必做二").Tab.ColorIndex And sh.Name <> "必做二" Then
  6. arr = sh.Range("A2:b" & sh.Range("A" & Rows.Count).End(xlUp).Row)
  7. brr = sh.Range("A1:b1")
  8. For i = 1 To UBound(arr)
  9. d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) * 1
  10. Next
  11. End If
  12. arr = ""
  13. Next
  14. Sheets("必做二").Range("a1:b" & Range("A" & Rows.Count).End(xlUp).Row).ClearContents
  15. Sheets("必做二").[a1:b1] = brr
  16. Sheets("必做二").Range("a2").Resize(d.Count) = Application.Transpose(d.Keys)
  17. Sheets("必做二").Range("b2").Resize(d.Count) = Application.Transpose(d.Items)
  18. End Sub
复制代码
  1. Sub 选做一()
  2. Dim arr, cx As String, x As Long
  3. Dim temp As String, shu As String
  4. Range("e2:e" & Range("e65536").End(3).Row + 1).ClearContents
  5. cx = Range("e1").Value
  6. arr = Range("a2:b" & Range("a65536").End(3).Row).Formula
  7. For x = 1 To UBound(arr)
  8. If arr(x, 1) = cx Then
  9. shu = shu & Mid(arr(x, 2), 2, 99) & "+"
  10. End If
  11. Next
  12. If shu = "" Then
  13. MsgBox "未查到你输入的型号"
  14. Exit Sub
  15. End If
  16. arr1 = VBA.Split(shu, "+")
  17. Range("e2").Resize(UBound(arr1)) = Application.Transpose(arr1)
  18. End Sub
复制代码
  1. Sub 选做二()
  2. Dim irow As Long, k As Long
  3. Dim d As New Dictionary
  4. Dim arr1, arr2, arr(1 To 10, 1 To 7)
  5. irow = Sheets("选做二数据源").Range("a65536").End(3).Row + 1
  6. arr1 = Sheets("选做二数据源").Range("a1:g" & irow - 1)
  7. Application.Volatile
  8. Do
  9. k = Int(Rnd() * irow)
  10. If Not d.Exists(k) Then
  11. d.Add k, ""
  12. End If
  13. Loop Until d.Count = 10
  14. arr2 = Application.Transpose(d.Keys)
  15. For x = 1 To 10
  16. arr(x, 1) = arr1(arr2(x, 1), 1)
  17. arr(x, 2) = arr1(arr2(x, 1), 2)
  18. arr(x, 3) = arr1(arr2(x, 1), 3)
  19. arr(x, 4) = arr1(arr2(x, 1), 4)
  20. arr(x, 5) = arr1(arr2(x, 1), 5)
  21. arr(x, 6) = arr1(arr2(x, 1), 6)
  22. arr(x, 7) = arr1(arr2(x, 1), 7)
  23. Next

  24. Range("A1").Resize(10, 7) = arr
  25. End Sub
复制代码
  1. Sub 附加题()
  2. Dim arr1, arr2, brr, arr(1 To 1000, 1 To 19)
  3. Dim x As Long, m As Long, k As Long, y As Integer
  4. Dim d As New Dictionary, k1 As Long
  5. Application.ScreenUpdating = False
  6. Application.DisplayAlerts = False
  7. m = Cells(Rows.Count, 2).End(3).Row
  8. arr1 = Range("a2:s" & m)
  9. For x = 1 To m - 1
  10. If Not d.Exists(arr1(x, 14)) Then
  11. d.Add (arr1(x, 14)), ""
  12. End If
  13. Next x
  14. arr2 = Application.Transpose(d.Keys)
  15. brr = Range("a1:s1")

  16. For k = 1 To d.Count
  17. For x = 1 To m - 1
  18. If arr2(k, 1) = arr1(x, 14) Then
  19. k1 = k1 + 1
  20. For y = 1 To 19
  21. arr(k1, y) = arr1(x, y)
  22. Next y
  23. End If
  24. Next x
  25. For Each sh In Sheets
  26. If sh.Name = arr2(k, 1) Then

  27. If MsgBox("工作表“" & arr2(k, 1) & "”已存在,是否删除?", vbQuestion + vbYesNo, "删除提示") = vbYes Then
  28. Sheets(arr2(k, 1)).Delete
  29. MsgBox "删除成功"
  30. Else
  31. MsgBox "你取消了删除"
  32. GoTo 100
  33. End If
  34. End If
  35. Next
  36. Sheets.Add after:=Sheets(Sheets.Count)
  37. ActiveSheet.Name = arr2(k, 1)
  38. 100:
  39. Range("a1:s1") = brr
  40. Range("a2").Resize(k1, 19) = arr
  41. Erase arr
  42. k1 = 0
  43. Next k
  44. Sheets("附加题").Select
  45. Application.DisplayAlerts = True
  46. Application.ScreenUpdating = True
  47. End Sub
复制代码




点评

OK  发表于 2011-12-28 18:02
回复

使用道具 举报

发表于 2011-12-26 18:05 | 显示全部楼层
作业2-012-sunjing-zxl.rar (1.4 MB, 下载次数: 32)
回复

使用道具 举报

发表于 2011-12-26 18:21 | 显示全部楼层
Sub 我不知道呀()    '必做二代码
    On Error Resume Next
    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    Dim arr
    Dim i As Long
    Dim Sht As Worksheet, n As Long, u As Long, Arr1(), p As Long, j As Long
    For Each Sht In Worksheets
        If Sht.Name <> "必做二" And Sht.Tab.ColorIndex = 6 Then
            j = Sht.Range("a65536").End(xlUp).Row
        End If
        For p = 1 To j
            n = n + 1
            ReDim Preserve Arr1(1 To 2, 1 To n)
            Arr1(1, n) = Sht.Cells(p, 1)
            Arr1(2, n) = Sht.Cells(p, 2)
        Next
    Next
    arr = Application.Transpose(Arr1)
    For i = 1 To UBound(arr)
        If d.Exists(arr(i, 1)) Then
            d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) * 1
        Else
            d.Add arr(i, 1), arr(i, 2) * 1
        End If
    Next i
    s = d.Items
    Range("a2:b" & Rows.Count).Clear
    Range("a2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
    Range("b2").Resize(d.Count, 1) = Application.Transpose(d.Items)
End Sub
回复

使用道具 举报

发表于 2011-12-26 19:35 | 显示全部楼层
研究学委辛苦了!{:1612:}
【字典2.004】windimi007前来交作业,期待研究学委的点评!{:3112:}

必做一:
  1. Function Jc(rg As Range, Optional k As Long = 1)
  2.     Dim d As Object
  3.     Dim arr
  4.     Dim x, y
  5.     Dim i%, j%
  6.     Dim sr$
  7.     Set d = CreateObject("scripting.dictionary")
  8.     arr = rg
  9.     For i = 1 To UBound(arr)
  10.         For j = 1 To UBound(arr, 2)
  11.             d(arr(i, j)) = d(arr(i, j)) + 1
  12.         Next j
  13.     Next i
  14.     x = d.keys
  15.     y = d.items
  16.     For i = 0 To d.Count - 1
  17.         If y(i) = k Then sr = sr & x(i) & "|"
  18.     Next i
  19.     Jc = Left(sr, Len(sr) - 1)
  20. End Function
复制代码


必做二:
  1. Sub aa()
  2.     Dim d As Object
  3.     Dim sh As Worksheet
  4.     Dim arr
  5.     Dim i&
  6.     Set d = CreateObject("scripting.dictionary")
  7.     For Each sh In Worksheets
  8.         If sh.Tab.ColorIndex = Sheets("必做二").Tab.ColorIndex And sh.Name <> "必做二" Then
  9.             arr = sh.Range("A1").CurrentRegion
  10.             For i = 2 To UBound(arr)
  11.                 d(arr(i, 1)) = d(arr(i, 1)) + Val(arr(i, 2))
  12.             Next i
  13.             Erase arr
  14.         End If
  15.     Next sh
  16.     Sheets("必做二").[A1:B1] = [{"产品型号","数量"}]
  17.     Sheets("必做二").[A2].Resize(d.Count) = WorksheetFunction.Transpose(d.keys)
  18.     Sheets("必做二").[B2].Resize(d.Count) = WorksheetFunction.Transpose(d.items)
  19. End Sub
复制代码


选做一:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim d As Object
  3.     Dim arr1, arr2
  4.     Dim i&
  5.     If Target.Address(0, 0) = "E1" Then
  6.         Set d = CreateObject("scripting.dictionary")
  7.         arr1 = Range("A2:A" & Cells(Rows.Count, 1).End(3).Row)
  8.         arr2 = Range("B2:B" & Cells(Rows.Count, 2).End(3).Row).Formula
  9.         For i = 1 To UBound(arr1)
  10.             d(arr1(i, 1)) = d(arr1(i, 1)) & Right(arr2(i, 1), Len(arr2(i, 1)) - 1) & "+"
  11.         Next i
  12.         x = Split(d([E1].Value), "+")
  13.         If Not IsEmpty([E2]) Then Range("E2:E" & Cells(Rows.Count, 5).End(3).Row).ClearContents
  14.         Range("E2").Resize(UBound(x)) = WorksheetFunction.Transpose(x)
  15.     End If
  16. End Sub
复制代码


选做二:
  1. Sub 按钮3_Click()
  2.     Dim d As Object
  3.     Dim arr
  4.     Dim brr(1 To 10, 1 To 7)
  5.     Dim x
  6.     Dim i&
  7.     Set d = CreateObject("scripting.dictionary")
  8.     arr = Sheets("选做二数据源").Range("A1").CurrentRegion
  9.     Do
  10.         d(Int(Rnd() * UBound(arr) + 1)) = ""
  11.     Loop Until d.Count = 10
  12.     x = d.keys
  13.     For i = 1 To 10
  14.         brr(i, 1) = WorksheetFunction.Index(arr, x(i - 1), 1)
  15.         brr(i, 2) = WorksheetFunction.Index(arr, x(i - 1), 2)
  16.         brr(i, 3) = WorksheetFunction.Index(arr, x(i - 1), 3)
  17.         brr(i, 4) = WorksheetFunction.Index(arr, x(i - 1), 4)
  18.         brr(i, 5) = WorksheetFunction.Index(arr, x(i - 1), 5)
  19.         brr(i, 6) = WorksheetFunction.Index(arr, x(i - 1), 6)
  20.         brr(i, 7) = WorksheetFunction.Index(arr, x(i - 1), 7)
  21.     Next i
  22.     Range("A1").Resize(10, 7) = brr
  23. End Sub
复制代码


附加题:
  1. Sub 矩形1_Click()
  2.     Dim d As Object, dic As Object
  3.     Dim x
  4.     Dim arr
  5.     Dim brr()
  6.     Dim sh As Worksheet
  7.     Dim i&, j&, k&, l&
  8.     Dim mg$
  9.     Application.ScreenUpdating = False
  10.     Set d = CreateObject("scripting.dictionary")
  11.     Set dic = CreateObject("scripting.dictionary")
  12.     arr = Range("A1").CurrentRegion
  13.     For i = 2 To UBound(arr)
  14.         d(arr(i, 14)) = ""
  15.     Next i
  16.     For Each sh In Worksheets
  17.         dic(sh.Name) = ""
  18.     Next sh
  19.     x = d.keys
  20.     For i = 1 To d.Count
  21.         If dic.exists(x(i - 1)) Then
  22.             mg = MsgBox("工作表已存在,是否删除?", vbYesNo + vbExclamation, "提示")
  23.             If mg = vbYes Then
  24.                 Application.DisplayAlerts = False
  25.                 Sheets(x(i - 1)).Delete
  26.                 Application.DisplayAlerts = True
  27.             Else
  28.                 GoTo 7
  29.             End If
  30.         End If
  31.         Sheets.Add(, Sheets(Sheets.Count)).Name = x(i - 1)
  32.         For j = 1 To UBound(arr)
  33.             If arr(j, 14) = x(i - 1) Then
  34.                 k = k + 1
  35.                 ReDim Preserve brr(1 To UBound(arr, 2) - 1, 1 To k)
  36.                 For l = 1 To UBound(arr, 2) - 1
  37.                     brr(l, k) = arr(j, l + 1)
  38.                 Next l
  39.             End If
  40.         Next j
  41.         Range("A1").Resize(, UBound(brr) + 1) = [{"序号","工作单号","受理时间","发货方式","品名","数量","计费重量","到达地","委托人","服务费","保险费","包装费","应收合计","委托单位","客户编号","应收到付","应收代收","重要提示","收货人"}]
  42.         Range("B2").Resize(UBound(brr, 2), UBound(brr)) = WorksheetFunction.Transpose(brr)
  43.         Erase brr
  44.         k = 0
  45. 7:
  46.     Next i
  47.     Application.ScreenUpdating = True
  48. End Sub
复制代码


回复

使用道具 举报

发表于 2011-12-27 08:05 | 显示全部楼层
本帖最后由 liuts 于 2011-12-28 08:06 编辑

作业2-liuts.rar (1.24 MB, 下载次数: 103)

评分

参与人数 1 +3 收起 理由
Benol + 3 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2011-12-27 09:16 | 显示全部楼层
'必做二
Sub hxigang()
Dim Arr6, Arr8, Arr9: Dim i As Single
Sheet3.[a1].CurrentRegion.Delete
Set dit1 = CreateObject("scripting.dictionary")
Arr6 = Sheet6.UsedRange
Arr8 = Sheet8.UsedRange
Arr9 = Sheet9.Range("a1:b" & Sheet9.[b65536].End(xlUp).Row)
dit1("产品型号") = "数量"
For i = 2 To UBound(Arr6)
    dit1(Arr6(i, 1)) = dit1(Arr6(i, 1)) + CInt(Arr6(i, 2))
Next i
For i = 2 To UBound(Arr6)
    dit1(Arr8(i, 1)) = dit1(Arr8(i, 1)) + CInt(Arr8(i, 2))
Next i
For i = 2 To UBound(Arr6)
    dit1(Arr9(i, 1)) = dit1(Arr9(i, 1)) + CInt(Arr9(i, 2))
Next i
  Sheet3.Range("A1").Resize(dit1.Count, 1) = Application.Transpose(dit1.Keys)
  Sheet3.Range("B1").Resize(dit1.Count, 1) = Application.Transpose(dit1.Items)
Set dit1 = Nothing
Erase Arr6: Erase Arr8: Erase Arr9
End Sub
回复

使用道具 举报

发表于 2011-12-27 09:53 | 显示全部楼层

  1. Function 必做1(rng As Variant, Optional rnk& = 1) As String
  2. Dim rng_arr, v, item_arr, key_arr, tmp
  3. Dim dic As New Dictionary, dic_cntrnk As New Dictionary

  4.   '=========获取源数据==========
  5.   If Not IsArray(rng) Then
  6.    rng_arr = Split(rng)
  7.    Else
  8.    rng_arr = rng
  9.   End If

  10.   '=========分类计数==========
  11.     For Each v In rng_arr
  12.         If v <> "" Then
  13.             dic(v) = dic(v) + 1
  14.         End If
  15.     Next
  16.     item_arr = dic.Items
  17.     key_arr = dic.Keys
  18.     Set dic = Nothing

  19.   '=========根据计数大小理出结果==========
  20.     For i = 0 To UBound(key_arr)
  21.      dic_cntrnk(item_arr(i)) = dic_cntrnk(item_arr(i)) & "|" & key_arr(i)
  22.     Next
  23.     tmp = dic_cntrnk(Application.Large(dic_cntrnk.Keys, rnk))
  24.     必做1 = Right(tmp, Len(tmp) - 1)

  25. End Function

复制代码


  1. Sub 必做2()
  2. Dim sht As Worksheet
  3. Dim tabcolor, arr, dic As New Dictionary
  4. tabcolor = Sheets("必做二").Tab.ColorIndex   '拾色
  5. For Each sht In Sheets
  6.   If sht.Name <> "必做二" Then
  7.     If sht.Tab.ColorIndex = tabcolor Then     '对色
  8.      arr = sht.Range("A2:B" & sht.[a65536].End(3).Row)
  9.      For i = 1 To UBound(arr)
  10.        dic(arr(i, 1)) = dic(arr(i, 1)) + arr(i, 2)
  11.      Next
  12.     End If
  13.   End If
  14. Next
  15. Sheets("必做二").Select
  16. Range("a:b").ClearContents: [A1] = "产品型号": [B1] = "数量"
  17. Range("A2").Resize(dic.Count) = Application.Transpose(dic.Keys)
  18. Range("B2").Resize(dic.Count) = Application.Transpose(dic.Items)
  19. End Sub

复制代码


  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim src, v_target, dest(1 To 10000, 1 To 1), dic As New Dictionary
  3. If Target.Address = "$E$1" Then
  4.   v_target = Target
  5.   src = Range("A2:B" & [a65536].End(3).Row).Formula
  6.   For i = 1 To UBound(src)
  7.     If src(i, 1) = v_target Then
  8.       k = k + 1
  9.       dest(k, 1) = src(i, 2)
  10.     End If
  11.   Next
  12.   Range("E2:E10001") = dest
  13. End If
  14. End Sub

复制代码


  1. Sub 选做2()
  2. Dim src, dest&(), end_row&, end_col&, i&, j%, RndIndex&, tmp&, row_index&()

  3. src = Sheets("选做二数据源").UsedRange
  4. end_row = UBound(src)
  5. end_col = UBound(src, 2)

  6. If end_row > 10 Then

  7. '========制作乱序行号=========
  8. ReDim row_index(1 To end_row)
  9. For i = 1 To end_row
  10.   row_index(i) = i
  11. Next

  12. For i = 1 To end_row
  13.   RndIndex = Int(Rnd() * end_row) + 1
  14.   tmp = row_index(i)
  15.   row_index(i) = row_index(RndIndex)
  16.   row_index(RndIndex) = tmp
  17. Next

  18.   '========获取数据=========
  19. ReDim dest(1 To 10, 1 To end_col)
  20. For j = 1 To 10
  21.   For i = 1 To end_col
  22.    dest(j, i) = src(row_index(j), i)
  23.   Next
  24. Next

  25.   '========写入数据=========
  26.    Sheets("选做二").Range("A1").Resize(10, end_col) = dest

  27. Else    '数据源不大于10行则直接传送所有数据
  28.    With Sheets("选做二")
  29.      .UsedRange.ClearContents
  30.      .Range("A1").Resize(end_row, end_col) = src
  31.    End With
  32. End If
  33. End Sub

复制代码

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 11:38 , Processed in 0.771854 second(s), 20 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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