【分享成果,随喜正能量】我们很多道友没受过什么苦,或受不了一句话、一点气,总想悠悠自在成佛。或是念上几十部经就想换取什么,法宝是无价的!你拿有价来换,不但换不到,还丧失了功德。应当不退初心,遇到恶缘,把它看作考验,你能不能定得住? 人身难得,佛法难闻,百念千生,要坚固自己的信愿力,莫退信心。。
我给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
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
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()
Sheets("SHEET1").Select
Dim cnADO, rsADO, Z As Object
Dim strPath, strTable, strSQL As String
Set cnADO = CreateObject("ADODB.Connection")
strPath = ThisWorkbook.FullName
strTable = "[Sheet1$]"
i = 1
Do While Sheets("SHEET1").Cells(1, i) <> ""
TT = TT & "sum(f" & i & "),"
i = i + 1
Loop
TT = Left(TT, Len(TT) - 1)
'建立连接,提取数据
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath
strSQL = "select " & TT & " from " & strTable
Set Z = cnADO.Execute(strSQL)
Sheets("SHEET2").Select
Range("a5:aa5").ClearContents
[a5].CopyFromRecordset Z
cnADO.Close
Set cnADO = Nothing
End Sub
代码解析:
1上述过程代码看似多些,但其实非常的清晰,利用一个循环完成列数的聚合函数的书写,然后利用SQL语句完成一个查询,直接的输出结果。
2 Do While Sheets("SHEET1").Cells(1, i) <> ""
TT = TT & "sum(f" & i & "),"
i = i + 1
Loop
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
strSQL = "select " & TT & " from " & strTable
Set Z = cnADO.Execute(strSQL)
建立连接实现查询
4 [a5].CopyFromRecordset Z
提出数据。
下面看输出的结果:
两种方案借助于SUM函数得到了一样的结果,可见,SUM函数在数据的统计中,无论是EXCEL的工作表计算,还是VBA代码的利用,还是数据库的利用,都有着非常方便的实用性,我们要发掘其中的实用方法,好好利用。
备注:《VBA数据库解决方案》是教程的中级部分,此处是帮助初学人员能感受到VBA深入学习后的魅力。
ØSUM函数强大的生命力.xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: