VBA代码,从初学到精进的方法

论坛 期权论坛 期权     
VBA语言专家   2019-6-16 04:23   3061   0

点击上面蓝色字体关注公众号

就VBA的特点而言,他是一位合格的管理人员,特别是现场管理人员必备的知识和技能。一位中级及以上管理工作者,如果你不懂VBA,在某种程度上讲,你是不合格的,因为你没有办法从大量的数据中理顺出自己的思路,并根据自己的思路把数据和产品做成有效的连接。你只能接受其他人提供给你的资料,你还无法判断数据来源的可靠性。上述观点也是我二十多年来职场生涯的一点体会。
一 数据的重要性
“数据”是管理最基本的参考资料,要从各式各样的数据中提取出自己关注的部分,这是对于管理者必备的基本功,如何提取这些数据,有着各种办法,以我的经验,最为灵活和实用的要首选“VBA”.很多的年轻人,步入职场,如果不想混日子,如果想在自己的事业上有所突破,VBA确实是能尽快提高自己能力的一种有效的手段,其中的道理不再多说,你懂得。
"VBA代码解决方案"系列资料结集以来,和大量的朋友进行了交流,很多人都在说“我是新手,如何学习VBA”,其实每个人都有新手的经历,在这个平台上我把我学习VBA的历程与大家分享,把好的经验提供给大家,我初学VBA时,基本上还没有像样的书籍可以参考。能看到的只是前辈留下的代码,其中一个是复杂实例,可以实现上万种商品从库存到订单的匹配。那时,看着各种表格飞速的运转,我总是去琢磨:驱动运算的后台是什么样子呢?再后来,看的多了,用的多了,自己也就窥视了其中的奥秘。这位前辈现在已经做到了东软的副总,是非常成功的人士。当然个人事业的发展和多种因素有关系,我们只谈VBA。
二 初学之路的方法和实战
对于初学者,我提到过要弄懂每一块积木。我的每一讲可以单独的解决一类问题,在讲解中我也尽可能的深入,把需要的知识点讲透彻,这给初学者带来了很大的方便。我记得在我学习的时候为了弄懂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
  EndWith
End If
End Sub
把上述代码拷贝到VBE中,如截图:


运行:


好了,这节的内容就可以说是大体掌握了,但还没有完。
三 要在原代码的基础上活用。有了上述代码后,我要解决是不是反馈出颜色的变化,而是内容,如下需求:A和B列有型号和数量值;E列有型号,要根据E列的型号,求出数量的合计。
这时的代码该怎么写呢?这就要把上面的代码重新组织一下了。如下:
Sub mynzFindNext()
   Dim StrFind AsString  '声明变量利用StrFind作为要查找的值
    Dim Rng As Range
    Dim FindAddress AsString '声明变量利用FindAddress作为要查找的值的地址
    i = 2 '设置一个变量记录行数,但我没有声明
    WithSheet1.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 IsNothing Then    '如果不为空,记录下查到值的位置
       FindAddress =Rng.Address
       Do
     Cells(i, 6) =Cells(i, 6) + Cells(Rng.Row, 2) '在Cells(i, 6)中求和找到的数据

         Set Rng =.FindNext(Rng)   '再次查找
         Loop While NotRng Is Nothing And Rng.Address  FindAddress  '一直循环到刚才记录下的位置
     End If
  i = i + 1
  Loop
End With
End Sub


再看运行的截图:


完成了上述的洗礼,那么你就可以说是较为全面的掌握了这个查找的方法,同时你也获得了一块新的积木,把它保存起来,可以随时的利用。
四 一路收获,一路成熟。
对于每个积木要消化学习,多问为什么,代码往往有不完善的地方,这种不完善是根据实际需求而转变的,如上面的代码,我再次提出提出几个问题(或者是需求);如何处理?
1 如上面的例子如果Cells(Rng.Row, 2)不为数字该怎么处理呢?请读者思考?
2 如让代码执行完成后给予提示呢?
3 如果是两个工作表文件呢?如表1是基础数据,表2是需要查找的数据.也就是说上面的E\F列的内容在另外的工作表中,该如何处理?
4 如果数据是大量的该如何增加动态的效果呢?
等等,读者可以深入的思考。
当你遇到了不同的问题,解决它,逐渐你会收获很多,不仅是积木,还有你的成熟,对于真正管理岗位的理解。
                        
  
分享成果,随喜正能量

长按二维码  关注公众号


长按二维码  关注版主微信

标VBA加好友,获VBA积木信息




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP