ExcelVBA7.37单⼯作薄跨⼯作表按类对指定列进⾏求和,vbaVSsum函数!
⼀起学习,⼀起进步~~
昨天我们分享了关于数据计算的第⼀篇,主要针对相同数据类进⾏求和,这种求和⽅法能够实现sum()函数⽆法实现的⽅法,我不是函数⾼⼿,理论上来说可能需要的公式也⽐较的长,今天我们继续分享数据计算⽅⾯的知识,我们今天要分享的是针对单列数据进⾏求和
在昨天分享的案例中,有⼩伙伴就表⽰在代码中从第2⾏开始还是从第3⾏开始,还是不太理解,并且如果在代码中写死了这个⾏数,对于代码的通⽤性并不好,所以本节我们将会更改这个问题,好了,我们开车~
场景简介
我们还是继续使⽤上节的案例
今天我们单独针对某⼀列的数据进⾏求和,毕竟有时候我们需要的数据仅仅是其中的部分数据⽽已
⽽且有时候leader更多关注的是重点数据,⽽不是全部数据,我上周做的⼀份数据就被领导打回来说是太乱了,所以可能我们更多时候还是需要针对部分数据进⾏分析
代码区
代码还是⽐较的简单,如果能够理解上节的内容的话,本节就很简单了,只是稍微做下修改
准确来说,本节是上节的简化版,如果⼤家还没有那个数组+字典的空间概念的话, 可以两节代码对⽐着来学习,调试,就能够慢慢到那个感觉了来看看代码执⾏的过程
为了增加代码的通⽤性和灵活性,我这⾥增加了对于表头区域的选择
Sub TEST()
Dim sth As Worksheet, trng As Range, lrng As Range, arr()
Set  zd = CreateObject("scripting.dictionary")
Set  trng = Application.InputBox("请选择表头区域", "表头区域的确定", , , , , , 8)
Set  lrng = Application.InputBox("请选择要计算的列区域", "计算区域的确定", , , , , , 8)
CountR = trng.Rows.Count
FirstL = trng.Column
SumL = lrng.Column
s = Cells(CountR, FirstL)
j = 0
For  Each  sth In  Worksheets
l = sth.Cells(Rows.Count, 1).End(xlUp).Row
For  i = CountR To  l
k = sth.Cells(i, 1)
If  zd.Exists(k) Then
If  k <> s Then
n = zd(k)
arr(2, n) = arr(2, n) + sth.Cells(i, SumL)
End  If
Else
j = j + 1
zd(k) = j
ReDim Preserve  arr(1 To  2, 1 To  j)
arr(1, j) = k
arr(2, j) = sth.Cells(i, SumL)
resize函数vbaEnd  If
Next  i
Next  sth
Worksheets.Add after :=Worksheets(Worksheets.Count)
Set  sthn = ActiveSheet
sthn.Name = "最终统计结果"
sthn.Cells(1, 1).Resize(UBound(arr, 2), UBound(arr)) = WorksheetFunction.Transpose(arr)
End  Sub
为了增加代码的通⽤性和灵活性,我这⾥增加了对于表头区域的选择
然后就是选择要计算的列
然后就是坐等结果了。
完全按照我们的需求将我们所需要的数据求和并且整理给我们汇总好了,其他的数据并没有出现在这份数据中
代码分析
代码的思维逻辑还是和上节是差不多的,还是利⽤字典+数组的⽅法
⾸先我们来看看增加的标头判断区域增加了哪些代码和作⽤
这⼏个代码主要是对于单元格操作判断的时候会使⽤到的,我打算在下⼀个系列再具体说下单元格的各种玩法,现在我们先了解下作⽤
注意两者写法的区别,⼀个是unt ,这⾥的rows 带着⼀个s ,
⽽Column 就是Column ,没有s 的
注意,这个FirstL 返回的结果是相对于整个⼯作表的,⽽不是trng 这个区域的,为了让⼤家更加清楚这个效果,我们将表头的区域改下
CountR = trng.Rows.Count
FirstL = trng.Column
SumL = lrng.Column
CountR = trng.Rows.Count'获得标头的总⾏数
FirstL = trng.Column'获得标头的第⼀列的列数
那么费尽⼼思得到这个区域有什么⽤处呢?
来继续往下⾛
这⾥有⼀个s 变量,他代表的就是标头的内容,上⾯的两个截图中可以看出来,他们对应的就是表头第⼀⾏的字段内容,在后⾯的循环中我们会⽤到
因为也有⼩伙伴表⽰上节的代码并没有⾃动加上标头,所以本节我们就加上表头,但是标头是不能参加运算的,否则这个结果就有点离谱了。所以这⾥我们会有这样⼀个判断
如果单元格的内容等于标头,就不在进⾏计算了,如果不等于,才会进⾏求和计算。
因为我们是针对某列进⾏求和的,所以数组只有两列,⼀列是姓名,另外⼀列就是成绩,我们需要的仅仅是对成绩进⾏计算,所以数组的结果也减少了很多
第⼀列等于姓名,就是k,第⼆列就等于语⽂成绩,具体到⼯作表中就是i ⾏,sumL 列。上⾯忘记说了,suml 得到的就是语⽂所在的列,第3列    If k <> s Then
n = zd(k)
arr(2, n) = arr(2, n) + sth.Cells(i, SumL)
End If
j = j + 1
zd(k) = j
ReDim Preserve arr(1 To 2, 1 To j)
arr(1, j) = k
arr(2, j) = sth.Cells(i, SumL)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。