Excel精英培训网

 找回密码
 注册
查看: 4342|回复: 12

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

  [复制链接]
发表于 2011-12-31 08:50 | 显示全部楼层 |阅读模式
本帖最后由 wcymiss 于 2012-1-4 20:44 编辑

为方便测试代码,请大家按照以下过程名命名规则:
  1. sub 必做一_wcymiss
  2.       代码
  3. end sub
复制代码
谢谢


附加题的结果模拟中的检查数据有误
数据源中的检查行数据,是模拟的,请不要直接用公式引用。需引用数据源中的数据、。

评分

参与人数 2 +33 收起 理由
xdwy81129 + 18 出题辛苦了,来支持的
windimi007 + 15 吴姐辛苦了~~~~~~~

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-12-31 09:40 | 显示全部楼层

  1. Sub 必做一_效果一_liuts()
  2.     Dim t
  3.     t = Timer
  4.     With Sheets("必做一")
  5.         Dim brr(1 To 10000, 1 To 50)
  6.         Dim arr, 行标%, 列标 As Byte, 步长 As Byte, i%, dic As New Dictionary, arr1, k%, imax%
  7.         arr1 = [{"仓库名称","序号","商品代码","数量",""}]
  8.         arr = .Range("a1:e" & Range("a65536").End(xlUp).Row)
  9.         For i = 2 To UBound(arr)
  10.             If Not dic.Exists(arr(i, 1)) Then
  11.                 行标 = (dic.Count) * 5 + 1: dic(arr(i, 1)) = 1: 列标 = 0
  12.                 For k = 1 To 5
  13.                     brr(行标, k) = arr1(k)
  14.                     brr(行标 + 1, 列标 + k) = arr(i, k)
  15.                 Next
  16.             Else
  17.                 dic(arr(i, 1)) = dic(arr(i, 1)) + 1
  18.                 列标 = (dic(arr(i, 1)) \ 5) * 5: 步长 = (dic(arr(i, 1)) - 1) Mod 4 + 1
  19.                 If imax < 列标 Then imax = 列标
  20.                 For k = 1 To 5
  21.                     brr(行标 + 步长, 列标 + k) = arr(i, k)
  22.                 Next
  23.             End If
  24.         Next
  25.         .Range("g2").Resize(dic.Count * 5, imax) = brr
  26.     End With
  27.     MsgBox Timer - t
  28. End Sub
  29. Sub 必做一_效果二_liuts()
  30.     Dim t
  31.     t = Timer
  32.     With Sheets("必做一")
  33.         Dim brr(1 To 10000, 1 To 100)
  34.         Dim arr, 行标%, 列标 As Byte, 步长 As Byte, 间隔 As Byte, 跨距 As Byte, 个数%, i%, dic As New Dictionary, d As New Dictionary, k%, x%, m%
  35.         arr1 = [{"仓库名称","序号","商品代码","数量",""}]
  36.         arr = .Range("a1:e" & .Range("a65536").End(xlUp).Row)
  37.         For i = 2 To UBound(arr)
  38.             d(arr(i, 1)) = d(arr(i, 1)) + 1
  39.         Next
  40.         For i = 2 To UBound(arr)
  41.             个数 = d(arr(i, 1))
  42.             If Not dic.Exists(arr(i, 1)) Then
  43.                 dic(arr(i, 1)) = dic(arr(i, 1)) + 1
  44.                 行标 = dic(arr(i, 1)) + 间隔: 列标 = 0
  45.                 For k = 1 To 5
  46.                     brr(行标, k) = arr1(k)
  47.                     brr(行标 + 1, 列标 + k) = arr(i, k)
  48.                 Next
  49.                 间隔 = 间隔 + IIf(个数 < 15, 5, 个数 / 3 + 1)
  50.                 跨距 = IIf(个数 < 15, 5, 个数 / 3 + 1)
  51.             Else
  52.                 dic(arr(i, 1)) = dic(arr(i, 1)) + 1
  53.                 列标 = (dic(arr(i, 1)) \ 跨距) * 5: 步长 = dic(arr(i, 1)) Mod 跨距
  54.                 For k = 1 To 5
  55.                     brr(行标 + 步长, 列标 + k) = arr(i, k)
  56.                 Next
  57.             End If
  58.         Next
  59.         .Range("g25").Resize(UBound(brr), 15) = brr
  60.     End With
  61.     MsgBox Timer - t
  62. End Sub
  63. Sub 必做二_liuts()
  64.     Dim t
  65.     t = Timer
  66.     Dim sh As Worksheet, brr, i%, arr, dic As New Dictionary, sr$, k As Byte, crr(1 To 10000, 1 To 256), n As Integer
  67.     For Each sh In Worksheets
  68.         If sh.Name Like "必二#" Then
  69.             arr = sh.UsedRange.Offset(1, 0)
  70.             For i = 1 To UBound(arr) - 1
  71.                 For j = 1 To UBound(arr, 2)
  72.                     crr(i + x, j) = arr(i, j)
  73.                 Next
  74.                 If Not dic.Exists(arr(i, 5)) Then
  75.                     k = k + 1
  76.                     dic(arr(i, 5)) = k
  77.                 End If
  78.             Next
  79.             x = UBound(arr) - 1
  80.             n = x + n
  81.         End If
  82.     Next
  83.     With Sheets("必做二")
  84.         .Columns("c:z").ClearContents
  85.         .Range("c1").Resize(1, dic.Count) = dic.Keys
  86.         brr = .Range("a1").CurrentRegion
  87.         For i = 1 To UBound(brr)
  88.             dic(brr(i, 1) & brr(i, 2)) = i
  89.         Next
  90.         For i = 1 To n
  91.             brr(dic(crr(i, 1) & crr(i, 2)), dic(crr(i, 5)) + 2) = crr(i, 4) + brr(dic(crr(i, 1) & crr(i, 2)), dic(crr(i, 5)) + 2)
  92.         Next
  93.         .Range("a1").Resize(UBound(brr), UBound(brr, 2)) = brr
  94.     End With
  95.     MsgBox Timer - t
  96. End Sub
  97. Sub 选做_liuts()
  98.     Dim t
  99.     t = Timer
  100.     On Error GoTo err1
  101.     Dim arr, brr, i As Integer, j As Integer, dic As New Dictionary, x As Double, sr As String, 合计 As Double, d As New Dictionary
  102.     With Sheets("选做")
  103.         arr = .Range("a1:e" & .Range("a65536").End(xlUp).Row).CurrentRegion
  104.         brr = .Range("h1").CurrentRegion
  105.         For j = 2 To UBound(brr)
  106.             d(brr(j, 1) & brr(j, 2)) = Split(Split(Join(Application.Index(brr, j, 0), ","), ",", 3)(2), ",")
  107.         Next
  108.         For i = 2 To UBound(arr)
  109.             sr = arr(i, 2) & arr(i, 3)
  110.             dic(sr) = dic(sr) + arr(i, 4): 合计 = dic(sr): temp = 0: k = 1
  111.             Do
  112.                 If Not d.Exists(sr) Then GoTo err1
  113.                 temp = temp + Val(d(sr)(k))
  114.                 Select Case 合计
  115.                 Case Is <= temp
  116.                     arr(i, 5) = d(sr)(k - 1)
  117.                     Exit Do
  118.                 End Select
  119.                 k = k + 2
  120.             Loop Until d(sr)(k) = ""
  121.             If 合计 > temp Then arr(i, 5) = d(sr)(k - 3)
  122. 10:             Next
  123.         .Range("a1:e" & UBound(arr)) = arr
  124.         If s <> "" Then MsgBox s & "————" & Chr(13) & "以上不存在!"
  125.     End With
  126.     MsgBox Timer - t
  127.     Exit Sub
  128. err1:
  129.     s = sr & Chr(13) & s: GoTo 10
  130. End Sub
  131. Sub 附加_liuts()
  132.     On Error Resume Next
  133.     Application.EnableEvents = False
  134.     Dim 一列$, 四列$, m%, 结果(1 To 100, 1 To 3), tp(1 To 8, 1 To 3)
  135.     If Target.Address(0, 0) = "B2" Or Target.Address(0, 0) = "E2" Then
  136.         一列 = [b2]: 四列 = "2010" & [e2]
  137.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  138.         Dim arr, dic As New Dictionary, i As Integer, j As Integer, k As Integer, brr(1 To 10000, 1 To 5), crr
  139.         Dim rg As Range, sr$
  140.         With Sheets("附加1")
  141.             If IsNull(.Columns("A:A").MergeCells) Then
  142.                 Set rg = .Columns("A:A").SpecialCells(xlCellTypeConstants, 23).SpecialCells(xlCellTypeBlanks)
  143.                 With rg
  144.                     .MergeCells = False
  145.                     .Offset(1, 0).FormulaR1C1 = "=R[-1]C"
  146.                 End With
  147.             End If
  148.             arr = .Range("a3").CurrentRegion
  149.             For i = 2 To UBound(arr)
  150.                 For j = 5 To UBound(arr, 2)
  151.                     sr = arr(i, 1) & "," & arr(i, 3) & "," & arr(i, 4) & "," & Year(arr(1, j)) & Month(arr(1, j))
  152.                     If Not dic.Exists(sr) And arr(i, 3) <> "" Then
  153.                         k = k + 1
  154.                         dic(sr) = Val(arr(i, j))
  155.                     ElseIf arr(i, 3) <> "" Then
  156.                         dic(sr) = dic(sr) + Val(arr(i, j))
  157.                     End If
  158.                 Next
  159.             Next
  160.             For i = 1 To dic.Count
  161.                 crr = Split(dic.Keys(i - 1), ","): temp = dic.Items(i - 1)
  162.                 brr(i, 1) = crr(0)
  163.                 brr(i, 2) = crr(1)
  164.                 brr(i, 3) = crr(2)
  165.                 brr(i, 4) = crr(3)
  166.                 brr(i, 5) = temp
  167.             Next
  168.             ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  169.             For m = 1 To k
  170.                 If brr(m, 1) = 一列 And brr(m, 4) = 四列 Then
  171.                     icount = icount + 1
  172.                     结果(icount, 1) = brr(m, 2)
  173.                     结果(icount, 2) = brr(m, 3)
  174.                     结果(icount, 3) = brr(m, 5)
  175.                 End If
  176.             Next
  177.             总不良数 = Application.Sum(Application.Index(结果, , 3))
  178.             For m = 1 To UBound(结果)
  179.                 If 结果(m, 1) = "其他" Or 结果(m, 1) = "其它" Then
  180.                     tp(8, 1) = 结果(m, 1)
  181.                     tp(8, 2) = 结果(m, 2)
  182.                     tp(8, 3) = 结果(m, 3)
  183.                     结果(m, 3) = 0
  184.                     Exit For
  185.                 End If
  186.             Next
  187.             For m = 1 To UBound(结果)
  188.                 If 结果(m, 3) = Application.Max(Application.Index(结果, , 3)) Then
  189.                     y = y + 1
  190.                     If y > 7 Then Exit For
  191.                     tp(y, 1) = 结果(m, 1)
  192.                     tp(y, 2) = 结果(m, 2)
  193.                     tp(y, 3) = 结果(m, 3)
  194.                     结果(m, 3) = 0
  195.                 End If
  196.             Next
  197.             其他数 = 总不良数 - (Application.Sum(Application.Index(tp, , 3)) - Application.Sum(Application.Index(tp, 8, 3)))
  198.             tp(8, 3) = 其他数
  199.             Sheets("附加题").Range("b8").Resize(8, 3) = tp
  200.             Sheets("附加题").Range("e5") = Application.Sum(Sheets("附加题").Range("d8:d15"))
  201.             Sheets("附加题").Range("b5") = Sheets("附加题").Range("e5") * 4
  202.             Application.DisplayAlerts = False
  203.             If rg Is Nothing Then GoTo 100
  204.             rg.MergeCells = True
  205.             Application.DisplayAlerts = True
  206.         End With
  207.     End If
  208. 100:
  209.     Application.EnableEvents = True
  210. End Sub
复制代码
用了不少土办法,有时间再改用高效的方法 :)  
附加题 数组排序还不太理解,用了土法 检查数与不良数的关系没看太懂 简单地做成了*4关系。

点评

检查数与不良数 不良数为不良行次的那个数据,检查数为后面的那一行,有颜色的吧,我记得。  发表于 2011-12-31 17:12

评分

参与人数 1 +20 收起 理由
wcymiss + 20

查看全部评分

回复

使用道具 举报

发表于 2011-12-31 17:06 | 显示全部楼层
  1. Sub 必做一的效果一_9lee()
  2.     Dim d As New Dictionary
  3.     Dim arr, dkey, ditem, brr(), crr, drr()
  4.     Dim i, j, m, n, a, b
  5.     With Sheets("必做一")
  6.         arr = .Range("a1").CurrentRegion
  7.         crr = .[a1:d1]
  8.         .Range("g:ab").ClearContents
  9.         For i = 2 To UBound(arr, 1)
  10.             d(arr(i, 1)) = d(arr(i, 1)) + 1
  11.         Next i
  12.         ditem = d.Items
  13.         dkey = d.Keys
  14.         For m = 0 To d.Count - 1 '按仓库名称循环,获得某仓库的数据
  15.             ReDim brr(1 To ditem(m), 1 To 4)
  16.             For i = 2 To UBound(arr)
  17.                 If arr(i, 1) = dkey(m) Then
  18.                     n = n + 1
  19.                     brr(n, 1) = arr(i, 1)
  20.                     brr(n, 2) = arr(i, 2)
  21.                     brr(n, 3) = arr(i, 3)
  22.                     brr(n, 4) = arr(i, 4)
  23.                 End If
  24.             Next i
  25.             n = 0
  26.             '===按效果一将数据分成(4行5列)*几大列
  27.             a = (ditem(m) \ 4 + IIf(ditem(m) Mod 4, 1, 0)) * 5 '大列数
  28.             ReDim drr(1 To 4, 1 To a)
  29.             For j = 1 To a Step 5
  30.                
  31.                 For i = 1 To 4
  32.                     b = i + j - (j + 5) \ 5
  33.                     If b > ditem(m) Then Exit For
  34.                     drr(i, j) = brr(b, 1)
  35.                     drr(i, j + 1) = brr(b, 2)
  36.                     drr(i, j + 2) = brr(b, 3)
  37.                     drr(i, j + 3) = brr(b, 4)
  38.                 Next i
  39.             Next j
  40.             '======将分好的数据赋给工作表
  41.            irow = irow + 1
  42.            .Cells(irow, "g").Resize(1, 4) = crr
  43.            .Cells(irow + 1, "g").Resize(4, UBound(drr, 2)) = drr
  44.            irow = irow + 4
  45.            
  46.         Next m
  47.         'Stop
  48.     End With
  49.     Set d = Nothing
  50. End Sub

  51. Sub 必做一的效果二_9lee()
  52.     Dim d As New Dictionary
  53.     Dim arr, dkey, ditem, brr(), crr, drr()
  54.     Dim i, j, m, n, a, b
  55.     With Sheets("必做一")
  56.         arr = .Range("a1").CurrentRegion
  57.         crr = .[a1:d1]
  58.         .Range("g:cb").ClearContents
  59.         For i = 2 To UBound(arr, 1)
  60.             d(arr(i, 1)) = d(arr(i, 1)) + 1
  61.         Next i
  62.         ditem = d.Items
  63.         dkey = d.Keys
  64.         For m = 0 To d.Count - 1 '按仓库名称循环,获得某仓库的数据
  65.             ReDim brr(0 To ditem(m), 1 To 4)
  66.             brr(0, 1) = arr(1, 1)
  67.             brr(0, 2) = arr(1, 2)
  68.             brr(0, 3) = arr(1, 3)
  69.             For i = 2 To UBound(arr)
  70.                 If arr(i, 1) = dkey(m) Then
  71.                     n = n + 1
  72.                     brr(n, 1) = arr(i, 1)
  73.                     brr(n, 2) = arr(i, 2)
  74.                     brr(n, 3) = arr(i, 3)
  75.                     brr(n, 4) = arr(i, 4)
  76.                 End If
  77.             Next i
  78.             n = 0
  79.             '===按效果二将数据分成(5至多行*15列)
  80.             If ditem(m) + 1 > 10 Then '确定行数
  81.                 a = (ditem(m) + 1) \ 3 + IIf((ditem(m) + 1) Mod 3, 1, 0)
  82.             Else
  83.                 a = 5
  84.             End If
  85.             ReDim drr(1 To a, 1 To 15)
  86.             b = -1
  87.             For j = 1 To 15 Step 5
  88.                
  89.                 For i = 1 To a
  90.                     b = b + 1
  91.                     If b > ditem(m) Then Exit For
  92.                     drr(i, j) = brr(b, 1)
  93.                     drr(i, j + 1) = brr(b, 2)
  94.                     drr(i, j + 2) = brr(b, 3)
  95.                     drr(i, j + 3) = brr(b, 4)
  96.                 Next i
  97.             Next j
  98.             '======将分好的数据赋给工作表
  99.            .Cells(irow + 1, "g").Resize(UBound(drr), UBound(drr, 2)) = drr
  100.            irow = irow + UBound(drr)
  101.            
  102.         Next m
  103.         'Stop
  104.     End With
  105.     Set d = Nothing
  106. End Sub
复制代码
  1. Sub 必做二9lee()
  2.     Dim d As New Dictionary
  3.     Dim arr, i, sh, brr(), k
  4.    
  5.     For Each sh In Array(Sheets("必二1"), Sheets("必二2"))
  6.         arr = sh.Range("a1").CurrentRegion
  7.         
  8.         For i = 2 To UBound(arr)
  9.             If Not d.Exists(arr(i, 5)) Then
  10.                 k = k + 1
  11.                 d(arr(i, 5)) = k
  12.                 ReDim Preserve brr(1 To 12, 1 To k)
  13.             End If
  14.             brr(arr(i, 2), d(arr(i, 5))) = brr(arr(i, 2), d(arr(i, 5))) + arr(i, 4)
  15.         Next i
  16.     Next
  17.     With Sheets("必做二")
  18.         .Range("c:ab").ClearContents
  19.         .[c1].Resize(1, d.Count) = d.Keys
  20.         .[c2].Resize(12, UBound(brr, 2)) = brr
  21.     End With
  22.     Set d = Nothing
  23. End Sub
复制代码
  1. Sub 选做题_9lee()
  2.     Dim arr, brr, crr()
  3.     Dim d As New Dictionary, dd As New Dictionary
  4.     Dim s$, x$
  5.     With Sheets("选做")
  6.         arr = .Range("b2:d" & .[b65536].End(3).Row)
  7.         brr = .[h1].CurrentRegion
  8.         ReDim crr(1 To UBound(arr), 1 To 1)
  9.         For i = 2 To UBound(brr)
  10.             d(brr(i, 1) & vbTab & brr(i, 2)) = i
  11.             dd(brr(i, 1) & vbTab & brr(i, 2)) = 0
  12.             For j = 6 To UBound(brr, 2) Step 2
  13.                 If Not IsEmpty(brr(i, j)) Then brr(i, j) = brr(i, j) + brr(i, j - 2)
  14.             Next j
  15.         Next i
  16.         For i = 1 To UBound(arr)
  17.             s = arr(i, 1) & vbTab & arr(i, 2)
  18.             If Not d.Exists(s) Then
  19.                 x = x & Chr(10) & s
  20.             Else
  21.                 dd(s) = dd(s) + arr(i, 3)
  22.                 For j = 4 To UBound(brr, 2) Step 2
  23.                     If IsEmpty(brr(d(s), j)) Then crr(i, 1) = brr(d(s), j - 3): Exit For
  24.                     If dd(s) <= brr(d(s), j) Then crr(i, 1) = brr(d(s), j - 1): Exit For
  25.                 Next j
  26.             End If
  27.         Next i
  28.         .[e2].Resize(UBound(crr)) = crr
  29.     End With
  30.     If IsEmpty(x) Then MsgBox "以下型号产地在编码表中不存在:" & Chr(10) & vbTab & x
  31.     Set d = Nothing
  32.     Set dd = Nothing
  33. End Sub
复制代码
  1. Sub 附加题_9lee()
  2.     Dim arr, brr(), crr
  3.     Dim d As New Dictionary
  4.     Dim iMonth, iName$, iSum%, jSum%, kSum%
  5.     Dim i%, j%, m%, sRow%, eRow%
  6.    
  7.     With Sheets("附加题")
  8.         iMonth = .[e2]
  9.         iName = .[b2]
  10.         .[b5] = ""
  11.         .[e5] = ""
  12.         .Range("b8:e15").ClearContents
  13.     End With
  14.     With Sheets("附加1")
  15.         arr = .[a4].CurrentRegion
  16.         sRow = Application.Match(iName, Application.Index(arr, , 1), 0)
  17.         ReDim brr(1 To UBound(arr), 1 To 3)
  18.         For i = sRow To UBound(arr)
  19.             If arr(i, 4) = "检查数" Then '总检查数
  20.                 For j = 5 To UBound(arr, 2)
  21.                     If Month(arr(1, j)) > iMonth Then Exit For
  22.                     If Month(arr(1, j)) = iMonth And Not IsEmpty(arr(i, j)) Then iSum = iSum + arr(i, j)
  23.                 Next j
  24.                 Exit For
  25.             End If
  26.             For j = 5 To UBound(arr, 2)
  27.                 If Month(arr(1, j)) > iMonth Then Exit For
  28.                 If Month(arr(1, j)) = iMonth And Not IsEmpty(arr(i, j)) Then
  29.                     If arr(i, 3) = "其它" Then kSum = kSum + arr(i, j): Exit For '不良内容为其它的总数
  30.                     If Not d.Exists(arr(i, 3)) Then m = m + 1: d(arr(i, 3)) = ""
  31.                     brr(m, 1) = arr(i, 3)
  32.                     brr(m, 2) = arr(i, 4)
  33.                     brr(m, 3) = brr(m, 3) + arr(i, j)
  34.                     jSum = jSum + brr(m, 3) '不良数合计
  35.                 End If
  36.             Next j
  37.         Next i
  38.     End With
  39.     If m = 0 And kSum = 0 Then Exit Sub
  40.     '====排序
  41.     For i = 2 To m
  42.         temp1 = brr(i, 1): temp2 = brr(i, 2): temp3 = brr(i, 3)
  43.         For j = i - 1 To 1 Step -1
  44.             If brr(j, 3) >= temp3 Then Exit For
  45.             brr(j + 1, 1) = brr(j, 1): brr(j + 1, 2) = brr(j, 2): brr(j + 1, 3) = brr(j, 3)
  46.             
  47.         Next j
  48.         brr(j + 1, 1) = temp1: brr(j + 1, 2) = temp2: brr(j + 1, 3) = temp3
  49.     Next i
  50.     '====
  51.     With Sheets("附加题")
  52.         .[b5] = iSum
  53.         .[e5] = jSum + kSum
  54.         .[b8].Resize(IIf(m > 7, 7, m), 3) = brr
  55.         If kSum > 0 Then .[b15] = "其它": [d15] = kSum
  56.     End With
  57.     Set d = Nothing
  58. End Sub
复制代码

评分

参与人数 1 +20 收起 理由
wcymiss + 20

查看全部评分

回复

使用道具 举报

发表于 2012-1-1 09:01 | 显示全部楼层
  1. Sub 必做一1乐满地()
  2. Dim d As New Dictionary
  3. Dim arr, brr
  4. Dim x&, y%, k&, m%, n%, o%
  5. arr = Range("A2:D" & Cells(Rows.Count, 1).End(3).Row)
  6. arr1 = Range("a1:d1")
  7. ReDim brr(1 To 1000, 1 To 255)
  8. For x = 1 To UBound(arr)
  9. If Not d.Exists(arr(x, 1)) Then
  10. k = 1 + m * 5
  11. d.Add (arr(x, 1)), ""
  12. brr(k, 1) = arr1(1, 1): brr(k, 2) = arr1(1, 2): brr(k, 3) = arr1(1, 3): brr(k, 4) = arr1(1, 4)
  13. brr(k + 1, 1) = arr(x, 1): brr(k + 1, 2) = arr(x, 2): brr(k + 1, 3) = arr(x, 3): brr(k + 1, 4) = arr(x, 4)
  14. m = m + 1
  15. n = 1: o = 0
  16. Else
  17. n = n + 1
  18. For y = 1 To 4
  19. brr(k + n, o * 5 + y) = arr(x, y)
  20. Next y
  21. If n = 4 Then o = o + 1: n = 0
  22. End If
  23. Next x
  24. Range("f1").Resize(k + 4, 200).ClearContents
  25. [f1].Resize(k + 4, 200) = brr
  26. End Sub
复制代码
  1. Sub 必做一2乐满地()
  2. Dim d As New Dictionary
  3. Dim arr, brr
  4. Dim x&, y%, k&, m%, n%, o%
  5. arr = Range("A2:D" & Cells(Rows.Count, 1).End(3).Row)
  6. arr1 = Range("a1:d1")
  7. ReDim brr(1 To 1000, 1 To 14)
  8. k = -4
  9. For x = 1 To UBound(arr)
  10. If Not d.Exists(arr(x, 1)) Then
  11. k = k + 5
  12. d.Add (arr(x, 1)), ""
  13. For y = 1 To 4
  14. brr(k, y) = arr1(1, y)
  15. brr(k + 1, y) = arr(x, y)
  16. Next y
  17. m = m + 1
  18. n = 1: o = 0
  19. Else
  20. If n = 4 Then
  21. o = o + 1: n = 0
  22. Else
  23. n = n + 1
  24. End If
  25. If o = 3 Then k = k + 5: o = 0
  26. For y = 1 To 4
  27. brr(k + n, o * 5 + y) = arr(x, y)
  28. Next y
  29. End If
  30. Next x
  31. Range("f26").Resize(k + 4, 14).ClearContents
  32. [f26].Resize(k + 4, 14) = brr
  33. End Sub
复制代码
  1. Sub 必做二乐满地()
  2. Dim dr As New Dictionary
  3. Dim dc As New Dictionary
  4. Dim arrR, arr, brr(1 To 12, 1 To 12), brr1
  5. Dim x%, y%
  6. brr1 = Array("必二1", "必二2")
  7. arrR = Range("a2:b13")
  8. For x = 1 To UBound(arrR)
  9. dr(arrR(x, 1) & "|" & arrR(x, 2)) = x
  10. Next
  11. For x = 0 To UBound(brr1)
  12. With Sheets(brr1(x))
  13. arr = .Range("a2:e" & .Range("a65536").End(3).Row)
  14. End With

  15. For y = 1 To UBound(arr)
  16. If dc.Exists(arr(y, 5)) Then
  17. brr(dr(arr(y, 1) & "|" & arr(y, 2)), dc(arr(y, 5))) = brr(dr(arr(y, 1) & "|" & arr(y, 2)), dc(arr(y, 5))) + arr(y, 4)
  18. Else
  19. k = k + 1
  20. dc(arr(y, 5)) = k

  21. brr(dr(arr(y, 1) & "|" & arr(y, 2)), dc(arr(y, 5))) = arr(y, 4)
  22. End If
  23. Next y
  24. Erase arr
  25. Next x
  26. Range("c1").Resize(1, dc.Count).ClearContents
  27. Range("c2").Resize(dr.Count, dc.Count).ClearContents
  28. Range("c1").Resize(1, dc.Count) = dc.Keys
  29. Range("c2").Resize(dr.Count, dc.Count) = brr
  30. End Sub
复制代码
  1. Sub 选做乐满地()
  2. Dim arr1, arr2, brr, crr()
  3. Dim x&, y%, c%, k%, dj&, temp
  4. Dim d As New Dictionary
  5. Dim d1 As New Dictionary
  6. Dim dmsg As New Dictionary
  7. arr1 = Range(Cells(2, 8), Cells([h65536].End(3).Row, Cells(1, 255).End(xlToLeft).Column + 2)) '+2留两个空列
  8. arr2 = Range("a2:d" & [a65536].End(3).Row)
  9. For x = 1 To UBound(arr1)
  10. d.Add (arr1(x, 1) & "|" & arr1(x, 2)), 0
  11. d1(arr1(x, 1) & "|" & arr1(x, 2)) = x
  12. Next x
  13. c = (Cells(1, 255).End(xlToLeft).Column - 9) / 2
  14. ReDim brr(1 To UBound(arr2), 1 To 1)
  15. For x = 1 To UBound(arr2)
  16. If d.Exists(arr2(x, 2) & "|" & arr2(x, 3)) Then
  17. d(arr2(x, 2) & "|" & arr2(x, 3)) = arr2(x, 4) + d(arr2(x, 2) & "|" & arr2(x, 3))
  18. temp = 0
  19. For y = 1 To c + 1
  20. temp = temp + arr1(d1(arr2(x, 2) & "|" & arr2(x, 3)), y * 2 + 2)
  21. If d(arr2(x, 2) & "|" & arr2(x, 3)) < temp Then
  22. brr(x, 1) = arr1(d1(arr2(x, 2) & "|" & arr2(x, 3)), y * 2 + 1): Exit For
  23. ElseIf arr1(d1(arr2(x, 2) & "|" & arr2(x, 3)), y * 2 + 2) = "" Then
  24. brr(x, 1) = arr1(d1(arr2(x, 2) & "|" & arr2(x, 3)), y * 2 - 1): Exit For
  25. End If
  26. Next y
  27. Else
  28. k = k + 1
  29. ReDim Preserve crr(1 To k)
  30. crr(k) = arr2(x, 2) & "|" & arr2(x, 3)
  31. End If
  32. Next x
  33. Range("e2").Resize(UBound(arr2)).ClearContents
  34. Range("e2").Resize(UBound(arr2)) = brr

  35. For x = 1 To UBound(crr)
  36. If Not dmsg.Exists(crr(x)) Then dmsg.Add crr(x), ""
  37. Next x
  38. MsgBox "不存在型号产地有:" & VBA.Join(dmsg.Keys, ";")
  39. End Sub
复制代码
  1. Sub 附加题乐满地()
  2. Dim arry
  3. Dim sch As String, yuef%, sta%, en%, sta2%, en2%
  4. Dim arr
  5. Dim x, y
  6. On Error GoTo 100
  7. sch = [b2]: yuef = [e2]
  8. With Sheets("附加1")
  9. arry = .Range("a3:at" & .[d65536].End(3).Row)
  10. End With
  11. For x = 1 To UBound(arry)
  12. If arry(x, 1) = sch Then
  13. sta = x
  14. Exit For
  15. End If
  16. Next
  17. For x = sta To UBound(arry)
  18. If arry(x, 2) = "" Then
  19. en = x: Exit For
  20. End If
  21. Next x
  22. For x = 5 To UBound(arry, 2)
  23. If sta2 = 0 And Month(arry(1, x)) = yuef Then
  24. sta2 = x: x = x + 1
  25. End If
  26. If sta2 > 0 And Month(arry(1, x)) <> yuef Then
  27. en2 = x - 1: Exit For
  28. End If
  29. Next x
  30. ReDim arr(1 To en - sta + 1, 1 To 3)
  31. For x = sta To en
  32. arr(x - sta + 1, 1) = arry(x, 3)
  33. arr(x - sta + 1, 2) = arry(x, 4)
  34. For y = sta2 To en2
  35. arr(x - sta + 1, 3) = arr(x - sta + 1, 3) + arry(x, y)
  36. Next y
  37. Next x

  38. Dim imin
  39. Dim tmp
  40. For x = UBound(arr) - 1 To 1 Step -1 '“其它”一般在后面,倒循环相对快点
  41. If arr(x, 1) = "其它" Then '找到其它就与最后一行换位
  42. For y = 1 To 3
  43. tmp = arr(x, y)
  44. arr(x, y) = arr(UBound(arr) - 1, y):
  45. arr(UBound(arr) - 1, y) = tmp
  46. Next y
  47. Exit For
  48. End If
  49. Next
  50. For x = UBound(arr) - 2 To 2 Step -1
  51. imin = 1
  52. For y = 1 To x
  53. If arr(y, 3) < arr(imin, 3) Then imin = y
  54. Next y
  55. For y = 1 To 3
  56. tmp = arr(x, y)
  57. arr(x, y) = arr(imin, y):
  58. arr(imin, y) = tmp
  59. Next y
  60. Next x


  61. arr(8, 1) = "其它": arr(8, 2) = "": tmp = 0
  62. For x = 8 To UBound(arr) - 1
  63. tmp = tmp + arr(x, 3)
  64. Next x
  65. arr(8, 3) = tmp
  66. tmp = 0
  67. For x = 1 To 8
  68. tmp = arr(x, 3) + tmp
  69. Next x
  70. For x = 1 To 8
  71. If arr(x, 3) = "" Or arr(x, 3) = 0 Then
  72. arr(x, 1) = ""
  73. arr(x, 2) = ""
  74. arr(x, 3) = ""
  75. End If
  76. Next x
  77. Range("b8:d15").ClearContents
  78. Range("b8:d15") = arr


  79. [b5] = arr(UBound(arr), 3)
  80. [e5] = tmp
  81. Exit Sub
  82. For x = 1 To 8

  83. Next
  84. 100: MsgBox "月份选择有误"
  85. End Sub
复制代码




评分

参与人数 1 +20 收起 理由
wcymiss + 20

查看全部评分

回复

使用道具 举报

发表于 2012-1-1 14:16 | 显示全部楼层
本帖最后由 sunjing-zxl 于 2012-1-2 10:09 编辑

  1. Sub 必做1效果1_012_sunjing_zxl()
  2.     Dim d As New Dictionary, d1 As New Dictionary, d2 As New Dictionary
  3.     Dim arr, arr1()
  4.     Dim i As Long, j As Long, n As Long, m As Long
  5.     Range("F1:IV1000").ClearContents
  6.     Range("F1:IV1000").NumberFormatLocal = "@"
  7.     arr = Range("A1:D" & [A65536].End(xlUp).Row)
  8.     For i = 2 To UBound(arr)
  9.         d(arr(i, 1)) = d(arr(i, 1)) + 1
  10.     Next i
  11.     n = WorksheetFunction.Large(d.Items(), 1)
  12.     m = d.Count
  13.     ReDim arr1(1 To m * 5, 1 To Abs(Int(-n / 4)) * 5)
  14.     For i = 2 To UBound(arr)
  15.         d1(arr(i, 1)) = d1(arr(i, 1)) + 1
  16.         m = 1 + (d1.Count - 1) * 5
  17.         For j = 1 To 4
  18.             arr1(m, j) = arr(1, j)
  19.             arr1(m + ((d1(arr(i, 1)) - 1) Mod 4) + 1, Int((d1(arr(i, 1)) - 1) / 4) * 5 + j) = arr(i, j)
  20.         Next j
  21.     Next i
  22.     Range("F1").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
  23. End Sub
复制代码
  1. Sub 必做1效果2_012_sunjing_zxl()
  2. Dim d As New Dictionary, d1 As New Dictionary
  3. Dim d2 As New Dictionary, d3 As New Dictionary
  4. Dim arr, arr1()
  5. Dim i As Long, j As Long, n As Long, m As Long
  6. Range("F1:IV1000").ClearContents
  7. Range("F1:IV1000").NumberFormatLocal = "@"
  8. arr = Range("A1:D" & [A65536].End(xlUp).Row)
  9. '统计每个仓库名的个数
  10. For i = 2 To UBound(arr)
  11. d(arr(i, 1)) = d(arr(i, 1)) + 1
  12. Next i
  13. n = 1
  14. m = 0
  15. '统计每个仓库名所占行数(d2)
  16. '统计每个仓库名起点行号(d3)
  17. For i = 0 To d.Count - 1
  18. d2(d.Keys(i)) = WorksheetFunction.max(WorksheetFunction.RoundUp((d.Items(i) + 1) / 3, 0), 5)
  19. d3(d.Keys(i)) = n
  20. m = d2(d.Keys(i))
  21. n = n + m
  22. Next i
  23. ReDim arr1(1 To n - 1, 1 To 14)
  24. For i = 2 To UBound(arr)
  25. d1(arr(i, 1)) = d1(arr(i, 1)) + 1
  26. If d1(arr(i, 1)) + 1 > 15 Then
  27. m = d3(arr(i, 1)) + 5 '超出5行的起点行号
  28. n = d2(arr(i, 1)) - 5 '增加的行数
  29. m = (d1(arr(i, 1)) - 15) Mod n + m
  30. n = Int((d1(arr(i, 1)) - 15) / n) * 5
  31. For j = 1 To 4
  32. arr1(m, n + j) = arr(i, j)
  33. Next j
  34. Else
  35. m = d3(arr(i, 1)) + d1(arr(i, 1)) Mod 5
  36. n = Int(d1(arr(i, 1)) / 5) * 5
  37. For j = 1 To 4
  38. arr1(d3(arr(i, 1)), j) = arr(1, j)
  39. arr1(m, n + j) = arr(i, j)
  40. Next j
  41. End If
  42. Next i
  43. Range("F1").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
  44. End Sub
复制代码
  1. Sub 必做2_012_sunjing_zxl()
  2. Dim d As New Dictionary
  3. Dim arr, arr1()
  4. Dim i As Long, j As Long
  5. Range(Range("C1"), Cells([IV65536].End(xlToLeft).Column, 13)).ClearContents
  6. For i = 1 To Sheets.Count
  7. If Left(Sheets(i).Name, 2) = "必二" Then
  8. With Sheets(i)
  9. arr = .Range("A2:E" & .[A65536].End(xlUp).Row)
  10. End With
  11. For j = 1 To UBound(arr)
  12. If d.Exists(arr(j, 5)) Then
  13. arr1(arr(j, 2) + 1, d(arr(j, 5))) = arr(j, 4) + arr1(arr(j, 2) + 1, d(arr(j, 5)))
  14. Else
  15. d(arr(j, 5)) = d.Count + 1
  16. ReDim Preserve arr1(1 To 13, 1 To d.Count)
  17. arr1(1, d(arr(j, 5))) = arr(j, 5)
  18. arr1(arr(j, 2) + 1, d(arr(j, 5))) = arr(j, 4)
  19. End If
  20. Next j
  21. End If
  22. Next i
  23. Range("C1").Resize(13, UBound(arr1, 2)) = arr1
  24. End Sub
复制代码
  1. Sub 选做题_012_sunjing_zxl()
  2. Dim d1 As New Dictionary, d2 As New Dictionary
  3. Dim arr1, arr2, arr
  4. Dim i As Long, j As Long, n As Long, m As Long, k As Long
  5. Dim str As String, L As Long
  6. Range("E2:E" & [A65536].End(xlUp).Row).ClearContents
  7. arr1 = Range("A2:D" & [A65536].End(xlUp).Row)
  8. arr2 = Range(Range("H2"), Cells([H2].End(xlDown).Row, [H1].End(xlToRight).Column))
  9. ReDim arr(1 To UBound(arr1), 1 To 1)
  10. For i = 1 To UBound(arr2)
  11. d2(arr2(i, 1) + arr2(i, 2)) = d2.Count + 1
  12. Next i
  13. For i = 1 To UBound(arr1)
  14. d1(arr1(i, 2) + arr1(i, 3)) = d1(arr1(i, 2) + arr1(i, 3)) + arr1(i, 4)
  15. n = d2(arr1(i, 2) + arr1(i, 3))
  16. k = 0
  17. For j = 4 To UBound(arr2, 2) Step 2
  18. If n = 0 Then
  19. arr(i, 1) = ""
  20. str = str & "," & arr1(i, 2) + arr1(i, 3)
  21. L = L + 1
  22. Exit For
  23. ElseIf arr2(n, j) = "" Then
  24. m = j - 3
  25. Exit For
  26. Else
  27. k = k + arr2(n, j)
  28. If d1(arr1(i, 2) + arr1(i, 3)) < k Then
  29. m = j - 1
  30. Exit For
  31. End If
  32. End If
  33. Next j
  34. If n <> 0 Then
  35. arr(i, 1) = arr2(n, m)
  36. End If
  37. Next i
  38. Range("E2").Resize(UBound(arr), 1) = arr
  39. If L = 0 Then
  40. MsgBox "编码完成,没有不存的型号产地"
  41. Else
  42. MsgBox "编码完成,不存在型号产地的有" & str
  43. End If
  44. End Sub
复制代码

  1. Sub 附加题_012_sunjing_zxl()
  2. 'Dim d1 As New Dictionary, d2 As New Dictionary
  3. Dim arr1, arr2, arr3
  4. Dim i As Long, j As Long, n As String, m As Long
  5. Dim k1 As Long, k2 As Long, k3 As Long, k4 As Long
  6. Dim 最大值 As Long, 计数 As Long, t1 As Double, t2 As Double
  7. t1 = Timer
  8. With Sheets("附加1")
  9. n = Range("B2")
  10. m = Range("E2")
  11. arr1 = .Range("A1:A" & .[A65536].End(xlUp).Row)
  12. arr2 = .Range(.[A3], .Cells(3, .[IV3].End(xlToLeft).Column))
  13. For i = 1 To UBound(arr1)
  14. If arr1(i, 1) = n Then
  15. k1 = i
  16. k2 = .Cells(i, 2).End(xlDown).Row
  17. Exit For
  18. End If
  19. Next i
  20. For j = 5 To UBound(arr2, 2)
  21. If Month(arr2(1, j)) = m Then
  22. k3 = j
  23. For i = k3 To UBound(arr2, 2)
  24. If i = UBound(arr2, 2) Then
  25. k4 = i
  26. ElseIf Month(arr2(1, i)) = m + 1 Then
  27. k4 = i - 1
  28. Exit For
  29. End If
  30. Next i
  31. Exit For
  32. End If
  33. Next j
  34. arr1 = .Range(.Cells(k1, k3), .Cells(k2, k4))
  35. arr2 = .Range(.Cells(k1, 3), .Cells(k2, 4))
  36. n = WorksheetFunction.Sum(arr1)
  37. m = WorksheetFunction.Sum(.Range(.Cells(k2 + 1, k3), .Cells(k2 + 1, k4)))
  38. ReDim arr3(UBound(arr1) - 1)
  39. For i = 1 To UBound(arr1, 1)
  40. arr3(i - 1) = Application.Sum(Application.Index(arr1, i, 0))
  41. Next i
  42. ReDim arr1(1 To 8, 1 To 3)
  43. 1:
  44. 最大值 = Application.WorksheetFunction.Large(arr3, 1)
  45. For j = 0 To UBound(arr3)
  46. If arr3(j) = 最大值 Then
  47. If arr2(j + 1, 1) <> "其它" Then
  48. 计数 = 计数 + 1
  49. arr1(计数, 1) = arr2(j + 1, 1)
  50. arr1(计数, 2) = arr2(j + 1, 2)
  51. arr1(计数, 3) = 最大值
  52. arr3(j) = 0
  53. Exit For
  54. Else
  55. arr1(8, 1) = "其它"
  56. arr1(8, 3) = 最大值
  57. arr3(j) = 0
  58. Exit For
  59. End If
  60. End If
  61. Next j
  62. If 计数 < 7 Then
  63. GoTo 1
  64. End If
  65. arr1(8, 1) = "其它"
  66. arr1(8, 3) = arr1(8, 3) + WorksheetFunction.Sum(arr3)
  67. End With
  68. For i = 1 To 7
  69.         If arr1(i, 3) = 0 Then
  70.             For j = 1 To 3
  71.                 arr1(i, j) = ""
  72.             Next j
  73.         End If
  74.     Next i
  75. Range("B8").Resize(8, 3) = arr1
  76. Range("B5") = m
  77. Range("E5") = n
  78. t2 = Timer
  79. MsgBox "统计用时" & t2 - t1
  80. End Sub
复制代码

评分

参与人数 1 +20 收起 理由
wcymiss + 20

查看全部评分

回复

使用道具 举报

发表于 2012-1-2 19:08 | 显示全部楼层
吴姐辛苦了,我先把必做题交了吧!选做题和附加题如果有时间到时候再补上!{:1712:}
  1. Sub 必做一效果一_windimi007()
  2.     Dim d As Object, dic As Object
  3.     Dim arr1, arr2(1 To 1000, 1 To 100)
  4.     Dim i&
  5.     Set d = CreateObject("scripting.dictionary")
  6.     Set dic = CreateObject("scripting.dictionary")
  7.     arr1 = Range("A2:D" & Cells(Rows.Count, 1).End(3).Row)
  8.     For i = 1 To UBound(arr1)
  9.         If d.exists(arr1(i, 1)) Then
  10.             d(arr1(i, 1)) = d(arr1(i, 1)) + 1
  11.             arr2((d(arr1(i, 1)) - 1) Mod 4 + dic(arr1(i, 1)) * 5 - 3, ((d(arr1(i, 1)) - 1) \ 4) * 5 + 1) = arr1(i, 1)
  12.             arr2((d(arr1(i, 1)) - 1) Mod 4 + dic(arr1(i, 1)) * 5 - 3, ((d(arr1(i, 1)) - 1) \ 4) * 5 + 2) = arr1(i, 2)
  13.             arr2((d(arr1(i, 1)) - 1) Mod 4 + dic(arr1(i, 1)) * 5 - 3, ((d(arr1(i, 1)) - 1) \ 4) * 5 + 3) = "'" & arr1(i, 3)
  14.             arr2((d(arr1(i, 1)) - 1) Mod 4 + dic(arr1(i, 1)) * 5 - 3, ((d(arr1(i, 1)) - 1) \ 4) * 5 + 4) = arr1(i, 4)
  15.         Else
  16.             d(arr1(i, 1)) = 1
  17.             dic(arr1(i, 1)) = d.Count
  18.             arr2(d.Count * 5 - 4, 1) = "仓库名称": arr2(d.Count * 5 - 4, 2) = "序号": arr2(d.Count * 5 - 4, 3) = "商品代码": arr2(d.Count * 5 - 4, 4) = "数量"
  19.             arr2(d.Count * 5 - 3, 1) = arr1(i, 1): arr2(d.Count * 5 - 3, 2) = arr1(i, 2): arr2(d.Count * 5 - 3, 3) = arr1(i, 3): arr2(d.Count * 5 - 3, 4) = arr1(i, 4)
  20.         End If
  21.     Next i
  22.     Range("F3").Resize(d.Count * 5, 100) = arr2
  23. End Sub
复制代码

  1. Sub 必做一效果二_windimi007()
  2.     Dim dic As Object, d As Object
  3.     Dim arr1, arr2(1 To 1000, 1 To 14)
  4.     Dim i&, j&, k&
  5.     Dim x
  6.     Set dic = CreateObject("scripting.dictionary")
  7.     Set d = CreateObject("scripting.dictionary")
  8.     arr1 = Range("A2:D" & Cells(Rows.Count, 1).End(3).Row)
  9.     k = 1
  10.     For i = 1 To UBound(arr1)
  11.         dic(arr1(i, 1)) = dic(arr1(i, 1)) + 1
  12.     Next i
  13.     x = dic.items
  14.     Set dic = Nothing
  15.     For i = 1 To UBound(arr1)
  16.         If d.exists(arr1(i, 1)) Then
  17.             d(arr1(i, 1)) = d(arr1(i, 1)) + 1
  18.             arr2(d(arr1(i, 1)) Mod 5 + (d(arr1(i, 1)) \ 15) * 5 + k, ((d(arr1(i, 1)) \ 5) Mod 3) * 5 + 1) = arr1(i, 1)
  19.             arr2(d(arr1(i, 1)) Mod 5 + (d(arr1(i, 1)) \ 15) * 5 + k, ((d(arr1(i, 1)) \ 5) Mod 3) * 5 + 2) = arr1(i, 2)
  20.             arr2(d(arr1(i, 1)) Mod 5 + (d(arr1(i, 1)) \ 15) * 5 + k, ((d(arr1(i, 1)) \ 5) Mod 3) * 5 + 3) = "'" & arr1(i, 3)
  21.             arr2(d(arr1(i, 1)) Mod 5 + (d(arr1(i, 1)) \ 15) * 5 + k, ((d(arr1(i, 1)) \ 5) Mod 3) * 5 + 4) = arr1(i, 4)
  22.         Else
  23.             d(arr1(i, 1)) = 1
  24.             If d.Count > 1 Then k = k + (x(d.Count - 2) \ 15) * 5 + 5
  25.             arr2(k, 1) = "仓库名称": arr2(k, 2) = "序号": arr2(k, 3) = "商品代码": arr2(k, 4) = "数量"
  26.             arr2(k + 1, 1) = arr1(i, 1): arr2(k + 1, 2) = arr1(i, 2): arr2(k + 1, 3) = arr1(i, 3): arr2(k + 1, 4) = arr1(i, 4)
  27.         End If
  28.     Next i
  29.     Range("F26").Resize(1000, 14) = arr2
  30. End Sub
复制代码

  1. Sub 必做二_windimi007()
  2.     Dim d1 As Object, d2 As Object
  3.     Dim arr1, arr2()
  4.     Dim sh As Worksheet
  5.     Dim i&
  6.     Set d1 = CreateObject("scripting.dictionary")
  7.     Set d2 = CreateObject("scripting.dictionary")
  8.     arr1 = Range("A2:B13")
  9.     For i = 1 To UBound(arr1)
  10.         d1(arr1(i, 1) & vbTab & arr1(i, 2)) = i + 1
  11.     Next i
  12.     For Each sh In Worksheets(Array("必二1", "必二2"))
  13.         arr1 = sh.Range("A1").CurrentRegion
  14.         For i = 2 To UBound(arr1)
  15.             If d2.exists(arr1(i, 5)) Then
  16.                 arr2(d1(arr1(i, 1) & vbTab & arr1(i, 2)), d2(arr1(i, 5))) = arr2(d1(arr1(i, 1) & vbTab & arr1(i, 2)), d2(arr1(i, 5))) + arr1(i, 4)
  17.             Else
  18.                 d2(arr1(i, 5)) = d2.Count + 1
  19.                 ReDim Preserve arr2(1 To 13, 1 To d2.Count)
  20.                 arr2(1, d2.Count) = arr1(i, 5)
  21.                 arr2(d1(arr1(i, 1) & vbTab & arr1(i, 2)), d2.Count) = arr1(i, 4)
  22.             End If
  23.         Next i
  24.     Next sh
  25.     Range("C1").Resize(13, d2.Count) = arr2
  26. End Sub
复制代码

评分

参与人数 1 +10 收起 理由
wcymiss + 10

查看全部评分

回复

使用道具 举报

发表于 2012-1-2 20:28 | 显示全部楼层
本帖最后由 rxj_0414 于 2012-1-2 20:30 编辑


  1. '===================================================================================================
  2. Sub 附加_by_rxj_0414()
  3.     Dim arr, Dbad As New Dictionary, Dabc As New Dictionary, i%, j%, k%, strName$, iMon%
  4.     Dim Cnt&, iCheck&, iBad&, iNo()
  5.     arr = Sheet7.Range("A3").CurrentRegion
  6.     For i = 1 To UBound(arr)
  7.         If Len(arr(i, 1)) > 0 And Len(arr(i, 2)) > 0 Then
  8.             strName = arr(i, 1)
  9.         Else
  10.             arr(i, 1) = strName
  11.         End If
  12.     Next i
  13.     strName = Sheet6.Range("B2").Value: iMon = Sheet6.Range("E2").Value
  14.     For i = 2 To UBound(arr)
  15.         Dabc(arr(i, 3)) = arr(i, 4)
  16.         If arr(i, 1) = strName Then
  17.             For j = 5 To UBound(arr, 2)
  18.                 If Month(arr(1, j)) = iMon And arr(i, 4) <> "检查数" Then
  19.                     Dbad(arr(i, 3)) = Dbad(arr(i, 3)) + arr(i, j)
  20.                     iBad = iBad + arr(i, j)
  21.                 End If
  22.             Next j
  23.             If arr(i, 4) = "检查数" Then
  24.                 For k = 5 To UBound(arr, 2)
  25.                     If Month(arr(1, k)) = iMon Then
  26.                         iCheck = iCheck + arr(i, k)
  27.                     End If
  28.                 Next k
  29.             End If
  30.         End If
  31.     Next i
  32.     For i = Dbad.Count - 1 To 0 Step -1
  33.         If Dbad.Items(i) = 0 Then
  34.             Dbad.Remove (Dbad.Keys(i))
  35.         End If
  36.     Next i
  37.     If Dbad.Count > 7 Then
  38.         For i = Dbad.Count - 1 To 7 Step -1
  39.             Cnt = Cnt + Dbad.Items(i)
  40.             Dbad.Remove (Dbad.Keys(i))
  41.         Next i
  42.         Dbad.Add "其他", Cnt
  43.     End If
  44.     With Sheet6
  45.         .Range("B5") = iCheck
  46.         .Range("E5") = iBad
  47.         .Range("A8:D15").ClearContents
  48.     End With
  49.     If Dbad.Count > 0 Then
  50.         ReDim iNo(1 To Dbad.Count)
  51.         For i = 1 To Dbad.Count
  52.             iNo(i) = i
  53.         Next i
  54.         With Sheet6
  55.             .Range("A8").Resize(UBound(iNo), 1) = Application.Transpose(iNo)
  56.             .Range("B8").Resize(Dbad.Count, 1) = Application.Transpose(Dbad.Keys)
  57.             .Range("D8").Resize(Dbad.Count, 1) = Application.Transpose(Dbad.Items)
  58.             If Dbad.Count > 7 Then
  59.                 .Range("C8").Resize(7, 1) = Application.Transpose(Dabc.Items)
  60.             Else
  61.                 .Range("C8").Resize(Dbad.Count, 1) = Application.Transpose(Dabc.Items)
  62.             End If
  63.         End With
  64.     End If
  65. End Sub
  66. '===================================================================================================
  67. Sub 选做_by_rxj_0414()
  68.     Dim D As New Dictionary, i%, arr, arr2, x%, j%, Cnt&, str$, Fd As Boolean
  69.     arr = Sheet5.Range("B2:E" & Sheet5.Cells(Sheet5.Rows.Count, 1).End(3).Row).Value
  70.     For i = 2 To 5
  71.         If Sheet5.Cells(i, "H").End(xlToRight).Column > x Then
  72.             x = Sheet5.Cells(i, "H").End(xlToRight).Column
  73.         End If
  74.     Next i
  75.     arr2 = Sheet5.Range(Range("H2"), Cells(5, x)).Value
  76.     For i = 1 To UBound(arr)
  77.         Fd = False
  78.         D(arr(i, 1) & arr(i, 2)) = D(arr(i, 1) & arr(i, 2)) + arr(i, 3)
  79.         For x = 1 To UBound(arr2, 1)
  80.             If arr2(x, 1) & arr2(x, 2) = arr(i, 1) & arr(i, 2) Then
  81.                 Cnt = 0
  82.                 For j = 4 To UBound(arr2, 2) Step 2
  83.                     If Len(arr2(x, j)) > 0 Then
  84.                         Cnt = Cnt + arr2(x, j)
  85.                         If D(arr(i, 1) & arr(i, 2)) < Cnt Then
  86.                             arr(i, 4) = arr2(x, j - 1)
  87.                             Exit For
  88.                         Else
  89.                             arr(i, 4) = "11"
  90.                         End If
  91.                     Else
  92.                         If arr(i, 4) = "11" Then
  93.                             arr(i, 4) = arr2(x, j - 3)
  94.                         End If
  95.                     End If
  96.                 Next j
  97.                 Fd = True
  98.                 Exit For
  99.             End If
  100.         Next x
  101.         If Fd = False Then
  102.             str = str & arr(i, 1) & "  " & arr(i, 2) & vbCrLf
  103.         End If
  104.     Next i
  105.     Sheet5.Range("B2:B100").ClearContents
  106.     Sheet5.Range("B2").Resize(UBound(arr), UBound(arr, 2)) = arr
  107.     If Len(str) Then MsgBox "未找到:" & vbCrLf & str
  108. End Sub
  109. '===================================================================================================
  110. Sub 必做二_by_rxj_0414()
  111.     Dim D As New Dictionary, Dmon As New Dictionary, ws(), i%, arr, arrRT(), iWs%
  112.     ws = Array("必二1", "必二2")
  113.     arr = Sheet2.Range("A2:B13").Value
  114.     For i = 1 To UBound(arr)
  115.         Dmon(arr(i, 1) & arr(i, 2)) = i
  116.     Next i
  117.     For iWs = LBound(ws) To UBound(ws)
  118.         With Sheets(ws(iWs))
  119.             arr = .Range("A2:E" & .Cells(.Rows.Count, 1).End(3).Row).Value
  120.             For i = 1 To UBound(arr)
  121.                 If Not D.Exists(arr(i, 5)) Then
  122.                     D(arr(i, 5)) = D.Count + 1
  123.                 End If
  124.                 ReDim Preserve arrRT(1 To Dmon.Count, 1 To D.Count)
  125.                 arrRT(Dmon(arr(i, 1) & arr(i, 2)), D(arr(i, 5))) = _
  126.                 arrRT(Dmon(arr(i, 1) & arr(i, 2)), D(arr(i, 5))) + arr(i, 4)
  127.             Next i
  128.         End With
  129.     Next iWs
  130.     Sheet2.Range("C2").Resize(Dmon.Count, D.Count) = arrRT
  131.     Sheet2.Range("C1").Resize(1, D.Count) = D.Keys
  132. End Sub
  133. '===================================================================================================
  134. Sub 必做一_1_by_rxj_0414()
  135.     Dim D As New Dictionary
  136.     Dim i%, j%, arr, arrRS(), arrCnt(), r%, c%, arrTitle()
  137.     arrTitle = Application.Transpose(Application.Transpose(Sheet1.Range("A1:D1").Value))
  138.     arr = Sheet1.Range("A2:D" & Sheet1.Cells(Sheet1.Rows.Count, 4).End(xlUp).Row).Value
  139.     For i = 1 To UBound(arr)
  140.         D(arr(i, 1)) = D.Count
  141.     Next i
  142.     ReDim arrRS(1 To 5 * D.Count, 4)
  143.     ReDim arrCnt(1 To D.Count)
  144.     For i = 1 To UBound(arr)
  145.         arrCnt(D(arr(i, 1))) = arrCnt(D(arr(i, 1))) + 1
  146.         r = 2 + (D(arr(i, 1)) - 1) * 5 + (arrCnt(D(arr(i, 1))) - 1) Mod 4
  147.         c = ((arrCnt(D(arr(i, 1))) - 1) \ 4) * 5 + 1
  148.         If c > UBound(arrRS, 2) Then ReDim Preserve arrRS(1 To 5 * D.Count, c + 3)
  149.         For j = 0 To 3
  150.             arrRS(r, c + j) = arr(i, j + 1)
  151.         Next j
  152.     Next i
  153.     For i = 1 To D.Count
  154.         For j = 1 To 4
  155.             arrRS(1 + (i - 1) * 5, j) = arrTitle(j)
  156.         Next j
  157.     Next i
  158.     Sheet1.Range("F1").Resize(UBound(arrRS), UBound(arrRS, 2)) = arrRS
  159. End Sub
  160. '===================================================================================================
  161. Sub 必做一_2_by_rxj_0414()
  162.     Dim D As New Dictionary
  163.     Dim i%, j%, arr, arrRS(), arrCnt(), r%, c%, arrTitle(), arrRow(), iRow()
  164.     arrTitle = Application.Transpose(Application.Transpose(Sheet1.Range("A1:D1").Value))
  165.     arr = Sheet1.Range("A2:D" & Sheet1.Cells(Sheet1.Rows.Count, 4).End(xlUp).Row).Value
  166.     For i = 1 To UBound(arr)
  167.         D(arr(i, 1)) = D.Count
  168.     Next i
  169.     ReDim arrCnt(1 To D.Count)
  170.     ReDim arrRow(1 To D.Count)
  171.     ReDim iRow(1 To D.Count)
  172.     For i = 1 To UBound(arrCnt)
  173.         arrCnt(i) = 1
  174.     Next i
  175.     For i = 1 To UBound(arr)
  176.         arrCnt(D(arr(i, 1))) = arrCnt(D(arr(i, 1))) + 1
  177.     Next i
  178.     For i = 1 To UBound(arrCnt)
  179.         arrRow(i) = arrCnt(i) \ 3 + IIf(arrCnt(i) Mod 3 = 0, 0, 1)
  180.         If arrRow(i) < 5 Then arrRow(i) = 5
  181.         arrCnt(i) = 1
  182.         If i > 1 Then
  183.             iRow(i) = iRow(i - 1) + arrRow(i - 1)
  184.         Else
  185.             iRow(i) = 1
  186.         End If
  187.     Next i
  188.     ReDim arrRS(1 To iRow(D.Count) + arrRow(D.Count) - 1, 5 * 3 - 1)
  189.     For i = 1 To UBound(arr)
  190.         arrCnt(D(arr(i, 1))) = arrCnt(D(arr(i, 1))) + 1
  191.         r = iRow(D(arr(i, 1))) + (arrCnt(D(arr(i, 1))) - 1) Mod arrRow(D(arr(i, 1)))
  192.         c = ((arrCnt(D(arr(i, 1))) - 1) \ arrRow(D(arr(i, 1)))) * 5 + 1
  193.         For j = 0 To 3
  194.             arrRS(r, c + j) = arr(i, j + 1)
  195.         Next j
  196.     Next i
  197.     For i = 1 To D.Count
  198.         For j = 1 To 4
  199.             arrRS(iRow(i), j) = arrTitle(j)
  200.         Next j
  201.     Next i
  202.     Sheet1.Range("F25").Resize(UBound(arrRS), UBound(arrRS, 2)) = arrRS
  203. End Sub
  204. '===================================================================================================

复制代码

评分

参与人数 1 +20 收起 理由
wcymiss + 20

查看全部评分

回复

使用道具 举报

发表于 2012-1-3 15:53 | 显示全部楼层
本帖最后由 wcymiss 于 2012-1-13 21:18 编辑

来交作业了  这次可以被批改了  希望可以得到老师的优化建议!
  1. Sub 效果一()
  2.     Dim arr, bb, ss, d As Object, brr(1 To 50, 1 To 50)
  3.     Dim a%, hh%, lh%
  4.     Set d = CreateObject("scripting.dictionary")
  5.     arr = Range("a1:d" & Cells(Rows.Count, 1).End(3).Row).Value
  6.     For i = 2 To UBound(arr)
  7.         If d.Exists(arr(i, 1)) Then
  8.             d(arr(i, 1)) = d(arr(i, 1)) & "|" & i
  9.         Else
  10.             d.Add arr(i, 1), i
  11.         End If
  12.     Next i
  13.     ss = d.items
  14.     For i = 0 To d.Count - 1
  15.         a = 1 + i * 5
  16.         brr(a, 1) = arr(1, 1): brr(a, 2) = arr(1, 2): brr(a, 3) = arr(1, 3): brr(a, 4) = arr(1, 4)
  17.         bb = Split(ss(i), "|")
  18.         For j = 0 To UBound(bb)
  19.             hh = j Mod 4 + a + 1
  20.             lh = (j \ 4) * 5
  21.             brr(hh, lh + 1) = arr(bb(j), 1): brr(hh, lh + 2) = arr(bb(j), 2): brr(hh, lh + 3) = arr(bb(j), 3): brr(hh, lh + 4) = arr(bb(j), 4)
  22.         Next j
  23.     Next i
  24.     [f1].Resize(50, 50) = brr
  25.     Set d = Nothing
  26. End Sub
复制代码

  1. Sub 效果二()
  2.     Dim arr, bb, ss, d As Object, brr(1 To 50, 1 To 15)
  3.     Dim a%, hh%, lh%
  4.     Set d = CreateObject("scripting.dictionary")
  5.     arr = Range("a1:d" & Cells(Rows.Count, 1).End(3).Row).Value
  6.     For i = 2 To UBound(arr)
  7.         If d.Exists(arr(i, 1)) Then
  8.             d(arr(i, 1)) = d(arr(i, 1)) & "|" & i
  9.         Else
  10.             d.Add arr(i, 1), "1|" & i
  11.         End If
  12.     Next i
  13.     ss = d.items
  14.     For i = 0 To d.Count - 1
  15.         bb = Split(ss(i), "|")
  16.         For j = 0 To UBound(bb)
  17.             hh = a + j Mod 5 + 1 + (j \ 15) * 5
  18.             lh = (j \ 5) * 5 - (j \ 15) * 15
  19.             brr(hh, lh + 1) = arr(bb(j), 1): brr(hh, lh + 2) = arr(bb(j), 2): brr(hh, lh + 3) = arr(bb(j), 3): brr(hh, lh + 4) = arr(bb(j), 4)
  20.         Next j
  21.         a = (hh \ 5 + 1) * 5
  22.     Next i
  23.     [f51].Resize(50, 15) = brr
  24.     Set d = Nothing
  25. End Sub
复制代码

  1. Sub 必做二()
  2.     Dim arr1, arr2, brr(1 To 13, 1 To 20), d1 As New Dictionary, d2 As New Dictionary
  3.     Dim k%, b%
  4.     With Sheets("必二1")
  5.         arr1 = .Range("a2:e" & .Cells(.Rows.Count, 1).End(3).Row).Value
  6.     End With
  7.     With Sheets("必二2")
  8.         arr2 = .Range("a2:e" & .Cells(.Rows.Count, 1).End(3).Row).Value
  9.     End With
  10.     For i = 1 To UBound(arr1)
  11.         If Not d1.Exists(arr1(i, 2)) Then
  12.             d1.Add arr1(i, 2), arr1(i, 2) + 1
  13.         End If
  14.         If Not d2.Exists(arr1(i, 5)) Then
  15.             k = k + 1: d2.Add arr1(i, 5), k: brr(1, k) = arr1(i, 5)
  16.         End If
  17.         brr(d1(arr1(i, 2)), d2(arr1(i, 5))) = brr(d1(arr1(i, 2)), d2(arr1(i, 5))) + arr1(i, 4)
  18.     Next i
  19.     For i = 1 To UBound(arr2)
  20.         If Not d1.Exists(arr2(i, 2)) Then
  21.             d1.Add arr2(i, 2), arr2(i, 2) + 1
  22.         End If
  23.         If Not d2.Exists(arr2(i, 5)) Then
  24.             k = k + 1: d2.Add arr2(i, 5), k: brr(1, k) = arr2(i, 5)
  25.         End If
  26.         brr(d1(arr2(i, 2)), d2(arr2(i, 5))) = brr(d1(arr2(i, 2)), d2(arr2(i, 5))) + arr2(i, 4)
  27.     Next i
  28.     Set d1 = Nothing: Set d2 = Nothing
  29.     Range(Cells(1, 3), Cells(13, 22)).ClearContents
  30.     Range(Cells(1, 3), Cells(13, 22)) = brr
  31. End Sub
复制代码

  1. Sub 选做()
  2.     Dim arr, brr, da As New Dictionary, db As New Dictionary, dc As New Dictionary
  3.     Dim crr(1 To 200) As String, s1$, s2$, s3$
  4.     arr = [h1].CurrentRegion.Value
  5.     For i = 2 To UBound(arr)
  6.         s1 = arr(i, 1) & arr(i, 2)
  7.         da(s1) = i
  8.         For j = 6 To UBound(arr, 2) Step 2
  9.             If arr(i, j) = "" Then Exit For
  10.             arr(i, j) = arr(i, j - 2) + arr(i, j)
  11.         Next j
  12.         db(s1) = j - 2
  13.     Next i
  14.     brr = Range("b2:d" & Cells(Rows.Count, 2).End(3).Row).Value
  15.     For i = 1 To UBound(brr)
  16.         s2 = brr(i, 1) & brr(i, 2)
  17.         dc(s2) = dc(s2) + brr(i, 3)
  18.         If Not da.Exists(s2) Then
  19.             If InStr(s3, s2) = 0 Then s3 = s3 & "  " & s2
  20.         Else
  21.             If dc(s2) <= arr(da(s2), db(s2)) Then
  22.                 For j = 4 To db(s2) Step 2
  23.                     If dc(s2) <= arr(da(s2), j) Then crr(i) = arr(da(s2), j - 1): Exit For
  24.                 Next j
  25.             Else
  26.                 crr(i) = arr(da(s2), db(s2) - 1)
  27.             End If
  28.         End If
  29.     Next i
  30.     Set da = Nothing: Set db = Nothing: Set dc = Nothing
  31.     [e2].Resize(200, 1).ClearContents
  32.     [e2].Resize(200, 1) = Application.Transpose(crr)
  33.     If s3 <> "" Then
  34.         MsgBox "以下型号及产品在编码表中不存在:" & Chr(13) & s3
  35.     End If
  36. End Sub
复制代码

  1. Sub 附加题()
  2.     Dim h1%, h2%, c%, c1%, c2%, s$, k%, t1&, t2&, temp1, temp2
  3.     Dim arr, brr, a, b, crr(), drr(1 To 8, 1 To 3), d As New Dictionary
  4.     With Sheets("附加1")
  5.         c = .Cells(3, Columns.Count).End(1).Column
  6.         For i = 5 To c
  7.             If InStr(Str(.Cells(3, i)), "-" & CStr(Cells(2, 5)) & "-") Then c1 = c1 + 1: c2 = i
  8.         Next i
  9.         h1 = .[a:a].Find([b2]).Row
  10.         h2 = .[B:B].Find(what:="", after:=.Range("b" & h1)).Row
  11.         arr = .Range(.Cells(h1, c2 - c1 + 1), .Cells(h2, c2)).Value
  12.         brr = .Range("c" & h1 & ":d" & .Cells(h2, 3).End(3).Row).Value
  13.     End With
  14.     For i = 1 To UBound(brr)
  15.         s = brr(i, 1) & "|" & brr(i, 2)
  16.         If Not d.Exists(s) Then k = k + 1: d.Add s, k: ReDim Preserve crr(1 To k)
  17.         For j = LBound(arr, 2) To UBound(arr, 2)
  18.             crr(d(s)) = crr(d(s)) + arr(i, j)
  19.         Next j
  20.     Next i
  21.     b = d.Keys
  22.     For i = 1 To 7
  23.         imax = i
  24.         For j = i + 1 To k - 1
  25.             If crr(j) > crr(imax) Then imax = j
  26.         Next j
  27.         temp1 = crr(i): crr(i) = crr(imax): crr(imax) = temp1
  28.         temp2 = b(i - 1): b(i - 1) = b(imax - 1): b(imax - 1) = temp2
  29.         drr(i, 3) = crr(i)
  30.         s = b(i - 1)
  31.         a = Split(s, "|")
  32.         drr(i, 1) = a(0): drr(i, 2) = a(1)
  33.     Next i
  34.     drr(8, 1) = "其他"
  35.     t1 = Application.Sum(Application.Index(arr, h2 - h1 + 1))
  36.     t2 = Application.Sum(crr)
  37.     drr(8, 3) = t2 - Application.Sum(Application.Index(drr, , 3))
  38.     [b5] = t1: [e5] = t2: [b8:d15].ClearContents: [b8:d15] = drr
  39.     Set d = Nothing
  40. End Sub
复制代码

qushui作业三.zip

80.01 KB, 下载次数: 30

回复

使用道具 举报

发表于 2012-1-3 17:44 | 显示全部楼层
  1. Private Sub 必做一_ldxhzy()
  2.     Dim Sou(), Tmp(), Tmp1(), Tmp2()
  3.     Dim TmpD As New Dictionary
  4.     Dim I As Long, J As Long, M As Long, N As Long
  5.   
  6.     I = Me.UsedRange.Rows.Count
  7.     ReDim Sou(1 To I - 1, 1 To 4)
  8.     Sou = Me.Range(Cells(2, 1), Cells(I, 4)).Value
  9.     For I = 1 To UBound(Sou, 1)
  10.         If TmpD.Exists(Sou(I, 1)) Then
  11.             TmpD.Item(Sou(I, 1)) = TmpD.Item(Sou(I, 1)) + 1
  12.         Else
  13.             TmpD.Add Sou(I, 1), 1
  14.         End If
  15.     Next I
  16.     Tmp1 = TmpD.Keys
  17.     Tmp2 = TmpD.Items
  18.     For I = LBound(Tmp1) To UBound(Tmp1)
  19.         J = (Int((Tmp2(I) - 1) / 4) + 1) * 4
  20.         ReDim Tmp(1 To J, 1 To 4)
  21.         M = 0
  22.         N = 0
  23.         For J = LBound(Sou, 1) To UBound(Sou, 1)
  24.             If Sou(J, 1) = Tmp1(I) Then
  25.                 M = M + 1
  26.                 Tmp(M, 1) = Sou(J, 1)
  27.                 Tmp(M, 2) = Sou(J, 2)
  28.                 Tmp(M, 3) = Sou(J, 3)
  29.                 Tmp(M, 4) = Sou(J, 4)
  30.             End If
  31.         Next J
  32.         Cells(I * 5 + 1, 6).Resize(1, 4) = Array("仓库名称", "序号", "商品代码", "数量")
  33.         M = 0
  34.         For J = 1 To UBound(Tmp, 1)
  35.             Cells(I * 5 + J + N + 1, 6 + M).Resize(1, 4) = Array(Tmp(J, 1), Tmp(J, 2), Tmp(J, 3), Tmp(J, 4))
  36.             If J / 4 = Int(J / 4) Then
  37.                 M = M + 4
  38.                 N = N - 4
  39.             End If
  40.         Next J
  41.    Next I
  42. End Sub
复制代码
  1. Private Sub 必做二_ldxhzy()
  2.     Dim Sou1(), Sou2(), Sou(), Tag()
  3.     Dim I As Long, J As Long
  4.     I = ThisWorkbook.Sheets("必二1").UsedRange.Rows.Count
  5.     Sou1() = ThisWorkbook.Sheets("必二1").Range("A2:" & "E" & I).Value
  6.     J = ThisWorkbook.Sheets("必二2").UsedRange.Rows.Count
  7.     Sou2() = ThisWorkbook.Sheets("必二2").Range("A2:" & "E" & J).Value
  8.     ReDim Sou(1 To I + J - 2, 1 To 4)
  9.     For I = 1 To UBound(Sou1, 1)
  10.         Sou(I, 1) = Sou1(I, 1)
  11.         Sou(I, 2) = Sou1(I, 2)
  12.         Sou(I, 3) = Sou1(I, 4)
  13.         Sou(I, 4) = Sou1(I, 5)
  14.     Next I
  15.     For I = UBound(Sou1, 1) + 1 To UBound(Sou1, 1) + UBound(Sou2, 1)
  16.         Sou(I, 1) = Sou2(I - UBound(Sou1, 1), 1)
  17.         Sou(I, 2) = Sou2(I - UBound(Sou1, 1), 2)
  18.         Sou(I, 3) = Sou2(I - UBound(Sou1, 1), 4)
  19.         Sou(I, 4) = Sou2(I - UBound(Sou1, 1), 5)
  20.     Next I
  21.     Dim XmDic As New Dictionary
  22.     Dim XmArr()
  23.     For I = 1 To UBound(Sou, 1)     '取得所有不同的项目名称
  24.         XmDic(Sou(I, 4)) = Sou(I, 4)
  25.     Next I
  26.     XmArr = XmDic.Keys
  27.     ReDim Tag(1 To 13, 1 To XmDic.Count)
  28.     For I = 0 To UBound(XmArr)
  29.         Tag(1, I + 1) = XmArr(I)    '项目名称填入数组第一行
  30.         For J = 1 To UBound(Sou, 1)
  31.             If Sou(J, 4) = XmArr(I) Then
  32.                 Tag(Sou(J, 2) + 1, I + 1) = Tag(Sou(J, 2) + 1, I + 1) + Sou(J, 3)
  33.             End If
  34.         Next J
  35.     Next I
  36.   Range("C1").Resize(13, XmDic.Count) = Tag
  37. End Sub
复制代码
  1. Private Sub 选做_ldxhzy()
  2.     Rem 以手工方式将判断表转换为 4 个数组,每数组行内容为:编码、上限,不支持向下、向右扩展
  3.     Dim A上海(1 To 5, 1 To 2)
  4.     A上海(1, 1) = "SH01"
  5.     A上海(1, 2) = 2300
  6.     A上海(2, 1) = "SH02"
  7.     A上海(2, 2) = 2300 + 3420
  8.     A上海(3, 1) = "SH03"
  9.     A上海(3, 2) = 2300 + 3420 + 4100
  10.     A上海(4, 1) = "SH04"
  11.     A上海(4, 2) = 2300 + 3420 + 4100 + 1400
  12.     A上海(5, 1) = "SH05"
  13.     A上海(5, 2) = 2300 + 3420 + 4100 + 1400 + 0 '此条件不用判断,对应 CASE ELSE
  14.     Dim B上海(1 To 3, 1 To 2)
  15.     B上海(1, 1) = "SH06"
  16.     B上海(1, 2) = 2100
  17.     B上海(2, 1) = "SH07"
  18.     B上海(2, 2) = 2100 + 1090
  19.     B上海(3, 1) = "SH08"
  20.     B上海(3, 2) = 2100 + 1090 + 0 '此条件不用判断,对应 CASE ELSE
  21.     Dim A广州(1 To 2, 1 To 2)
  22.     A广州(1, 1) = "GZ01"
  23.     A广州(1, 2) = 4300
  24.     A广州(2, 1) = "GZ02"
  25.     A广州(2, 2) = 4300 + 0 '此条件不用判断,对应 CASE ELSE
  26.     Dim B广州(1 To 4, 1 To 2)
  27.     B广州(1, 1) = "GZ03"
  28.     B广州(1, 2) = 2380
  29.     B广州(2, 1) = "GZ04"
  30.     B广州(2, 2) = 2380 + 4300
  31.     B广州(3, 1) = "GZ05"
  32.     B广州(3, 2) = 2380 + 4300 + 2100
  33.     B广州(4, 1) = "GZ06"
  34.     B广州(4, 2) = 2380 + 4300 + 2100 + 0 '此条件不用判断,对应 CASE ELSE
  35.     Dim Sou(), Tag()
  36.     Dim MyDic As New Dictionary
  37.     Dim I As Long
  38.     I = Me.UsedRange.Rows.Count - 1
  39.     ReDim Sou(1 To I, 3)
  40.     Sou = Range("B2").Resize(I, 3)
  41.     For I = 1 To UBound(Sou, 1)
  42.         If MyDic.Exists(Sou(I, 1) & Sou(I, 2)) Then
  43.             MyDic.Item(Sou(I, 1) & Sou(I, 2)) = MyDic.Item(Sou(I, 1) & Sou(I, 2)) + Sou(I, 3)
  44.         Else
  45.             MyDic.Add Sou(I, 1) & Sou(I, 2), Val(Sou(I, 3))
  46.         End If
  47.         ReDim Preserve Tag(1 To I)
  48.         Select Case Sou(I, 1) & Sou(I, 2)
  49.             Case "A上海"
  50.                Select Case MyDic.Item(Sou(I, 1) & Sou(I, 2))
  51.                 Case Is <= A上海(1, 2)
  52.                      Tag(I) = A上海(1, 1)
  53.                 Case Is <= A上海(2, 2)
  54.                      Tag(I) = A上海(2, 1)
  55.                 Case Is <= A上海(3, 2)
  56.                      Tag(I) = A上海(3, 1)
  57.                 Case Is <= A上海(4, 2)
  58.                      Tag(I) = A上海(4, 1)
  59.                 Case Else
  60.                      Tag(I) = A上海(5, 1)
  61.                 End Select
  62.             Case "B上海"
  63.                Select Case MyDic.Item(Sou(I, 1) & Sou(I, 2))
  64.                 Case Is <= B上海(1, 2)
  65.                      Tag(I) = B上海(1, 1)
  66.                 Case Is <= B上海(2, 2)
  67.                      Tag(I) = B上海(2, 1)
  68.                 Case Else
  69.                      Tag(I) = B上海(3, 1)
  70.                 End Select
  71.             Case "A广州"
  72.                Select Case MyDic.Item(Sou(I, 1) & Sou(I, 2))
  73.                 Case Is <= A广州(1, 2)
  74.                      Tag(I) = A广州(1, 1)
  75.                 Case Else
  76.                      Tag(I) = A广州(2, 1)
  77.                 End Select
  78.             Case "B广州"
  79.                Select Case MyDic.Item(Sou(I, 1) & Sou(I, 2))
  80.                 Case Is <= B广州(1, 2)
  81.                      Tag(I) = B广州(1, 1)
  82.                 Case Is <= B广州(2, 2)
  83.                      Tag(I) = B广州(2, 1)
  84.                    Case Is <= B广州(3, 2)
  85.                      Tag(I) = B广州(3, 1)
  86.                    Case Else
  87.                      Tag(I) = B广州(4, 1)
  88.                 End Select
  89.              Case Else
  90.                 Tag(I) = ""
  91.                 MsgBox "关键字 " & Sou(I, 1) & Sou(I, 2) & " 不存在!"
  92.           End Select
  93.     Next I
  94.     Range("E2").Resize(UBound(Tag, 1), 1) = Application.WorksheetFunction.Transpose(Tag)
  95. End Sub
复制代码


点评

必做一只有一个效果。选做题不符要求。  发表于 2012-1-13 21:21

评分

参与人数 1 +7 收起 理由
wcymiss + 7

查看全部评分

回复

使用道具 举报

发表于 2012-1-3 20:16 | 显示全部楼层

  1. Sub 必做一_效果一_EP学员()
  2. Dim brr(1 To 10000, 1 To 50)
  3. Dim arr, arr1, 行标 As Long, 列标 As Byte, 步长 As Byte, i As Long, k As Integer, imax As Integer
  4. Dim dic As New Dictionary
  5. With Sheets("必做一")
  6. arr1 = [{"仓库名称","序号","商品代码","数量",""}]
  7. arr = .Range("a1:e" & Range("a65536").End(xlUp).Row)
  8. For i = 2 To UBound(arr)
  9. If Not dic.Exists(arr(i, 1)) Then
  10. 行标 = (dic.Count) * 5 + 1
  11. dic(arr(i, 1)) = 1
  12. 列标 = 0
  13. For k = 1 To 5
  14. brr(行标, k) = arr1(k)
  15. brr(行标 + 1, 列标 + k) = arr(i, k)
  16. Next
  17. Else
  18. dic(arr(i, 1)) = dic(arr(i, 1)) + 1
  19. 列标 = (dic(arr(i, 1)) \ 5) * 5
  20. 步长 = (dic(arr(i, 1)) - 1) Mod 4 + 1
  21. If imax < 列标 Then imax = 列标
  22. For k = 1 To 5
  23. brr(行标 + 步长, 列标 + k) = arr(i, k)
  24. Next
  25. End If
  26. Next
  27. .Range("g2").Resize(dic.Count * 5, imax) = brr
  28. End With
  29. End Sub


  30. Sub 必做二_EP学员()
  31. Dim d As New Dictionary
  32. Dim arr, i, sh, brr(), k
  33. For Each sh In Array(Sheets("必二1"), Sheets("必二2"))
  34. arr = sh.Range("a1").CurrentRegion
  35. For i = 2 To UBound(arr)
  36. If Not d.Exists(arr(i, 5)) Then
  37. k = k + 1
  38. d(arr(i, 5)) = k
  39. ReDim Preserve brr(1 To 12, 1 To k)
  40. End If
  41. brr(arr(i, 2), d(arr(i, 5))) = brr(arr(i, 2), d(arr(i, 5))) + arr(i, 4)
  42. Next i
  43. Next
  44. With Sheets("必做二")
  45. .Range("c:z").ClearContents
  46. .[c1].Resize(1, d.Count) = d.Keys
  47. .[c2].Resize(12, UBound(brr, 2)) = brr
  48. End With
  49. End Sub
复制代码

评分

参与人数 1 +7 收起 理由
wcymiss + 7

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 01:00 , Processed in 0.312435 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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