为啥要用VBA?因为我懒啊
开头先要说明一下,本人非码农,非办公室文职,所以代码和excel应用水平极其低下,有错误的话各位轻喷。。。
本人使用VBA的时间其实非常短,从第一次用到现在貌似也就半年多吧。之前不要说VBA,就算是excel也是一年用不了几次。也正因为excel用得少,使得我对它的各项功能几乎是一无所知,常用的也就是复制、黏贴、搜索、筛选、排序以及求和,什么vlookup、数据透视表,听都没听过,更别说用了。有一次正巧需要分析一个50万条的数据,而且这样数据一天就可能会产生十几份,以我本身那孱弱的excel知识简直就是一个不可能完成的任务,纠结了半天最终还是决定用VBA解决,最后花了两天的时间搞定了这个表格,点击一下按钮数据立马就自动处理完毕,以后再也不用慢慢算了,对我这种懒人再适合不过 ,自此一有想不开就会用VBA来解决。
之前看到有位值友写了一篇怎么用excel抢压寨夫人,我用力学了学,没学会。转念一想,定位这个功能还是挺常用的,要是下次遇到类似的问题咋办?还是自己写一个放着以防万一,到时候复制黏贴改一下就可以了。
先来看看效果如何:
只要输入想搜索的城市名以及月份,点击按钮,即可直接显示出相对应的数字,是不是感觉很方便?不仅用起来方便,得益于VBA本身的函数,代码量很少,30行不到就可以完成以上操作,如果换成在excel里的操作,就三种,“ctrl+→”、“ctrl+↓”和“ctrl+f”。嗯,就这三个,简单吧~~~下面让我们看看怎么只用这三个操作完成这个定位的。
首先我们要先进入excel设计模式,来添加所需控件,点击开发工具——设计模式——插入,即可选择所需插入的控件,在控件上悬停可看到该控件名称。
我在这里用了四个控件,分别是两个文本框,一个按钮以及一个标签。文本框用来输入需要搜索的字条。按钮是主程序所在,点击后即开始搜索。标签是显示结果,当然也可以直接在excel的某个单元格中显示。
双击任意控件即可进入代码界面,由于程序运行是基于按钮被点击,所以双击按钮控件进入代码界面,这样就可以直接对按钮点击这个动作进行编程。用过VB6的同学应该很熟悉这个界面。这个界面中有三个窗口,除了代码窗口外,在这个程序中我修改了CommandButton1的caption属性,这个属性其实对应的就是在按钮上显示什么字,在这里我改成了搜索。
完成了以上操作,接下来就可以写程序了,程序其实和烧菜的菜谱差不多,变量就是各种食材调味料,代码就是烧菜的步骤。
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也并不是什么情况都适合,像上面那个程序虽然简单,但也需要大概十几分钟来完成,如果仅仅是偶尔用到某个功能,而且不会花费太多时间的情况下我建议还是手动做做算了,毕竟花十几甚至几十分钟写一个手动几分钟就能完成的东西,怎么看都不符合懒这个标准的说~~~
湘焯君
校验提示文案
手抓饼狂魔
校验提示文案
风起情破
校验提示文案
都到这里来
校验提示文案
卷竹莲
校验提示文案
nalget
校验提示文案
sturdust
校验提示文案
贪吃食神
校验提示文案
誰是誰的誰
小张啊,下班之前把结果放我桌上
校验提示文案
对面有鱼塘
校验提示文案
象鼻挂猪肠
校验提示文案
雨夜一枝梅
校验提示文案
梦海回忆
校验提示文案
值友1539022278
校验提示文案
远离秽土
校验提示文案
有钱必买索纳塔
校验提示文案
苏菲零败
校验提示文案
gz-ss
校验提示文案
小草fms
校验提示文案
饺只
校验提示文案
贪吃食神
校验提示文案
sturdust
校验提示文案
搬砖的小豆豆
校验提示文案
湘焯君
校验提示文案
xixipigpig
校验提示文案
废柴大叔
校验提示文案
smilinguni
校验提示文案
牧野边
校验提示文案
HSMMD
校验提示文案
无影无迹
校验提示文案
值友1852548834
校验提示文案
Y_O_U
校验提示文案
漂泊的云0274
校验提示文案
nalget
校验提示文案
f300200100
校验提示文案
it狗
校验提示文案
YJ1989
校验提示文案
thywelkin
校验提示文案
卷竹莲
校验提示文案
都到这里来
校验提示文案