VBA从初学到提高的方法(VBA学习方案系列讲座之38讲)
《如何学习VBA》这份资料,是我对初学人员学习方法的辅导,在其中,我讲到了很多有关VBA的学习方法及在教程中一些知识结构的补充说明。虽然是辅助教材,但也突出了我编程思想:积木编程;及我对于VBA的应用定义:VBA是实现个人小型数据自动化的有效工具(手段)。今日的内容是第38讲:从初学到精进的方法。
3.3.4 从初学到精进的方法
就VBA的特点而言,一位合格的管理人员,特别是现场管理人员,VBA是必备的知识和技能。一位中级及以上管理工作者,如果你不懂VBA,在某种程度上讲,你是不合格的,因为你没有办法从大量的数据中理顺出自己的思路,并根据自己的思路把数据和产品做有效的连接。你只能接受其他人提供给你的资料,还无法判断数据来源的可靠性。上述观点也是我二十多年来职场生涯的一点体会。
3.3.4.1 数据的重要性
“数据”是管理最基本的参考资料,要从各式各样的数据中提取出自己关注的部分,这是对于管理者必备的基本功,如何提取这些数据,有着各种办法,以我的经验,最为灵活和实用的要首选“VBA”。很多年轻人,步入职场,如果不想混日子,如果想在自己的事业上有所突破,VBA确实是能尽快提高自己能力的一种有效的手段,其中的道理不再多说,你懂得。
“VBA代码解决方案”系列资料结集以来,和大量的朋友进行了交流,很多人都在说“我是新手,如何学习VBA”,其实每个人都有新手的经历,在这个平台上我把我学习VBA的历程与大家分享,把好的经验提供给大家。
我初学VBA时,基本上还没有像样的书籍可以参考。能看到的只是前辈留下的代码,其中一个是复杂实例,可以实现上万种商品从库存到订单的匹配。那时,看着各种表格飞速地运转,我总是去琢磨:驱动运算的后台是什么样子呢?再后来,看的多了,用的多了,自己也就窥视了其中的奥秘。这位前辈现在已经做到了东软的副总,是非常成功的人士。当然个人事业的发展和多种因素有关系,我们只谈VBA。
3.3.4.2 初学之路的方法和实战
对于初学者,我提到过要弄懂每一块积木。我的每一讲可以单独地解决一类问题,在讲解中我也尽可能地深入,把需要的知识点讲透彻,这给初学者带来了很大的方便。我记得在我学习的时候为了弄懂with的含义,就花费了很大的气力。所以为了避免朋友们和我初学时一样,我在每一讲的讲解时会照顾到方方面面。我在创作这系列的文章时定位的是广大职场人员,让这类人收益,要注意,在学习时要结合实际问题,动手去解决。在“VBA代码解决方案”一书的实例中,很多是工作中经常遇到的例子,我特意写出来给大家参考。可以结合自己感兴趣的章节先弄懂代码的含义,然后再扩展其他的章节。要循序渐进,不可贪多。每个知识点都是要理解的。学以致用,希望大家能有所结合的去学习,学习的目的是应用,不要为学习而学习。
下面我就一个实例给大家分析:
查找是我们工作中经常用到的,但用VLOOKUP确实不方便,怎么办?打开我的"VBA代码解决方案"第一册,目录中第七讲:
我们拷贝出代码:并加以整理一下,为了大家理解,我做注释了,这也是大家要掌握的内容
Sub myFindNext()
Dim StrFind As String "声明变量利用StrFind作为要查找的值
Dim Rng As Range
Dim FindAddress As String "声明变量利用FindAddress作为要查找的值的地址
StrFind = InputBox("请输入要查找的值:")
If Trim(StrFind) <> "" Then "如果输入的值不为空才去查找
With Sheet1.Range("A:A") "给出的范围
"进行查找的的设置
Set Rng = .Find(What:=StrFind, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then "如果不为空,记录下查到值的位置
FindAddress = Rng.Address
Do
Rng.Interior.ColorIndex = 6 "将查到的单元格颜色自定义
Set Rng = .FindNext(Rng) "再次查找
Loop While Not Rng Is Nothing And Rng.Address <> FindAddress "一直循环到刚才记录下的位置
End If
End With
End If
End Sub
把上述代码拷贝到VBE中,如截图:
运行:
好了,这节的内容就可以说是大体掌握了,但还没有完。
3.3.4.3 要在原代码的基础上活用
有了上述代码后,我要解决的不是反馈出颜色的变化,而是内容,如下需求:A和B列有型号和数量值;E列有型号,要根据E列的型号,求出数量的合计。
这时的代码该怎么写呢?这就要把上面的代码重新组织一下了。如下:
Sub mynzFindNext()
Dim StrFind As String "声明变量利用StrFind作为要查找的值
Dim Rng As Range
Dim FindAddress As String "声明变量利用FindAddress作为要查找的值的地址
i = 2 "设置一个变量记录行数,但我没有声明
With Sheet1.Range("A:A") "给出的范围
Do While Cells(i, 5) <> ""
StrFind = Cells(i, 5) "这时的查找值就是Cells(i, 5)的数据了
Cells(i, 6) = "" "要记录数据的单元格清空
Set Rng = Nothing
"进行查找的的设置
Set Rng = .Find(What:=StrFind, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then "如果不为空,记录下查到值的位置
FindAddress = Rng.Address
Do
Cells(i, 6) = Cells(i, 6) + Cells(Rng.Row, 2) "在Cells(i, 6)中求和找到的数据
Set Rng = .FindNext(Rng) "再次查找
Loop While Not Rng Is Nothing And Rng.Address <> FindAddress "一直循环到刚才记录下的位置
End If
i = i + 1
Loop
End With
End Sub
再看运行的截图:
完成了上述的洗礼,那么你就可以说是较为全面地掌握了这个查找的方法,同时你也获得了一块新的积木,把它保存起来,可以随时的利用。
3.3.4.4 一路收获,一路成熟
对于每个积木要消化学习,多问为什么,代码往往有不完善的地方,这种不完善是根据实际需求而转变的,如上面的代码,我再次提出几个问题(或者是需求),如何处理?
1 如上面的例子,如果Cells(Rng.Row, 2)不为数字该怎么处理呢?请读者思考?
2 如让代码执行完成后给予提示呢?
3 如果是两个工作表文件呢?如表1是基础数据,表2是需要查找的数据。也就是说上面的E\F列的内容在另外的工作表中,该如何处理?
4 如果数据是大量的该如何增加动态的效果呢?
等等,读者可以深入地思考。
当你遇到了不同的问题,解决它,逐渐地你的收获会越来越多,不仅是积木,还有你的成熟,对于真正管理岗位的理解。
第7套教程:VBA之EXCEL应用
第1套教程:VBA代码解决方案
【第4套教程:VBA代码解决方案之视频(第一套的视频讲解)】
第3套教程:VBA数组与字典解决方案
第2套教程:VBA数据库解决方案
第6套教程:VBA信息获取与处理
第5套教程:VBA中类的解读和利用
第8套教程:VBA之Word应用(2021年4月底推出)
上述教程的学习顺序:
① 7→1→3→2→6→5或者7→4→3→2→6→5。
② 7→8
- 如何学习VBA呢? 概括的说就是: 学习过程中要信、解、受、持,更要有回向的业力。无论您在学习的任何阶段,都要对照教程的知识点加持自己的实际工作,总会有丰厚的收获。
- 教程学习顺序是7,1(或4),3,2,6,5。第7套《VBA之Excel应用》是对VBA基本的讲解;第1(或4)套《VBA代码解决方案》是《VBA之Excel应用》的提高;第3套《VBA数组与字典解决方案》是VBA应用的专题讲解,教程中讲解的专题是数组和字典,大家会在这套教程中看到非常全面的数组与字典的应用;第2套《VBA数据库解决方案》也是VBA应用的专题讲解,教程讲解的专题是数据库,大家会在这套教程中看到VBA连接Excel与accdb的全面应用;第6套《VBA信息获取与处理》是整个VBA应用的提高;第5套《VBA中类的解读及应用》是VBA的最高理论“类”“接口技术”的讲解。第8套教程《VBA之Word应用》需要在第7套教程之后学习。
- 如果说《VBA之EXCEL应用》是大家认识VBA的阶段,那么《VBA代码解决方案》就要求大家能理解VBA,理解我推出的“积木编程”思想,理解我对VBA应用的定义:VBA是实现个人小型数据自动化的有效工具(手段)。
下一篇:10分钟学会学VBA