分享

为啥要用VBA?因为我懒啊

 作死到底 2018-07-27

        开头先要说明一下,本人非码农,非办公室文职,所以代码和excel应用水平极其低下,有错误的话各位轻喷。。。
        本人使用VBA的时间其实非常短,从第一次用到现在貌似也就半年多吧。之前不要说VBA,就算是excel也是一年用不了几次。也正因为excel用得少,使得我对它的各项功能几乎是一无所知,常用的也就是复制、黏贴、搜索、筛选、排序以及求和,什么vlookup、数据透视表,听都没听过,更别说用了。有一次正巧需要分析一个50万条的数据,而且这样数据一天就可能会产生十几份,以我本身那孱弱的excel知识简直就是一个不可能完成的任务,纠结了半天最终还是决定用VBA解决,最后花了两天的时间搞定了这个表格,点击一下按钮数据立马就自动处理完毕,以后再也不用慢慢算了,对我这种懒人再适合不过 ,自此一有想不开就会用VBA来解决。
         之前看到有位值友写了一篇怎么用excel抢压寨夫人,我用力学了学,没学会。转念一想,定位这个功能还是挺常用的,要是下次遇到类似的问题咋办?还是自己写一个放着以防万一,到时候复制黏贴改一下就可以了。
         先来看看效果如何:

为啥要用VBA?因为我懒啊

         只要输入想搜索的城市名以及月份,点击按钮,即可直接显示出相对应的数字,是不是感觉很方便?不仅用起来方便,得益于VBA本身的函数,代码量很少,30行不到就可以完成以上操作,如果换成在excel里的操作,就三种,“ctrl+→”、“ctrl+↓”和“ctrl+f”。嗯,就这三个,简单吧~~~下面让我们看看怎么只用这三个操作完成这个定位的。

         首先我们要先进入excel设计模式,来添加所需控件,点击开发工具——设计模式——插入,即可选择所需插入的控件,在控件上悬停可看到该控件名称。

为啥要用VBA?因为我懒啊

       我在这里用了四个控件,分别是两个文本框,一个按钮以及一个标签。文本框用来输入需要搜索的字条。按钮是主程序所在,点击后即开始搜索。标签是显示结果,当然也可以直接在excel的某个单元格中显示。

为啥要用VBA?因为我懒啊

        双击任意控件即可进入代码界面,由于程序运行是基于按钮被点击,所以双击按钮控件进入代码界面,这样就可以直接对按钮点击这个动作进行编程。用过VB6的同学应该很熟悉这个界面。这个界面中有三个窗口,除了代码窗口外,在这个程序中我修改了CommandButton1的caption属性,这个属性其实对应的就是在按钮上显示什么字,在这里我改成了搜索。

为啥要用VBA?因为我懒啊

为啥要用VBA?因为我懒啊

        完成了以上操作,接下来就可以写程序了,程序其实和烧菜的菜谱差不多,变量就是各种食材调味料,代码就是烧菜的步骤。

Dim row_count_sht1 As Long
Dim item_info As Range
Dim city_str, clm_max_sht1, mon_adr As String

       这三行Dim开头的代码是声明变量。这是什么意思呢?我们可以把long看作是一个大药箱,这里面就只能放药,而不能放其他东西,第三行的string看作是个饭盒,那这里只能放饭菜,差不多就是这个意思。dim后面跟着的那些就是变量的名称,第一行的意思就是有一个叫row_count_sht1的大药箱,变量的名称可以自己定,除了一些特殊字符之外其他都可以用。具体long和string的含义各位可以自己去百度,这个还是很容易理解的。

定义好了需要用的变量,接下来就可以写程序了,也就是怎么烧菜。

clm_max_sht1 =Worksheets("Sheet1").Range("A1").End(xlToRight).Address
这个操作其实就是ctrl+→,在sheet1中找到最右侧有效单元格,并把该单元格的地址放入clm_max_sht1中。

clm_max_sht1 =Mid(clm_max_sht1, 2, 1)
由于取到的地址是$E$1,而我们想要的仅仅是列号E而已,所以我们要用字符串操作函数把中间的E提取出来备用。

row_count_sht1 =Worksheets("Sheet1").Range("A1").End(xlDown).Row
这个操作是ctrl+↓,找到最下面的单元格,但这个比上面要方便的地方在于直接可以获取行号,不需要再用字符串操作来提取数字。

Set item_info =Worksheets("Sheet1").Range("A1:A" &row_count_sht1 & "").Find(What:=TextBox1.Value,After:=Range("A1"), LookIn:=xlFormulas, _

            LookAt:=xlWhole,SearchOrder:=xlByColumns, SearchDirection:=xlNext, _

            MatchCase:=False, MatchByte:=False,SearchFormat:=False)
这一长串是ctrl+f搜索,意思差不多就是搜索整个A列的有效单元格,寻找与文本框中一致的那个单元格

If item_info IsNothing Then

    MsgBox "未找到" &TextBox1.Value
    上面两行就是判断语句,如果没找到的话就显示没有找到这个东西

Else
其他情况就执行以下步骤

    city_str = item_info.Address
    提取出在A列中搜索到的单元格的地址,此处提取到的是$A$4

    city_str = Right(city_str, Len(city_str) -3)
        将该地址的列号,也就是把4提取出来,这样列方向的搜索就完成了,下面用同样的方式搜索行方向。

    Setitem_info = Worksheets("Sheet1").Range("A1:" &clm_max_sht1 & "1").Find(What:=TextBox2.Value,After:=Range("A1"), LookIn:=xlFormulas, _

                LookAt:=xlWhole,SearchOrder:=xlByColumns, SearchDirection:=xlNext, _

                MatchCase:=False,MatchByte:=False, SearchFormat:=False)

    If item_info Is Nothing Then

        MsgBox "未找到" &TextBox2.Value

    Else

        mon_adr = item_info.Address

        mon_adr = Mid(mon_adr, 2, 1)
        由于行方向我们只要字母,所以我们将行方向搜索到的单元格地址的字母提取出来,这里找到的是C。到这行为止,所有的搜索都已经结束,接下来只要将C4单元格的值填入标签就大功告成了。

        Label4.Caption =Worksheets("Sheet1").Range("" & mon_adr &"" & city_str & "").Value
        这行就是把之前找到的C和4拼起来,告诉电脑把C4的值放到Label4.Caption中,这样整个程序就完成了。

        Worksheets("Sheet1").Range(""& mon_adr & "" & city_str & "").CopyRange("J6")
        当然我们也可以不用标签Label4. Caption来显示,而是直接用上面的代码把C4的值复制黏贴到J6单元格或者其他单元格中显示。

    End If

End If

        以上就是这个程序所有的内容了,是不是很简单很方便?不需要去学习很多的excel使用方法,只要有最基本的excel操作思路,就可以完成繁杂的操作,这样就不用再去记那些函数了,果然懒才是人类进步的原动力啊~~~

        不过话说回来,VBA也并不是什么情况都适合,像上面那个程序虽然简单,但也需要大概十几分钟来完成,如果仅仅是偶尔用到某个功能,而且不会花费太多时间的情况下我建议还是手动做做算了,毕竟花十几甚至几十分钟写一个手动几分钟就能完成的东西,怎么看都不符合懒这个标准的说~~~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多