如何学习VBA:换一种思路思考问题,利用数据库实现数据处理自动化
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。
如果您只是一般的职场VBA需求,可以打包选择7.1.3.9教程+汉英手册,第7套教程是入门,第1套教程是入门后的提高,第3套教程字典是必备的VBA之精华,第9套教程是实用的典型案例讲解。这四套教程内容掌握后足以处理一般工作中的问题,实际写代码的时候再辅助代码汉英手册,足矣!如果您想进一步提高,就需要选择高级阶段的教程了。
VBA是面向对象编程的语言,博大精深。很多朋友咨询VBA的学习方法,我会陆续给大家讲解一些我的经验,大家可以慢慢体会。今日的内容是如何学习VBA_3.3.8:换一种思路思考问题,利用数据库实现数据处理自动化
【分享成果,随喜正能量】261 安住当下,用心生活,每一个日子都是幸福的起点。不负时光,不负自己,不枉此生!最好的修行,用心甘情愿的态度,过随遇而安的生活,怀有一颗慈悲、感恩的心灵,修行的路上,处处都吉祥。!
3.3.8 换一种思路思考问题,利用数据库实现数据处理自动化
很多朋友都在按照我的教程逐步提高自己的能力,这些教程实用性极强,没有任何的拖泥带水,为什么呢?这是和教程的定位相关的,我的教程定位于广大职场人员。如我自己,在职场的实际工作中,利用了20多年VBA,初学时,那种艰辛不是一个“难”字所能描述的,有时候去和人请教一个问题,人家根本就不理我,整整一周都在追着人家问……是啊,有谁肯把自己的经验轻易地告诉外人呢?现在,我不想让初学者如我当年那样。只要你来到我这个学习平台,肯于学习,有志于VBA,总会让你有所收获,我会把好的经验无保留地分享给有需要的朋友。
这系列教程中我会模拟各种实际工作的场景,去解决问题,并提供给大家源代码,如果你有时间,可以细细地理解;如果你没有时间,你只要拿来,拿来这些积木组合一下,修改一下构成你的实际场景。
在这系列教程中,《VBA代码解决方案》是面向初级和中级人员的教程,书中对于VBA涉及到的各个知识点均作了讲解,是利用代码来解决实际问题的基本教程,从中大家可以收获颇丰,利用了VBA,你之前用手工处理的数据可以借助于代码瞬间完成。例如:对于某位药店的销售人员,自己负责的药品需要根据上月销售的数据,计算出下个月的需求,以便订货,如果手工处理,药品的型号如果少还可以,假如涉及到几百种,工作量是非常大,即使你能够计算出来,往往还要担心数据的准确性,怎么办?VBA绝对是你工作的好帮手。下面的解决方案中,我会给出代码的解决方案。
《VBA数据库方案》是面向中级及以上人员书籍,是数据处理的专业教材。书中,你会看到各种数据的处理方案,会感受到ADO连接给我们工作带来的方便,这里面的思路是在代码方案上的提高,要求读者有效地理解记录集的概念,并用SQL语句来操作它,同时要理解内连接,左外连接,右连接等各种连接方式的特点和实际的应用范围。
还是以上面的例子做我测试的数据,来证明VBA之强大,如下面的数据:
在7月份的实际销售数据中,有各种型号的销量、金额、余数,要在7月份数据的基础上求出9月的采购预计,就是7月的销售总量减去库存的总量,由于7月的数据是不同的人员报上来的不同数据,要进行排重处理。
下面我讲解一下解决方案:
方案一,我们先利用VBA代码方案的知识来解决,只用代码进行数据的比较计算:
Sub MYNZ()
i = 3
Worksheets("Sheet1").Select
Range("F3:J" & Range("A3").End(4).Row).ClearContents
Do While Cells(i, 1) <> ""
K = 3
Do While Cells(K, "f") <> ""
If Cells(K, "f") = Cells(i, 1) Then
Cells(K, "g") = Cells(K, "g") + Cells(i, 2)
Cells(K, "h") = Cells(K, "h") + Cells(i, 4)
Cells(K, "i") = Cells(K, "i") + Cells(i, 3)
Cells(K, "j") = Cells(K, "g") - Cells(K, "h")
GoTo 100
End If
K = K + 1
Loop
Cells(K, "f") = Cells(i, 1)
Cells(K, "g") = Cells(i, 2)
Cells(K, "h") = Cells(i, 4)
Cells(K, "i") = Cells(i, 3)
Cells(K, "j") = Cells(K, "g") - Cells(K, "h")
100:
i = i + 1
Loop
End Sub
代码解释:
上述代码在运行过程中先是在7月销售中进行一个循环,然后在9月预测中进行一个查找,如果可以查到,那么就累加要统计的数据,如果没有查找到,那么就添加数据。
运行后很快就可以得出结论:
非常之快,根本不是手工处理可以比拟的,而且只要逻辑关系正确,不必担心数据的准确性,上面的数据我只是简单的列举了30个,如果是上万条数据呢?VBA当然可以处理,但手工处理是不可能的了。
本文的题目是《换一种思路思考问题,利用小型的数据库实现数据处理自动化》,上面的方案只是解决方案的一种,是我们认识VBA后,起码可以利用的方案。下面我继续提供解决的提高方案。
方案二,利用VBA数据库解决方案的知识来解决,建立连接,当你对代码的理解逐步深入后,就是自己水平提高阶段了,要刷新自己的知识,上面的问题就可以利用数据库了。数据库是数据处理的专业工具,在数据处理上非常灵活,但要求我们的水平要有所提高,
我们看下面的代码:
Sub mynzdate()
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Worksheets("Sheet1").Select
Range("F3:J" & Range("A3").End(4).Row).ClearContents
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.FullName
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 12.0;hdr=yes;imex=1';data source=" & strPath
strTable = "[sheet1$a2:d30]"
strSQL = "SELECT 品名,SUM(销量),SUM(余数) as 剩余,SUM(金额) as 上月的金额,SUM(销量)-SUM(余数) FROM " & strTable & " GROUP BY 品名"
rsADO.Open strSQL, cnADO, 1, 3
Range("F3").CopyFromRecordset rsADO
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
上述代码利用ADO连接到7月的销售,然后利用聚合函数完成了数据的处理,最后Range("F3").CopyFromRecordset rsADO 来输出数据。
输出的结果和上面的图一样:
上述两个方案,前者是利用代码直接比较完成的,代码易懂,是拥有VBA知识后很容易实现的,后者是通过数据库的聚合函数来实现的,在理论上后者对于数据的处理更加直接,特别是数据量庞大的时候,利用后者更是首选。
当我们的知识有所提高,就可以换一种思路解决问题,在实际的工作中,很多数据处理方面的问题可以用数据库来直接完成,这对于我们实现小型数据的办公自动化非常重要,也非常的专业。
小型数据库在我们的工作中可以起到非常重要的作用,当然,VBA要有自己的定位,不能和跑MRP的大型数据处理运算比较,要发挥自己的优点,那就是灵活,可以根据自己的需求而随意改变,如上面的要求提供的数据中,要增加一个平均单价,马上修正代码即可完成。
当然,如果你刚刚接触到VBA还是要先入门学习第七套教程后,在学习第一套《VBA代码解决方案》的提高内容,这些是基本,第一套教程中147讲内容可以验证绝大多数的VBA知识点,有大量的实例让你参考。当你对这些有了初步的认识后就可以学习《VBA数据库解决方案》了。在84讲内容中,你会欣赏到各种数据处理的专业方案,是我们工作中处理数据的专业工具。
那么,是不是有了上述的方案就可以了呢?当然不是,下面还有更加巧妙的方案,在我的VBA解决方案系列丛书的第三套教材中推出。
- 换一种思路.xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: