Excel精英培训网

 找回密码
 注册
12
返回列表 发新帖
楼主: wcymiss

[习题] 作业参考代码

[复制链接]
 楼主| 发表于 2012-1-12 19:01 | 显示全部楼层
作业三_选做:
  1. Sub 作业三_选做()
  2.     Dim d1 As Object, d2 As Object
  3.     Dim arr, brr, bhrr(), slrr(), crr(), drr() As Long
  4.     Dim i As Long, j As Long, s As String, n As Long, m As String
  5.     Set d1 = CreateObject("scripting.dictionary")
  6.     Set d2 = CreateObject("scripting.dictionary")
  7.     With Sheets("选做")
  8.         arr = .Range("a2:d" & .Cells(Rows.Count, 1).End(3).Row) '数据表
  9.         brr = .Range("h1").CurrentRegion '对照表
  10.         ReDim bhrr(1 To UBound(brr), 1 To UBound(brr, 2))
  11.         ReDim slrr(1 To UBound(brr), UBound(brr, 2))
  12.         ReDim crr(1 To UBound(arr), 1 To 1) '结果数组
  13.         For i = 2 To UBound(brr)
  14.             s = brr(i, 1) & "," & brr(i, 2)
  15.             d1(s) = i 'key为产品型号,item为对照表型号产地所在行号
  16.             For j = 3 To UBound(brr, 2) Step 2
  17.                 If Len(brr(i, j)) > 0 Then
  18.                     bhrr(i, j \ 2) = brr(i, j) '编号数组,i为对照表型号产地所在行号
  19.                     slrr(i, j \ 2) = slrr(i, j \ 2 - 1) + brr(i, j + 1) '数量数组,与编号数组对应
  20.                 End If
  21.             Next
  22.         Next
  23.         ReDim drr(2 To d1.Count + 1) '记录结果数组的编号已经取到对照表的第几个位置
  24.         For i = 2 To UBound(drr) '初始化
  25.             drr(i) = 1
  26.         Next
  27.         For i = 1 To UBound(arr)
  28.             s = arr(i, 2) & "," & arr(i, 3)
  29.             If d1.exists(s) Then '如果对照表有此型号产地,则:
  30.                 n = d1(s) '取出item,因为后面要多次调用,所以将其赋值给变量
  31.                 d2(s) = d2(s) + arr(i, 4)
  32.                 For j = drr(n) To UBound(slrr, 2) '从drr(n)开始循环,减少循环量
  33.                     If IsEmpty(slrr(n, j + 1)) Then Exit For
  34.                     If d2(s) < slrr(n, j) Then Exit For
  35.                     drr(n) = drr(n) + 1
  36.                 Next
  37.                 crr(i, 1) = bhrr(n, drr(n))
  38.             Else
  39.                 m = m & vbCr & s
  40.             End If
  41.         Next
  42.         .Range("e2").Resize(Rows.Count - 1, 1).ClearContents
  43.         .Range("e2").Resize(UBound(crr), 1) = crr
  44.     End With
  45.     Set d1 = Nothing
  46.     Set d2 = Nothing
  47.     If Len(m) > 0 Then MsgBox "下列型号产地未找到:" & m
  48. End Sub
复制代码

评分

参与人数 1 +24 收起 理由
sunjing-zxl + 24 老师辛苦了

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2012-1-12 19:05 | 显示全部楼层
本帖最后由 wcymiss 于 2012-1-12 22:30 编辑

作业三_附加题:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     '作业三_附加题
  3.     '数据源里“俗称”需无重复,日期需从小到大排列
  4.     If Target.Count > 1 Then Exit Sub
  5.     If Target.Address = "$B$2" Or Target.Address = "$E$2" Then
  6.         Application.EnableEvents = False
  7.         Dim rn As String, mo As Long, a As Range
  8.         Dim arr, brr(1 To 8, 1 To 3), yue(1 To 2)
  9.         Dim i As Long, rw As Long, n As Long, bls As Long, jcs As Long
  10.         rn = Range("b2").Value
  11.         mo = Range("e2").Value
  12.         With Sheets("附加1")
  13.             arr = .Range("a3").CurrentRegion
  14.             Set a = .Range("a:a").Find(rn, .Range("a1"))  '先查找到俗称
  15.         End With
  16.         If a Is Nothing Then
  17.             GoTo 100
  18.         Else
  19.             rw = a.Row - 2
  20.         End If
  21.         For j = 5 To UBound(arr, 2)
  22.             If IsEmpty(yue(1)) Then
  23.                 If Month(arr(1, j)) = mo Then yue(1) = j
  24.             Else
  25.                 If Month(arr(1, j)) <> mo Then
  26.                     yue(2) = j - 1
  27.                     Exit For
  28.                 End If
  29.             End If
  30.         Next
  31.         For i = rw To UBound(arr)
  32.             If Len(arr(i, 2)) = 0 Then Exit For
  33.             n = n + 1
  34.             If n < 8 Then
  35.                 brr(n, 1) = arr(i, 3)
  36.                 brr(n, 2) = arr(i, 4)
  37.                 For j = yue(1) To yue(2)
  38.                     brr(n, 3) = brr(n, 3) + arr(i, j)
  39.                 Next
  40.                 bls = bls + brr(n, 3)
  41.             Else
  42.                 For j = yue(1) To yue(2)
  43.                     brr(8, 3) = brr(8, 3) + arr(i, j)
  44.                 Next
  45.             End If
  46.         Next
  47.         bls = bls + brr(8, 3)
  48.         If n > 7 Then brr(8, 1) = "其他"
  49.         For j = yue(1) To yue(2)
  50.             jcs = jcs + arr(i, j)
  51.         Next
  52.         Range("b5") = jcs
  53.         Range("e5") = bls
  54.         Range("b8:d15") = brr
  55.         Set a = Nothing
  56. 100
  57.         Application.EnableEvents = True
  58.     End If
  59. End Sub
复制代码

评分

参与人数 1 +24 收起 理由
sunjing-zxl + 24 老师辛苦了

查看全部评分

回复

使用道具 举报

发表于 2012-1-12 22:44 | 显示全部楼层
晕,字典字典字典,数组数组数组
回复

使用道具 举报

发表于 2012-1-13 08:59 | 显示全部楼层
吴姐辛苦了。。{:211:}
回复

使用道具 举报

发表于 2012-1-13 09:29 | 显示全部楼层
吴姐辛苦了,春节放假慢慢研究!{:1612:}
回复

使用道具 举报

发表于 2012-6-30 20:00 | 显示全部楼层
学习中谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 02:27 , Processed in 0.199023 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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