作者:Mervyn Zhang
这次更新主要说一下循环,谢谢大家。计算机之于人的优势之一在于,可以准确而不厌烦地重复某种动作,Excel中的数据处理,有时正是需要重复某种操作,尤其是面对体量较大的基础数据时。奏是说,重复、枯燥滴数据处理,VBA快速又准确。也只有在这种情况下,才能在众人的惊呼声中完美装那啥。
bcc1524b2b0f8609709a82858ea996d9_b.png
重复,在编程中奏是循环,指定范围,然后对范围中的对象进行既定的操作。主要是是如下三个问题:1,如何指定范围,奏是循环出现的范围;2,如何在范围中定位对象,奏是指定需要操作的对象;3,如何指定操作内容;同志们,让我们举起一个活生生的小栗子:话说“人民大食堂”是大家吃饭饭的地方,某一周呐,总共为大家提供五个菜,每人可以选四个,可选菜如下:No.1 干煸菜花
No.2 香焗茄子
fcffdc7fbe0a45283bf87d3e4d16437d_b.png
No.3 藕盒
cc60e5293535eba74caa82737d175e8f_b.png
No.4烤串
ea8b3743d758d2caaa97411dbcf5dc15_b.png
No.5 凉拌藕
2abdca3d93bbf33952f039dad4b6d8d5_b.png
哈哈,其实是俺的私房菜,有图有真相,大家贱笑啦。有4人吃饭,分别是上官一,公孙二,司马三和欧阳四,食堂堂主有一个神奇小表格,用来记录大家一周内每天的选餐情况,至于他为啥记录这东西,俺也不知道,可能他是个变态吧。表格滴结构是下面这个样子滴:表1,“当日用餐情况”,用来记录某日4个人的选餐情况,如下:
表2到表5,用于记录4个同志一周内每天的选餐情况,每一列表示一天,如上官一同志的选餐情况如下,9/17日的选餐与表1中“B2”单元格的内容相对应:
表2到表5,用于记录4个同志一周内每天的选餐情况,每一列表示一天,如上官一同志的选餐情况如下,9/17日的选餐与表1中“B2”单元格的内容相对应:
502f7bfcf07c91bd0ab83c5557cfa926_b.png
看来食堂堂主果然是个变态,他到底要实现什么功能呢?奏是在表1的“B1”单元格中输入9/12-9/18中的任一日期,嘎嘣一下就可以得到4个人这一天的选餐情况,信息就来源于后面的4个表格,俺想,这可能奏是大数据吧,不管你信不信,反正俺是信了。
关于如何实现这个功能,俺们有一个首先要面对滴问题,在循环的过程中,每一次操作的对象都是变化滴,之前俺们介绍的range("B2"),cells(2,2)神马的就不灵了,他们都是从一而终滴正人小君君,俺们需要滴是善变滴,世界在变,俺们也在变滴那种,这可肿么办捏?就在人民群众提出迫切需要滴时候,一个无敌变色小龙龙粗线啦,它奏是编程界俗称滴”变量“。
在程序语言中,俺们可以用字母或者字母滴组合表示变量.举个小栗子,指定字母”i“为变色小龙龙,一句话奏行(考虑到我们这个例子里面,i主要代表1,2,3神马的,我们把i定义为一个代表整数的变量),这句话奏是 Dim(定义) i as(作为) integer(整数),请自动忽略括号中滴注释,也奏是
Dim i as integer。
有了变量这个货,俺们可以继续讨论大数据这个神奇滴东东咧,怎么跟我们前面的三个问题相对应呢?堂主的变态小表格涉及两个循环,分别来看一下对应的三个问题:循环一是这样滴:"当日用餐情况"表中,需要为B2到B5单元格赋值,赋值的信息来源表根据A2到A5的值判断,如为B3赋值时,A3值为“公孙二”,信息来源就是“公孙二”这个表格咧;1,如何指定范围,奏是循环出现的范围;循环一的操作范围奏是"当日用餐情况"表中B2到B5,其中B不变,也就是列不变,行数从2变到5,利用变量“i”表示出来是这样滴:For i=2 to 5Next i奏用i来表示行数。2,如何在范围中定位对象,奏是指定需要操作的对象;在指定的i=2 to 5的范围内,i从2变到5,每次增加1,cells(i,2)就可以分别代表从B2到B5这几个单元格了,所以上面这两句话也就指定了俺们的操作范围。3,如何指定操作内容;操作内容是在循环范围内对指定的对象所做的操作,那么应该写在什么地方呢,嘿嘿,当然就是For i=2 to 5和Next
i之间啦,因为这两句之间就是俺们的操作范围嘛。
循环一中对每一个对象的操作其实奏是另外一个循环,也奏是小堂主的循环二,这里有一个嵌套结构。循环二是这样滴:选定信息来源表后,如前面所说的B3的信息来源就是“公孙二”这个表格,对其A1到G1的值进行判断,如其值与“当日用餐情况”表B1的内容相同,则将对应列设定为信息来源列,对选定列中的选餐信息进行整合并赋予“当日用餐情况”B3单元格。举例:B1值为"2016/9/17",则将“公孙二”表格F列为信息来源列,对选餐信息进行整合并赋予“当日用餐情况”B3单元格,写成“凉拌藕+藕盒+烤串+干煸菜花”。
俺们先来给这个循环定义变量,Dim j as integer,俺赶脚大家都理解这句话了,这个循环的三个关键问题该如何分析呢?3.1,如何指定范围,奏是循环出现的范围;循环二的操作范围奏是信息来源表的A1到G1,其中1不变,也就是行数不变,列数从1变到7,利用变量“j”表示出来是这样滴:For j=1 to 7Next j奏用j来表示列数。3.2,如何在范围中定位对象,奏是指定需要操作的对象;在指定的j=1 to7的范围内,j从2变到7,每次增加1,cells(1,j)就可以分别代表从A1到G1这几个单元格了,所以上面这两句话也就指定了俺们的操作范围。3.3,如何指定操作内容;这里的操作需要判断A1到G1的单元格值是否与“当日用餐情况”表B1的内容相同,如相同,则该列为信息来源列,通过宏录制是无法实现判断功能滴,这时候俺们有一句中英文结合的小咒语:If the value of B2 in ”当日用餐情况“ sheet 等于 that of A1
to G1中的一个 in 信息来源表, then干活end。
干活的内容是啥呢? “当日用餐情况”表Bi值设定为信息来源表中信息来源列j的第2行+第3行+第4行+第5行,翻译成机器语言:“当日用餐情况”表 滴 Bi单元格 滴 值为信息来源表 滴 J2 滴 值加J3 滴 值加J4 滴 值加J5 滴 值翻译成程序语言:Sheets(“当日用餐情况”).cells(i,B).value=sheets("信息来源表").cells(2,j).value+sheets("信息来源表").cells(3,j).value+sheets("信息来源表").cells(4,j).value+sheets("信息来源表").cells(5,j).value"信息来源表"这几个字是变化滴,应该与“当日用餐情况”表的Ai值保持一致,所以表的名字应该是“Sheets(“当日用餐情况”).cells(i,1).value”,这样程序应当作出相应修改,同时在几个菜名中间加上“+”,这奏是最终的程序语言了:Sheets(“当日用餐情况”).cells(i,B).value=sheets(Sheets(“当日用餐情况”).cells(i,1).value).cells(2,j).value + “+”+sheets(Sheets(“当日用餐情况”).cells(i,1).value).cells(3,j).value+ “+”+sheets(Sheets(“当日用餐情况”).cells(i,1).value).cells(4,j).value+ “+”+sheets(Sheets(“当日用餐情况”).cells(i,1).value).cells(5,j).value每个菜中间用“+”连接。整个程序写下来是下面这个样子滴:Dim i As Integer '定义变量iDim j As Integer '定义变量jFor i = 2 To 5 '循环一的范围For j = 1 To 7 '循环二的范围If
Sheets(Sheets("当日用餐情况").Cells(i,
1).Value).Cells(1, j) = Sheets("当日用餐情况").Cells(1,
2).Value Then '咒语开始Sheets("当日用餐情况").Cells(i, 2).Value = _Sheets(Sheets("当日用餐情况").Cells(i, 1).Value).Cells(2, j) + "+" _+ Sheets(Sheets("当日用餐情况").Cells(i, 1).Value).Cells(3, j) + "+" _+ Sheets(Sheets("当日用餐情况").Cells(i, 1).Value).Cells(4, j) + "+" _+ Sheets(Sheets("当日用餐情况").Cells(i, 1).Value).Cells(5, j) '咒语中间的干活内容End If '咒语开始Next j '循环二结束Next I '循环一结束通过这个小栗子,希望对大家理解循环能有一点儿帮助,关于VBA,还没想好后面写点儿什么,如果大家有啥具体需求,可以提出来,我尽量用小栗子说明。
这些是VBA入门的基础信息,大家贱笑啦,尤其是精通VBA的少侠们,俺这真真是班门摆弄斧子了,内心很多小惭愧咆哮而过,谢谢大家。////////////////////////////////////////////////////////////////////////////////////////////////////////
2016/7/23
非常感谢大家的关注,那么,更新来啦。之前的内容是VBA的工作原理,了解了原理之后,嗨嗨,做点儿自己想做的吧。
d2c7149d53ff8af1291e5ce1517af391_b.png
马上当家做主人啦,让Excel干啥,他奏得干啥,对,奏是这种赶脚。
马上当家做主人啦,让Excel干啥,他奏得干啥,对,奏是这种赶脚。
先来分析一下,Excel的日常数据操作内容,根据俺这些年的人生经验,主要是下面几点:一、指定需要进行操作的“Sheet”;二、指定目标sheet中的操作区域,一般可以为某行、某列、某单元格,反正你选啥就是啥;三、完成对指定区域的操作,比如输入值或者函数、剪切复制神马滴。上面的这些内容,都可以通过VBA来完成,连动动手指这样的活儿都不干了,高品质懒人都是一劳永逸滴。下面逐条分析一下吧,先声明一下,每一个步骤的实现方法都有很多,我就捡喜欢的说吧。
一、指定需要进行操作的“Sheet”每个Excel文件里面都有很多shit,哎呀呀,口语不大好,说臭了,是有很多sheet,如何指定需要的sheet呢,这就需要分析一下每个sheet的关键参数,俺们还是来举个小栗子吧。话说“悟空”、“八戒”、“沙僧”是三个异父异母的亲兄弟,悟空行大,顺序号是1,八戒行二,顺序号是2,沙僧行三,顺序号是3,哥儿仨一个头磕到地上,保着唐僧西天取经,唐和尚为了方便分配任务,给他们在生产大队里设定了代号,悟空的代号是“泼猴”,八戒的代号是“呆子”,沙僧的代号是“老沙”。现在御弟哥哥要残忍滴给大家分配任务,分配形式是单独面谈,先是悟空,那么唐长老怎么叫他呢,肯定不是“大圣哥哥小亲亲”神马的,前面交代的剧情里面木有这个东东,正确滴打开方式有三种:1,悟空2,徒弟13,泼猴再介绍下去,大家要进入剧情啦,还是回到VBA滴问题,实在想看剧情,请关闭知乎,打开电视。三种表示方式,在Excel里面都有体现,如下,黄圈圈是名字,大家都能看到;蓝圈圈是代号,组织内可见,通过属性窗口或者编程界面可见;绿线是序号,是排列顺序。
在三个表格中,指定表格“悟空”的方法如下,分别与上述三种方式相对应:1, Sheets("悟空"),名称表示2, Sheets(1),序号表示3, 泼猴,代号表示任选一种,指定表格滴任务就完成啦。
二、指定目标sheet中的操作区域指定表格完成后,就该选择操作区域了,可以是单元格,也可以是行或列。单元格可以用cells表示,也可以用range表示,削微有一点区别,比如同样表示单元格B2,使用cell表示为cells(2,2),使用range则表示为range("B2")。行和列肿么表示捏?如第一行,rows(1)或者rows("1:1")如第一列,columns(1)或者columns("A:A")还是那句话,有很多其他滴实现方式,还是捡我喜欢滴,好用滴说。
三、完成对指定区域的操作指定了某一区域以后,就要进行我们要的操作啦。那么问题来了,我现在有明确的想法,要在第一个sheet的A1单元格中输入“我要为张默文点赞”,完全不知道肿么写呀,只知道指定sheet,指定单元格,然后捏?还是不会呀,我要的东西你带来了吗?
其实只要把“要在第一个sheet的A1单元格中输入’我要为张默文点赞‘”这句大白话翻译一下就行咧,首先翻译成机器语言,“第一个sheet 滴 单元格A1 滴 值为 '我要为张默文点赞 '”,然后翻译成程序语言,指定sheet和单元格时,用前面讲的方法,两个斜体加粗的“滴”用“.”表示,就是程序语句啦,sheets(1).cells(1,1).value="我要为张默文点赞",最后面的.value="我要为张默文点赞"就是所说的特定操作啦。对于不了解编程的同志,与其费力的介绍对象、属性、方法神马滴,还是这种方式简单、直接一点儿,总有人喜欢简单粗暴滴,程序员大哥大姐们又要贱笑啦。那位看官说啦,俺们的需求可不只是输入个“我要为张默文点赞”这么简单,俺们还要为张默文付出更多,我要把这句话加粗显示,怎么实现呢?我对你们那些黑话也不清楚呢,我哪知道这个操作怎么用程序语言表示,木有关系,我们有法宝,“宏录制”,大杀器呀。方法我们之前介绍过啦,我先选中A1单元格,然后开始录制,下面是我录制的结果
bbf4bf4491aad52ddac1e118abc5a0dd_b.png
Selection.Font.Bold=True,翻译成机器语言,Selection(选中的内容,即A1单元格) 滴 Font(字体) 滴 Bolt(加粗)是True(真的),这样我们就得到我们要的方法啦,也就是在“cells(A1).”的后面要加的东西。
让我们从头回顾一下,要在第一个Sheet的A1单元格中输入“我要为张默文点赞”,并加粗显示,该如何实现呢?Step1,翻译成机器语言第一个sheet 滴 A1单元格 滴 值为“我要为张默文点赞”A1单元格 滴 字体 滴 加粗是真的Step2,翻译成程序语言,结合前面讲的指定sheet和区域的方法以及录制得到的操作方法,写出代码,用“.”代替“滴”sheets(1).cells(1,1).value="我要为张默文点赞"sheets(1).cells(1,1).Font.Bold=True把这串代码复制到宏1()中,执行以下,奏看到下面的结果啦
acf0c784a1737bf70c1ef8136f721329_b.png
还有啥操作是不会滴,录制奏行咧,这下大家满意了吧,谢谢大家。
介绍到目前为止呐,对于如何把手动操作转化为代码,同志们大概可能也许应该有个认识啦,如果要实现超人滴功能,就要加一些循环、选择神马滴进去啦。如果大家喜欢,咱们下回接着说。谢谢大家。
////////////////////////////////////////////////////////////////////////////////////////////////////////
2016/6/25
看到这个问题,忍不住想跟大家分享一下Excel VBA从入门到卧室的学习过程,希望大家能够喜欢。
入门滴话,可以参考下面滴步骤:
一、理解Excel VBA的工作原理对编程不熟悉的童鞋,想要快速学习Excel VBA,应充分理解程序的运行过程,将程序的运行过程与人工操作相对应,理解程序可代替人工操作的原理,才能自由控滴制VBA这个小机器,才能为所欲为、肆无忌惮,才能高高兴兴上班去,平平安安回家来。利用Excel VAB完成某种功能,其实是一段程序在Windows中的执行过程,该执行过程可模拟人的操作行为,实现功能的自动化,也就是人工小智能,下面通过一段人的操作行为与代码执行过程的对比,来介绍VBA的工作原理。日常操作Excel,通常是对Excel中某一选定区域的操作,现假定需要实现的功能如下:将当前文件“Sheet1”中“A1”单元格的值设定为“100”。人工操作的方法可按如下步骤完成:1,将“sheet1”激活,设置为当前工作表;2,选中单元格“A1”,将其设置为当前单元格;3,在当前单元格“A1”中输入“100”。对应的VBA代码如下:
Sub
Value()
Sub
Value()Sheets("Sheet1").SelectRange("A1").SelectActiveCell.Value = "100"End
Sub其中Sub Value()及End Sub两句分别表示程序的开头和结尾,与操作过程无对应关系。中间的三句代码分别与人工操作的三个步骤相对应,选中“sheet1”,选中“A1”、设定选中的单元格值为“100”,如此分析可以看出,程序运行的每一步都是和人工操作相对应的。二、获取代码问题来了,俺还不会写代码,分析个屁屁呀,木有关系,代码都是可以自动的生成的,只需找到“宏”这位小哥就行啦。不过,这位小哥是不会轻易跟你见面哒,需要在Excel中召唤一下,请看VCR,啊啊,木有VCR,惭愧呀。1,在“工具栏”空白处右击,粗线下面的弹出菜单,选择“自定义功能区”;
2,在“开发工具”选项前的方框中打勾勾,选择右下角的”确定“,完成。不用集齐龙珠,就这么神奇滴成功啦。
此时,可看到工具栏中多出了一般人木有的“开发工具”选项。
此时,可看到工具栏中多出了一般人木有的“开发工具”选项。
现在,我们可以通过“宏”录制的方式得到一段代码了,一旦启动宏录制功能,你在Excel中所作的任何操作都会以VBA代码滴形式如实哒记录下来,要启动录制功能,只要单击下面这个按钮奏行了。
现在,我们可以通过“宏”录制的方式得到一段代码了,一旦启动宏录制功能,你在Excel中所作的任何操作都会以VBA代码滴形式如实哒记录下来,要启动录制功能,只要单击下面这个按钮奏行了。
单击“录制宏”按钮后,该按钮变成了“停止录制”。
单击“录制宏”按钮后,该按钮变成了“停止录制”。
同时跳出如下窗口,选择“确定”即可。
同时跳出如下窗口,选择“确定”即可。
记录开始后,俺做了如下操作:1,在单元格“A1”中输入“数字”;2,在单元格“A2”中输入“1”;3,利用填充的方式,在“A2”到“A101”中输入数字1到100;4,选中A列5,选中“筛选”功能;6,仅显示如下数字"13" ,
"17", "21", "25", "32", "35",
"38", "43", "49", "5", "51",
"56", "6", "62", "63", "71", "75","77", "80", "85", "87",
"88", "94", "95", "97", "99"该操作过程需要手动选择列表中的每一个数字;7,显示结果如下:
完成上述操作后,选择“停止录制”按钮,此时,我们已经得到了记录上述操作过程的VBA代码,代码在哪里捏?选择“Visual Basic”按钮即可,细心的童鞋一定也发现了装×大法,“Alt+F11”。
完成上述操作后,选择“停止录制”按钮,此时,我们已经得到了记录上述操作过程的VBA代码,代码在哪里捏?选择“Visual Basic”按钮即可,细心的童鞋一定也发现了装×大法,“Alt+F11”。
在模块1中可以看到,代码是这个样子滴:
在模块1中可以看到,代码是这个样子滴:
看官们可以自己分析一下这段代码,看代码是如何与俺的操作相对应滴。Sub 宏1() ' 程序开始 ' 宏1 宏(注释)Range("A1").Select '选择“A1”单元格(步骤1)ActiveCell.FormulaR1C1 =
"数字" '在单元格“A1”中输入“数字”(步骤1)Range("A2").Select '选择“A1”单元格(步骤2)ActiveCell.FormulaR1C1 =
"1" '在单元格“A2”中输入“1”(步骤2)Selection.AutoFill
Destination:=Range("A2:A101"), Type:=xlFillSeries '利用填充的方式,在“A2”到“A101”中输入数字1到100,Autofill(步骤3)Columns("A:A").Select '选中A列(步骤4)Selection.AutoFilter '选中“筛选”功能(步骤5)ActiveSheet.Range("$A$1:$A$101").AutoFilter Field:=1,
Criteria1:=Array("13" _, "17", "21",
"25", "32", "35", "38", "43",
"49", "5", "51", "56", "6",
"62", "63", "71", "75", _"77",
"80", "85", "87", "88", "94",
"95", "97", "99"), Operator:=xlFilterValues '仅显示选定的数字(步骤6)End
Sub '程序结束三、逐步分析代码那位说了,VBA代码的运行过程,一般都是“嗖”一下,Done,俺怎么知道俺的分析对不对呢,程序执行一步,俺就想看一下结果噻。这个很简单,使用程序的单步调试,让程序按指挥,一步步运行,这样滴描述,让程序员大哥大姐们贱笑啦,哈哈。下面,让我们再次举起刚才那个活生生、血淋淋的小栗子,现场直播一下程序的运行过程。请大家同时打开Excel的工作表界面和VBA程序界面,最好并排显示,就像俺这样滴,这样你就能一边看控制程序单步运行,一边看表格中的运行结果啦。
如何开始程序捏?激活程序窗口,也就是点一下程序那半边窗口滴意思。
如何开始程序捏?激活程序窗口,也就是点一下程序那半边窗口滴意思。按一下键盘上滴“F8”,嗯,当前执行的语句好黄啊,从我按下“F8”的那一刻,他就变了,继续按“F8”,程序就会逐句变黄,也奏是在逐句执行,这个时候观察表格窗口,就能看到每一句代码的运行结果。比如,执行完步骤4时,整个画面是这个样子滴,这么逐句滴分析下来,肯定能充分理解代码滴含义咧。
总结一下,从一个木有啥编程经验的VBA小白,想要快速学习VBA,很简单,理解ta,得到ta,详细分析ta,脱单有望啊。今天先回答道这里,如果大家喜欢呢,会继续介绍。 |