3.3.2:SUM作为一般函数及聚合函数的应用

【分享成果,随喜正能量】我们很多道友没受过什么苦,或受不了一句话、一点气,总想悠悠自在成佛。或是念上几十部经就想换取什么,法宝是无价的!你拿有价来换,不但换不到,还丧失了功德。应当不退初心,遇到恶缘,把它看作考验,你能不能定得住? 人身难得,佛法难闻,百念千生,要坚固自己的信愿力,莫退信心。。

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。

如果您只是一般的职场VBA需求,可以打包选择7.1.3.9教程+汉英手册,第7套教程是入门,第1套教程是入门后的提高,第3套教程字典是必备的VBA之精华,第9套教程是实用的典型案例讲解。这四套教程内容掌握后足以处理一般工作中的问题,实际写代码的时候再辅助代码汉英手册,足矣!如果您想进一步提高,就需要选择高级阶段的教程了。

VBA是面向对象编程的语言,博大精深。很多朋友咨询VBA的学习方法,我会陆续给大家讲解一些我的经验,大家可以慢慢体会。今日的内容是:3.3.2:SUM作为一般函数及聚合函数的应用

3.3 学习提高过程中的思考(贯彻我的编程思想)

在学习过程中,我们要同时思考几个问题,这也是我们学习过程中的提高。

3.3.2:SUM作为一般函数及聚合函数的应用

VBA解决方案系列丛书中,我以实际场景模拟的方式讲解如何利用代码提高自己的工作效率,在现实工作中会面临很多实际问题,各种问题如何快速准确的解决是VBA的课题。VBA作为一种寄生语言,在OFFICE应用中起着非常重要的作用。

我们每一次的数据处理其实都是数据的组织和重新结合的过程,我称之为"重组",这是非常重要的概念,数据重组后可以发现我们需要了解的信息,进而实现管理的优化。这种数据重组过程就是实现数据自动化处理过程。

今日和大家要谈的是在实现数据自动化处理过程中一个常见函数SUM的价值。这个函数在工作表中应用非常广泛,可以说和EXCEL是共生关系,在VBA代码中直接利用或许少些,但在数据库中又体现了自己强大的生命力。

下面我们看看实例:本实例讲解利用了"VBA代码方案之十三:如何利用VBA在单元格中录入公式"的内容及VBA数据库解决方案中聚合函数及工作表连接的相关内容,就不再一一截图说明,今日只是就下面实例内容讲解:

实例,在工作表sheet1中有很多数据,杂乱无章,现在要求出每列数据的和,结果放在第二个工作表中,该如何解决?

今日我讲解两套方案,让大家看到SUM函数强大的生命力;

方案一:利用工作表函数解决

思路:我们在第二个工作中录入一个工作表函数,这个工作表函数要等于对应的第一个工作表列的总和,问题是如何能自动地计算出第一个工作表中有多少列,以及工作表函数在VBA中如何表示。下面看我给出的代码:

Sub MYNZ()

    Sheets("SHEET2").Select

    i = 1

    k = 1

    Range("a2:aa2").ClearContents

&nbsp;&nbsp;&nbsp;&nbsp;Do While Sheets("SHEET1").Cells(1, i) <> ""

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LL = Sheets("SHEET1").Cells(1, i).Address

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TT = Mid(LL, 2, Application.WorksheetFunction.Find("$", LL, 2) - 2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TT = TT & ":" & TT

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = k + 1

&nbsp;&nbsp;&nbsp;&nbsp;Loop

End Sub

代码解析:

1 上述代码实现了用VBA录入公式的方法,这个方法在《VBA代码解决方案》中有讲解了。

2 Do While Sheets("SHEET1").Cells(1, i) <> ""

LL = Sheets("SHEET1").Cells(1, i).Address

TT = Mid(LL, 2, Application.WorksheetFunction.Find("$", LL, 2) - 2)

TT = TT & ":" & TT

Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"

i = i + 1

k = k + 1

Loop

上述的循环语句实现了在第二个工作表中录入工作表函数的方法。其中LL = Sheets("SHEET1").Cells(1, i).Address 将获取单元格的地址,此地址是$a$1的格式。我们要从中提取出列的符号。

3 Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"

上述代码实现了公式的录入。此处的TT变量来自于上面的列的符号提取。

下面看代码的输出:

方案二:利用数据库的聚合函数来解决:

思路:利用数据聚合函数SUM来解决,这是数据库方案的内容,思路更加清晰。难点是对数据连接及SQL语句的写法,好在我希望大家能利用我提出的搭积木方法,代码语句尽可能不要去写,而是去复制和修改。

下面看我给出的代码:

Sub MYNZS()

&nbsp;&nbsp;&nbsp;&nbsp;Sheets("SHEET1").Select

&nbsp;&nbsp;&nbsp;&nbsp;Dim cnADO, rsADO, Z As Object

&nbsp;&nbsp;&nbsp;&nbsp;Dim strPath, strTable, strSQL As String

&nbsp;&nbsp;&nbsp;&nbsp;Set cnADO = CreateObject("ADODB.Connection")

&nbsp;&nbsp;&nbsp;&nbsp;strPath = ThisWorkbook.FullName

&nbsp;&nbsp;&nbsp;&nbsp;strTable = "[Sheet1$]"

&nbsp;&nbsp;&nbsp;&nbsp;i = 1

&nbsp;&nbsp;&nbsp;&nbsp;Do While Sheets("SHEET1").Cells(1, i) <> ""

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TT = TT & "sum(f" & i & "),"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1

&nbsp;&nbsp;&nbsp;&nbsp;Loop

&nbsp;&nbsp;&nbsp;&nbsp;TT = Left(TT, Len(TT) - 1)

&nbsp;&nbsp;&nbsp;&nbsp;'建立连接,提取数据

&nbsp;&nbsp;&nbsp;&nbsp;cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath

&nbsp;&nbsp;&nbsp;&nbsp;strSQL = "select " & TT & " from " & strTable

&nbsp;&nbsp;&nbsp;&nbsp;Set Z = cnADO.Execute(strSQL)

&nbsp;&nbsp;&nbsp;&nbsp;Sheets("SHEET2").Select

&nbsp;&nbsp;&nbsp;&nbsp;Range("a5:aa5").ClearContents

&nbsp;&nbsp;&nbsp;&nbsp;[a5].CopyFromRecordset Z

&nbsp;&nbsp;&nbsp;&nbsp;cnADO.Close

&nbsp;&nbsp;&nbsp;&nbsp;Set cnADO = Nothing

End Sub

代码解析:

1上述过程代码看似多些,但其实非常的清晰,利用一个循环完成列数的聚合函数的书写,然后利用SQL语句完成一个查询,直接的输出结果。

2 &nbsp;Do While Sheets("SHEET1").Cells(1, i) <> ""

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TT = TT & "sum(f" & i & "),"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1

&nbsp;&nbsp;&nbsp;&nbsp;Loop

&nbsp;&nbsp;&nbsp;&nbsp;TT = Left(TT, Len(TT) - 1)

上述代码是完成了聚合函数SUM的书写过程,不清楚的请查阅《VBA数据库解决方案》。

3 cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath

&nbsp;&nbsp;&nbsp;strSQL = "select " & TT & " from " & strTable

&nbsp;&nbsp;&nbsp;Set Z = cnADO.Execute(strSQL)

建立连接实现查询

4 &nbsp;[a5].CopyFromRecordset Z

提出数据。

下面看输出的结果:

两种方案借助于SUM函数得到了一样的结果,可见,SUM函数在数据的统计中,无论是EXCEL的工作表计算,还是VBA代码的利用,还是数据库的利用,都有着非常方便的实用性,我们要发掘其中的实用方法,好好利用。

备注:《VBA数据库解决方案》是教程的中级部分,此处是帮助初学人员能感受到VBA深入学习后的魅力。

ØSUM函数强大的生命力.xlsm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

相关推荐
Code哈哈笑6 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶10 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184412 分钟前
shell 编程(二)
开发语言·bash·shell
charlie11451419126 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满27 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99933 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361140 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法