Excel VBA 7.38单个工作表行列同时计算,一个选择一次到位!
一起学习,一起进步~~
前景提要(文末提供源码下载)
在我们之前分享了关于工作表的数据计算的文章之后,有小伙伴过来给我增加难度了
他表示在自己的日常工作中也是经常需要进行数据的计算,但是并不到一定是求和计算,有时是平均值的结算
而且因为数据分析的需要,很多时候需要行列数据同时进行计算,虽然可以输入公式来解决,但是每次输入公式之后还需要向下填充,比较麻烦,一些不常用的函数自己也记不清楚,希望能够通过VBA来实现这样的效果,那么我们就来研究下这个功能
场景简介
其实行列同时计算的功能,我之前曾经说过,在我们的平时的工作中还是比较常见的,因为我们分析的数据,有时是针对整体,有时有需要针对个体
所以行列同时计算,也是很实用的案例,我就来分析下这个场景,还是我们之前的案例。
我们需要针对所选数据区域进行同一行数据的求和,同一列数据的求和,当然为了数据处理的灵活性,我们增加多一些条件,比方说最大值,最小值,平均值这样的计算。
代码区
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, rng.Columns.Count).Columns(1).FormulaR1C1 = "=" & s & "(RC[-" & rng.Columns.Count & "]:RC[-1])"
rng(1).Offset(CountR, -1) = s
rng.Offset(rng.Rows.Count, 0).Rows(1).FormulaR1C1 = "=" & s & "(R[-" & rng.Rows.Count & "]C:R[-1]C)"
End Sub
来看看代码执行的效果
我们需要先选择好计算的数值区域,既然是数据值区域,自然是不包含表头内容的,输入框中也有明确的说明
然后再来选择需要计算的方式,我们代码中提供了4种方法,如果后续实际工作中还需要增加或者删减的话,可以自行修改
看看结果
我们来用公式验证下我们的结果,都是正确的
函数需要至少选择两次的区域,同时还需要拖动单元格,写入函数公式,通过VBA 只需要选择一次即可
代码分析
乍一看,今天的代码好像有两个部分,是不是多写了一部分代码呢?
这是模块化的结构,虽然看来比较的长,但是每次调用方法的时候就更加的方便了。
Call cal(Nchoice, rng)
就是调用cal()这个方法的意思,大家后面写的代码如果比较多,有些重复性的动作就可以用这样的方法,类似于其他编程语言的类的效果
回到正题,选择单元格这一块就略过了,相信大家都非常的熟悉了,这里说下choose这个方法
其实这个方法在之前我们分享函数篇章的时候有讲述过这个函数的用法,他相当于一个选择器,第一个元素是数字,后面的几个元素就是一个数组,可以无限长
前面的数字是几,就将后面第几个元素抽调出来,本案例中,我们需要计算的加法,加法就是1,那么
Nchoice = Choose(choice, "SUM", "MAX", "MIN", "AVERAGE")'第一个元素是'SUM',所以返回的结果就是'SUM'
然后就到了CALL这里了,call之后,程序就是从TEST()这个脚本中,直接跳转到cal这个脚本中,同时还有两个参数,这两个参数和cal中的两个参数一定是一一对应的,顺序,位置都不能错!
然后我们就可以将上面代码中的Nchoise,rng这两个数据完整的带入到新的脚本中,做单独的操作
本案例中cal这段代码主要是用来执行计算的,如果后续要更改计算方法或者逻辑,只需要更改这一部分代码,而不用动上面这一部分TEST的代码
对于后续代码的更改有很大的帮助
为了区别数据源,我们这里将选择区域标记成为黄色
rng.Interior.Color = vbYellow
当然你可以更改为你自己喜欢的颜色
然后就是计算公式了,这里的计算公式其实就是我们手工输入公式的翻版,看看下图就了解了。
列的方向方法是一致的
===================================
好了,明晚21:00,准时再见!