为啥要用VBA?因为我懒啊

2018-07-04 07:01:29 187点赞 2469收藏 75评论

开头先要说明一下,本人非码农,非办公室文职,所以代码和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也并不是什么情况都适合,像上面那个程序虽然简单,但也需要大概十几分钟来完成,如果仅仅是偶尔用到某个功能,而且不会花费太多时间的情况下我建议还是手动做做算了,毕竟花十几甚至几十分钟写一个手动几分钟就能完成的东西,怎么看都不符合懒这个标准的说~~~

展开 收起
75评论

  • 精彩
  • 最新
  • 对于一个连excel公式都不想完的人 居然还有心情去玩VBA........佩服!

    校验提示文案

    提交
    vba最简单的几个函数就可以完成复杂公式才能完成的工作,请问我有什么理由浪费时间去学公式呢?

    校验提示文案

    提交
    收起所有回复
  • 太长不看,救急的就不建议用了。有的基础概念一定要学习下,不然随便写了个代码有bug,你就查不出来了。然后凉凉,虽说vba在大神眼里是渣渣语言,但是学的好了,也可以有能力做做优化,提高运行效率。

    校验提示文案

    提交
    我这个也有bug。。。当列号超过Z就会有两个字母。。。这时候就会有问题。。。

    校验提示文案

    提交
    改为用.co lumn提取列数,之后用cell(row,column)的格式写单元格的地址

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • 毫无基础的我当年用vba都是录个宏,跟着学的

    校验提示文案

    提交
    宏展示的很多函数不好用。。。比如复制粘帖。。。

    校验提示文案

    提交
    收起所有回复
  • 感谢楼主让我乖乖回去学Excel表格

    校验提示文案

    提交
    感觉学vb比学excel简单多了

    校验提示文案

    提交
    收起所有回复
  • 隔段时间会搞一次,用上确实会提升效率,但是有些点确实不好控制,与预期有差异

    校验提示文案

    提交
    效率提升不明显还是手动操作算了。。。如果是要做几天重复劳动的话明显是写vba舒服很多

    校验提示文案

    提交
    收起所有回复
  • 建议楼主花一天学公式 第二天再找VBA

    校验提示文案

    提交
    感觉公式对于像文中这样简单通用的还行,如果复杂些是不是也能做呢?

    校验提示文案

    提交
    简单东西我主张简单做 所以我建议循序渐进 由最方便的开始 了解到各种办法的难易程度和局限性再根据问题选择

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 感谢作者,想问下,wps的表格能通用麽,单位全换成wps了,快蛋疼死了。

    校验提示文案

    提交
    wps貌似要装vba模块

    校验提示文案

    提交
    收起所有回复
  • 对于公式就能解决的问题,尽量别去写VBA,那是跟自己过不去!

    校验提示文案

    提交
    像我这种一年用不了几次excel的人,浪费时间去学公式这才是和自己过不去。。。

    校验提示文案

    提交
    收起所有回复
  • 还是太复杂了,最简单的方法就是
    小张啊,下班之前把结果放我桌上

    校验提示文案

    提交
  • vlookup函数超级好用啊,我excel唯一会用的函数

    校验提示文案

    提交
    这个函数实现了我的办公半自动化。 [喜极而泣]

    校验提示文案

    提交
    收起所有回复
  • 为了懒而更麻烦

    校验提示文案

    提交
  • 看不懂的路过一下~

    校验提示文案

    提交
  • 如果Excel函数和数据透视功能用不好,写代码就比较傻的做法

    校验提示文案

    提交
  • 掌握vba需要一定vc或vb知识,不然不会编写这样程序代码

    校验提示文案

    提交
  • 我平时用的最多的vba场景是把下发过来的excel数据,比如调查问卷,还原到Word文档,每条数据对应生成一个文档,还要自动插入图片。几万条数据生成文档要跑几个小时,但是比手动还原简直快太多。还有就是请求api从服务端拉报表到excel,然后汇总,或者格式化打印。vba这么古老的脚本语言,网上有大量的现场代码可以用,很多需求都不需要自己写。

    校验提示文案

    提交
  • 看不懂的路过

    校验提示文案

    提交
  • 让我回忆起N年前在日本3个月帮东芝在excel里面用vba写了一个多窗口winform程序,甚至还用到了递归 [喜极而泣] 。一个人语言也不通,还被中国人的主管欺负,只能英文和一个留学过的日本人(那个中国人的上级)交流,还告他状,哈哈哈 [喜极而泣]

    校验提示文案

    提交
  • 当年一直用excel和vba做工厂模型。。。。

    校验提示文案

    提交
  • 我只会basica [喜极而泣]

    校验提示文案

    提交
    和basic一家人,基本一样的

    校验提示文案

    提交
    收起所有回复
  • 。。。完全看不懂 我还是看看excel大全吧

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
2.4K
扫一下,分享更方便,购买更轻松