|
楼主 |
发表于 2012-1-12 19:01
|
显示全部楼层
作业三_选做:
- Sub 作业三_选做()
- Dim d1 As Object, d2 As Object
- Dim arr, brr, bhrr(), slrr(), crr(), drr() As Long
- Dim i As Long, j As Long, s As String, n As Long, m As String
- Set d1 = CreateObject("scripting.dictionary")
- Set d2 = CreateObject("scripting.dictionary")
- With Sheets("选做")
- arr = .Range("a2:d" & .Cells(Rows.Count, 1).End(3).Row) '数据表
- brr = .Range("h1").CurrentRegion '对照表
- ReDim bhrr(1 To UBound(brr), 1 To UBound(brr, 2))
- ReDim slrr(1 To UBound(brr), UBound(brr, 2))
- ReDim crr(1 To UBound(arr), 1 To 1) '结果数组
- For i = 2 To UBound(brr)
- s = brr(i, 1) & "," & brr(i, 2)
- d1(s) = i 'key为产品型号,item为对照表型号产地所在行号
- For j = 3 To UBound(brr, 2) Step 2
- If Len(brr(i, j)) > 0 Then
- bhrr(i, j \ 2) = brr(i, j) '编号数组,i为对照表型号产地所在行号
- slrr(i, j \ 2) = slrr(i, j \ 2 - 1) + brr(i, j + 1) '数量数组,与编号数组对应
- End If
- Next
- Next
- ReDim drr(2 To d1.Count + 1) '记录结果数组的编号已经取到对照表的第几个位置
- For i = 2 To UBound(drr) '初始化
- drr(i) = 1
- Next
- For i = 1 To UBound(arr)
- s = arr(i, 2) & "," & arr(i, 3)
- If d1.exists(s) Then '如果对照表有此型号产地,则:
- n = d1(s) '取出item,因为后面要多次调用,所以将其赋值给变量
- d2(s) = d2(s) + arr(i, 4)
- For j = drr(n) To UBound(slrr, 2) '从drr(n)开始循环,减少循环量
- If IsEmpty(slrr(n, j + 1)) Then Exit For
- If d2(s) < slrr(n, j) Then Exit For
- drr(n) = drr(n) + 1
- Next
- crr(i, 1) = bhrr(n, drr(n))
- Else
- m = m & vbCr & s
- End If
- Next
- .Range("e2").Resize(Rows.Count - 1, 1).ClearContents
- .Range("e2").Resize(UBound(crr), 1) = crr
- End With
- Set d1 = Nothing
- Set d2 = Nothing
- If Len(m) > 0 Then MsgBox "下列型号产地未找到:" & m
- End Sub
复制代码
|
评分
-
查看全部评分
|