Excel VBA 7.39单个工作表行列行列部分数据求和,可整体可局部,灵活性更强
一起学习,一起进步~~
昨天我们分享了关于工作表行列同时进行计算的方法,通过这个方法能够同时对整行,整列的所有数据进行相同的计算,这样就可以对整体进行统计,也可以针对局部部分数据进行统计,不过有小伙伴反馈下说,如果是针对部分数据进行计算的话,这样的方法似乎并不灵验了,因为当时并没有考虑到可能会有需要针对部分数据进行统计,所以公式挪动的位置有局限性,本节我们就完善下代码,提高通用性。
场景简介
还是继续昨天的案例,之前我们是针对所有的数据区域进行计算,并且将数据计算的结果反馈在最后一列,最后一行的非空单元格上面的,
上面的截图中也说明了经过小伙伴们的各种实践之后,上述的代码也是存在一定的局限性,所以今天我们就来解决这个局限性。
代码区
Sub TEST()
Dim sth As Worksheet, trng As Range, lrng As Range, arr()
Dim rng As Range
ActiveSheet.UsedRange.Interior.Color = vbWhite
Set rng = Application.InputBox("请选择要计算的单元格区域,仅数值区域,不含标头", "区域的确定", , , , , , 8)
choice = Application.InputBox("请选择计算方法" & Chr(13) & "1:求和" & Chr(13) & "2:求最大值" & Chr(13) & "3:求平均" & Chr(13) & "4:最小值", "汇总方式", , , , , , 1)
Nchoice = Choose(choice, "SUM", "MAX", "AVERAGE", "MIN")
Call cal(Nchoice, rng)
End Sub
Sub cal(s, rng)
CountR = Cells(Rows.Count, rng.Column).End(xlUp).Row
CountL = Cells(rng.Row, Columns.Count).End(xlToLeft).Column
rng.Interior.Color = vbYellow
rng(1).Offset(-1, CountL - rng.Column + 1) = s
rng.Offset(0, CountL - rng.Column + 1).Columns(1).FormulaR1C1 = "=" & s & "(RC[-" & CountL - rng.Column + 1 & "]:RC[-" & CountL - rng.Columns.Count - 1 & "])"
rng(1).Offset(CountR - rng.Row + 1, -1) = s
rng.Offset(CountR - rng.Row + 1, 0).Rows(1).FormulaR1C1 = "=" & s & "(R[-" & CountR - rng.Row + 1 & "]C:R[-" & CountR - rng.Rows.Count - 1 & "]C)"
End Sub
乍一看,代码并没有太大的变化,似乎和昨天的代码几乎差不多,不过我很负责任的说,代码已经做了修改,我们来看看最终的结果。
首先依然是需要我们去去确定数据源的区域
我们这次只选择语数外三门客户,人员只选取前10名的童鞋,来看看结果
看看结果,成功的针对部分区域进行了计算
我们来验证下是否正确, 随便点击一个单元格,看看公式和计算的范围就可以了。
行列的数据区域都是正确的, 那么在计算下全部数据
这样代码就可以同时满足全部数据和部分数据的行列同时计算的要求了。
代码分析
简单说,今天的代码主要是在昨天的代码的基础上继续完善的,所以关于程序的调用本节就不在继续多说了,不清楚的小伙伴或者是第一次看到我文章的小伙伴可以看看上一节的分析Excel VBA 7.38单个工作表行列同时计算,一个选择一次到位!
那本节我们主要说什么呢?我们重点来分析上单元格里面的挪动的位置的写法,因为有很多小伙伴说我上次说的太笼统,正好我们今天再嘻嘻说下
首先要明白一个概念,我们现在工作表中有两个rng,第一个是真实存在的rng,就是我们所选的那个区域,另外一个rng,就是虚拟的,就是我们凭空挪动的rng
我们现在要求蓝色区域的数据,那么计算的第一个单元格的位置要如何确定呢?
列方向也是一样的,不过从列坐标转成了行坐标而已。
=========================================
好了,明晚21:00,准时再见!
=====================================