Excel VBA工作薄 6.4番外篇 横列分别计算 vba和函数强强联手
前景提要
通过昨天的分享,大家对于行列分别计算的场景需求量还是挺大的,我的初衷也是满足大家的日常工作的需求,既然大家有相关方面的需求,关于msgbox这一系列的内容也比较的简单,趁着还有一点余温,我们就这个问题的方法告诉大家,希望能够满足那些有这个需求的人,其实方法很简单,就是之前学习过的基础知识的一个延伸和扩展运用。
场景模拟
假设这是我们的数据应用场景
我们希望得到每一行,每一列的单独计算,比方说我想要知道每个人的成绩的总和,同时我又想要知道每个学科的总分,这样的条件下就可以使用到今天这个场景了。
我们使用的方法是inputbox,因为涉及计算的内容不仅仅是加减乘除,我们这里采用公式的方式,VBA+EXCEL函数,强强联手
代码区
Sub TESY()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择要计算的单元格区域,仅数值区域,不含标头", "区域的确定", , , , , , 8)
chos = Application.InputBox("请选择计算方法" & Chr(13) & "1:求和" & Chr(13) & "2:求积" & Chr(13) & "3:求平均" & Chr(13) & "4:计数", "汇总方式", , , , , , 1)
choos = Choose(chos, "SUM", "PRODUCT", "AVERAGE", "COUNTA")
rng.Offset(0, rng.Columns.Count).Columns(1).Offset(-1, 0) = choos
rng.Offset(0, rng.Columns.Count).Columns(1).FormulaR1C1 = "=" & choos & "(RC[-" & rng.Columns.Count & "]:RC[-1])"
rng.Offset(rng.Rows.Count, 0).Rows(1).Offset(0, -1) = choos
rng.Offset(rng.Rows.Count, 0).Rows(1).FormulaR1C1 = "=" & choos & "(R[-" & rng.Rows.Count & "]C:R[-1]C)"
End Sub
来看看效果
先选择区域,这里已经明确说明,仅需要选择数值范围,不需要选择标头等内容
选择计算方式
这里我们选择求和来看看效果
每行进行了总分的求和,每列进行了单科所有人总分的求和,so nice
换种方式,我们来求下平均分
代码分析
chos = Application.InputBox("请选择计算方法" & Chr(13) & "1:求和" & Chr(13) & "2:求积" & Chr(13) & "3:求平均" & Chr(13) & "4:计数", "汇总方式", , , , , , 1)
这一句就是今天的关键代码所在了,本案例中,通过inputbox将输入框转变成用户交互窗体的模式,在输入框中,我们通过给予制定的选项,来让使用者进行选择,可以根据需要继续增减相应的选项,以期达到自己想要的效果。
相对于上节我们在程序中,通过简单的四则运算来进行计算,本节课的难度也是提升了一些,如果还是在代码中进行计算并得到结果,并不是不可以,但是有局限性
如果在后续的操作中,更改了数据区的数据,最终的结果并不会做出任何改变,因为我们已经在代码中写死了,而实际工作中可能是需要根据改变而变动的,所以这里我们引入了excel的函数,将excel自带的函数和VBA相结合,共同实现我们的效果。
那么在VBA中函数应该如何使用呢?其实就和excel本身函数的使用方法是一样的,比方说我们在求和的时候,看看公式
需要我们提供至少两个参数,并且都是单元格的路径,所以我们在VBA中也是一样的套路,提供两个参数,并且是单元格的路径
(RC[-" & rng.Columns.Count & "]:RC[-1])
实现的就是这样的效果,rng.Columns.Count代表的就是单元格的总列数,往左移动总列数,那就得到了第一列的位置,然后在一定往左移动一列就得到了最后一列的位置了
当然大前提就是我们将整个所选区域虚拟的移动了,怎么移动了呢,
rng.Offset(0, rng.Columns.Count)
所选区域向右移动了rng.Columns.Count列,大致是如下的效果
而使用中选择的方法,我们就可以通过之前学习过的choose方法来结合使用了