有如下这样一个变态的表格。我们需要在右边红色的单元格中计算出左边的数据的和。这个求和的变态之处在于左边的数据可能有1行,两行,甚至是10几行。Boss要求的是既要求和,还要根据单位的不同保留不同的小数位数。最要命的是,这个表格很大,如果手工做的话,可能没做完就要吐血身亡了。
不如用VBA试试吧。我实在是不想手工做,看起来就头晕。
首先分析一下表格的规律:
- 求和的项都是合并的单元格(3个合并单元格)。例如2-7行的“挖土石方”。
- 要求和的数据都是只有一行或者是每隔两行有一组数据(例如第10行、第4行和第6行)
3.单位都是在第3列
程序的逻辑基本就是这样:
1.判断第一列的第n行的单元格是否为合并单元格,如果是的话,说明是求和项,进入2。
2.得到求和的区域
3.根据单位在第12列写入公式
Sub 求和()
i = 7 '开始行
s = 0 '求和数据所在行号
e = 0 '合并的最后一个单元格行号
While i < 1566 ' 这个数根据自己表格行数定
If Range("A" & i).MergeCells Then '判断单元格Ai是否为合并单元格
s = i + 2 '得到求和数据所在行
e = Range("A" & i).MergeArea.Count + s '合并的最后一个单元格行号
gs = "D" & s & ":K" & s '求和的区域
While e > s + 3 '如果求和的区域大于一个
gs = gs & ",D" & s + 3 & ":K" & s + 3 '添加求和区域
s = s + 3
Wend
If Range("C" & i).Value = "m" Or Range("C" & i).Value = "m2" Or Range("C" & i).Value = "dm3" Then '判断单位,根据单位的不同,写入不同的公式
Range("L" & i).Value = "=round(sum(" & gs & "),2)"
ElseIf Range("C" & i).Value = "m3" Or Range("C" & i).Value = "kg" Or Range("C" & i).Value = "Kg" Then
Range("L" & i).Value = "=round(sum(" & gs & "),1)"
Else
Range("C" & i).Interior.Color = vbRed
Range("L" & i).Value = "=round(sum(" & gs & "),0)"
End If
Range("L" & i).Interior.Color = vbRed '填充为红色
i = s + 1
Else '如果不是合并单元格,则下移一行
i = i + 1
End If
Wend
End Sub