|
发表于 2011-11-29 18:12
|
显示全部楼层
本楼为最佳答案
- Sub jUSTtesT()
- Dim d As New Dictionary, Arr, ArrR(), i&, S$ '定义变量
- With Sheets("出库明细") '获取出库明细信息
- Arr = .Range("a1").CurrentRegion.Value
- End With
- For i = 3 To UBound(Arr) '货品及颜色信息存入字典项目,同时出库数量累加
- S = Arr(i, 3) & Arr(i, 4)
- d(S) = d(S) + Arr(i, 5)
- Next i
- Arr = Range("a4:h" & Cells(Rows.Count, 1).End(3).Row).Value
- '获取待生成数据信息
- ReDim ArrR(1 To UBound(Arr), 1 To 1) '重定义结果数组
- For i = 1 To UBound(Arr) '循环入库信息
- S = Arr(i, 3) & Arr(i, 4)
- If d.Exists(S) Then '如果货品颜色在字典项目中存在
- ArrR(i, 1) = Application.Min(Arr(i, 5), d(S)) '则返回出库信息
- d(S) = d(S) - ArrR(i, 1) '同时减少出库数量
- End If
- Next i
- Range("g4:g" & Rows.Count).ClearContents
- [g4].Resize(UBound(ArrR), 1) = ArrR
- End Sub
复制代码- Private Sub Worksheet_Change(ByVal Target As Range)
- If Not Application.Intersect(Target, [i1]) Is Nothing Then
- '判断是否更改了查询款号信息
- Dim Arr, i&, d As New Dictionary, ArrR(), k& '定义变量
- Arr = Range("a1").CurrentRegion.Value '获取款号数量信息入数组
- For i = 2 To UBound(Arr, 1) '循环数组
- If Arr(i, 1) = Target.Value Then '如果为查询款号记录
- If Not d.Exists(Arr(i, 3)) Then '则颜色名称在字典项目中不存在,
- k = k + 1: d.Add Arr(i, 3), k '累加颜色个数标识位,同时添加字典项目
- ReDim Preserve ArrR(1 To 2, 1 To k) '同时动态定义结果数组
- End If
- ArrR(1, d(Arr(i, 3))) = Arr(i, 3) '对颜色所在的结果数组进行颜色赋值
- ArrR(2, d(Arr(i, 3))) = Arr(i, 4) + ArrR(2, d(Arr(i, 3))) '对颜色所在的结果数组进行数量汇总
- End If
- Next i
- Range("f2:g" & Rows.Count).ClearContents '清空目标区域
- If k > 0 Then '如果有查询记录
- [f2].Resize(k, 2) = Application.Transpose(ArrR) '则返回结果
- End If
- End If
- End Sub
复制代码
|
|