前景提要(文末提供源码下载)
昨天我们分享了关于数据计算的第一篇,主要针对相同数据类进行求和,这种求和方法能够实现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)
End 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
来看看代码执行的过程
为了增加代码的通用性和灵活性,我这里增加了对于表头区域的选择
然后就是选择要计算的列
然后就是坐等结果了。
完全按照我们的需求将我们所需要的数据求和并且整理给我们汇总好了,其他的数据并没有出现在这份数据中
代码分析
代码的思维逻辑还是和上节是差不多的,还是利用字典+数组的方法
首先我们来看看增加的标头判断区域增加了那些代码和作用
CountR = trng.Rows.Count
FirstL = trng.Column
SumL = lrng.Column
这几个代码主要是对于单元格操作判断的时候会使用到的,我打算在下一个系列再具体说下单元格的各种玩法,现在我们先了解下作用
CountR = trng.Rows.Count'获得标头的总行数
FirstL = trng.Column'获得标头的第一列的列数
注意两者写法的区别,一个是rows.count,这里的rows带着一个s,
而Column就是Column,没有s的
注意,这个FirstL返回的结果是相对于整个工作表的,而不是trng这个区域的,为了让大家更加清楚这个效果,我们将表头的区域改下
那么费尽心思得到这个区域有什么用处呢?
来继续往下走
这里有一个s变量,他代表的就是标头的内容,上面的两个截图中可以看出来,他们对应的就是表头第一行的字段内容,在后面的循环中我们会用到
因为也有小伙伴表示上节的代码并没有自动加上标头,所以本节我们就加上表头,但是标头是不能参加运算的,否则这个结果就有点离谱了。所以这里我们会有这样一个判断
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)
因为我们是针对某列进行求和的,所以数组只有两列,一列是姓名,另外一列就是成绩,我们需要的仅仅是对成绩进行计算,所以数组的结果也减少了很多
第一列等于姓名,就是k,第二列就等于语文成绩,具体到工作表中就是i行,sumL列。上面忘记说了,suml得到的就是语文所在的列,第3列
后面就是数据的批量写入了,相信小伙伴们看了我这么多文章分享之后,应该已经非常熟悉这种写法了。
=======================================================
本节课的案 例源 码已经 上传,需要的 小伙 伴们 后台 私信“7-37-6”,希望大家 多支 持~~,多多关注!
好了~明晚19:00,准时再见!
留言与评论(共有 0 条评论) |