|
2841889887 发表于 2014-8-26 18:41
若在“目标表”上C列、D列之间增加九列后,再在“合计”所在和物料1所在列之间增加一列,代码如何修改?请老 ...
Sub 物料用途整理2()
Dim nR1%, nL1%, nR2&, nR%, nL%, nJe, Arr(), Brr()
Dim ds As Object
Set ds = CreateObject("Scripting.Dictionary") '创建字典
With Sheets("目标表")
nR1 = .Range("b4").End(xlDown).Row 'B列最后数据行号(中间无空单元格)
nL1 = .Range("o5").End(xlToRight).Column 'B4向右查找最后一列数据所在列号(中间无空单元格)
.Range("m6:m" & nR1).ClearContents '清除原统计数据(合计列)
.Range(.Range("o6"), .Cells(nR1, nL1)).ClearContents '清除原统计数据
Arr = .Range(.Range("b4"), .Cells(nR1, nL1)).Value '将数据保存到数组
End With
With Sheets("数据源表")
nR2 = .Range("a3").End(xlDown).Row '查找数据最后位置行号
Brr = .Range("b4:e" & nR2).Value '将数据保存到数组Brr
End With
For i = 14 To nL1 - 1 '将物料编码对应列号保存到字典
ds(Arr(2, i)) = i
Next
For i = 4 To nR1 - 3 '将项目&用途对应行号保存到字典
ds(Arr(i, 1) & Arr(i, 2)) = i
Next
For i = 1 To nR2 - 3 '遍历数据
nJe = Brr(i, 4) '将金额存储到变量nJe
nL = ds(Left(Brr(i, 3), 4)) '从字典中读取物料编码的列位置
nR = ds(Brr(i, 1) & Brr(i, 2)) '从字典中读取项目&用途对应的行号
If nL * nR * nJe <> 0 Then '如果字典中存在物料编码、项目&用途,并且金额不为0
Arr(3, 12) = Arr(3, 12) + nJe '累加总金额( M6 单元格位置)
Arr(3, nL) = Arr(3, nL) + nJe '累加物料编码对应的合计金额(工作表第6行)
Arr(nR, nL) = Arr(nR, nL) + nJe '按条件累加(物料编码、项目&用途)
Arr(nR, 12) = Arr(nR, 12) + nJe '累加项目&用途合计金额(工作表M列)
nR = ds(Brr(i, 1) & "合计") '从字典中读取合计行的行号
If nR > 0 Then '如果存在
Arr(nR, nL) = Arr(nR, nL) + nJe '累加金额
Arr(nR, 12) = Arr(nR, 12) + nJe '按项目累加金额(工作表M列)
End If
End If
Next
With Sheets("目标表")
.Range(.Range("b4"), .Cells(nR1, nL1)).Value = Arr '将结果写入工作表
End With
End Sub
|
|