乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > excel加减乘除-Excel VBA工作薄 6.4番外篇 行列分别计算 vba和函数强强联手

excel加减乘除-Excel VBA工作薄 6.4番外篇 行列分别计算 vba和函数强强联手

作者:乔山办公网日期:

返回目录:excel表格制作

前景提要()


通过昨天的分享,大家对于行列分别计算的场景需求量还是挺大的,小编的初衷也是满足大家的日常工作的需求,既然大家有相关方面的需求,关于msgbox这一系列的内容也比较的简单,趁着还有一点余温,我们就这个问题的方法告诉大家,希望能够满足那些有这个需求的人,其实方法很简单,就是之前学习过的基础知识的一个延伸和扩展运用。


场景模拟


假设这是我们的数据应用场景


我们希望得到每一行,每一列的单独计算,比方说我想要知道每个人的成绩的总和,同时我又想要知道每个学科的总分,这样的条件下就可以使用到今天这个场景了。


我们使用的方法就是inputbox,因为涉及计算的内容不仅仅是加减乘除,我们这里采用公式的方式,VBA+EXCEL函数,强强联手


代码区


Sub TESY()Dim rng As Range, a As RangeSet 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) = choosrng.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) = choosrng.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方法来结合使用了


=======================================================


今天和大家简单的分享下了在实际工作中, 经常碰到的需要横列分别计算的情况,很多童鞋可能会说我写公式更方便,但是公式只能适用于一种情况,如果明天我要求最大值,后天要求最小值,你就看需要不停的改公式,vba+函数的好处就是可以将整个过程都写好,在实际的运用中,通过选择的方式来让脚本执行不同的模块,非常的方便。


好了,明晚19:00,准时再见。


===============历史相关文章==============================


Excel VBA工作薄 6.1 设置个性化弹窗 提示更加醒目、温馨


Excel VBA工作薄 6.2利用msgbox窗口 实现简易用户对话功能


Excel VBA工作薄 6.3 多条件的对话窗体 让代码通用性更高


相关阅读

关键词不能为空
极力推荐
  • excel转pdf-Excel怎么存为PDF?Excel转PDF怎么转?

  • 虽然使用Excel整理数据非常方便,可如果数据量比较大的话,处理起来也是很大的工程。好不容易整理好的表格,要是在其他电脑上一打开就发生排版错乱,那可就让人头大了。-excel转

ppt怎么做_excel表格制作_office365_word文档_365办公网