这次更新主要说一下循环,谢谢大家。
计算机之于人的优势之一在于,可以准确而不厌烦地重复某种动作,Excel中的数据处理,有时正是需要重复某种操作,尤其是面对体量较大的基础数据时。
奏是说,重复、枯燥滴数据处理,VBA快速又准确。也只有在这种情况下,才能在众人的惊呼声中完美装那啥。
重复,在编程中奏是循环,指定范围,然后对范围中的对象进行既定的操作。主要是是如下三个问题:
1,如何指定范围,奏是循环出现的范围;
2,如何在范围中定位对象,奏是指定需要操作的对象;
3,如何指定操作内容;
同志们,让我们举起一个活生生的小栗子:
话说“人民大食堂”是大家吃饭饭的地方,某一周呐,总共为大家提供五个菜,每人可以选四个,可选菜如下:
No.1 干煸菜花
No.2 香焗茄子
No.3 藕盒
No.4烤串
No.5 凉拌藕
哈哈,其实是俺的私房菜,有图有真相,大家贱笑啦。
有4人吃饭,分别是上官一,公孙二,司马三和欧阳四,食堂堂主有一个神奇小表格,用来记录大家一周内每天的选餐情况,至于他为啥记录这东西,俺也不知道,可能他是个变态吧。
表格滴结构是下面这个样子滴:
表1,“当日用餐情况”,用来记录某日4个人的选餐情况,如下:
表2到表5,用于记录4个同志一周内每天的选餐情况,每一列表示一天,如上官一同志的选餐情况如下,9/17日的选餐与表1中“B2”单元格的内容相对应:
看来食堂堂主果然是个变态,他到底要实现什么功能呢?奏是在表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 5
Next 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 7
Next 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'定义变量i
Dim j As Integer'定义变量j
For 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的工作原理,了解了原理之后,嗨嗨,做点儿自己想做的吧。
马上当家做主人啦,让Excel干啥,他奏得干啥,对,奏是这种赶脚。
先来分析一下,Excel的日常数据操作内容,根据俺这些年的人生经验,主要是下面几点:
一、指定需要进行操作的“Sheet”;
二、指定目标sheet中的操作区域,一般可以为某行、某列、某单元格,反正你选啥就是啥;
三、完成对指定区域的操作,比如输入值或者函数、剪切复制神马滴。
上面的这些内容,都可以通过VBA来完成,连动动手指这样的活儿都不干了,高品质懒人都是一劳永逸滴。
下面逐条分析一下吧,先声明一下,每一个步骤的实现方法都有很多,我就捡喜欢的说吧。
一、指定需要进行操作的“Sheet”
每个Excel文件里面都有很多shit,哎呀呀,口语不大好,说臭了,是有很多sheet,如何指定需要的sheet呢,这就需要分析一下每个sheet的关键参数,俺们还是来举个小栗子吧。
话说“悟空”、“八戒”、“沙僧”是三个异父异母的亲兄弟,悟空行大,顺序号是1,八戒行二,顺序号是2,沙僧行三,顺序号是3,哥儿仨一个头磕到地上,保着唐僧西天取经,唐和尚为了方便分配任务,给他们在生产大队里设定了代号,悟空的代号是“泼猴”,八戒的代号是“呆子”,沙僧的代号是“老沙”。
现在御弟哥哥要残忍滴给大家分配任务,分配形式是单独面谈,先是悟空,那么唐长老怎么叫他呢,肯定不是“大圣哥哥小亲亲”神马的,前面交代的剧情里面木有这个东东,正确滴打开方式有三种:
1,悟空
2,徒弟1
3,泼猴
再介绍下去,大家要进入剧情啦,还是回到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单元格,然后开始录制,下面是我录制的结果
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()中,执行以下,奏看到下面的结果啦
还有啥操作是不会滴,录制奏行咧,这下大家满意了吧,谢谢大家。
介绍到目前为止呐,对于如何把手动操作转化为代码,同志们大概可能也许应该有个认识啦,如果要实现超人滴功能,就要加一些循环、选择神马滴进去啦。
如果大家喜欢,咱们下回接着说。
谢谢大家。
一、理解Excel VBA的工作原理
对编程不熟悉的童鞋,想要快速学习Excel VBA,应充分理解程序的运行过程,将程序的运行过程与人工操作相对应,理解程序可代替人工操作的原理,才能自由控滴制VBA这个小机器,才能为所欲为、肆无忌惮,才能高高兴兴上班去,平平安安回家来。
利用Excel VAB完成某种功能,其实是一段程序在Windows中的执行过程,该执行过程可模拟人的操作行为,实现功能的自动化,也就是人工小智能,下面通过一段人的操作行为与代码执行过程的对比,来介绍VBA的工作原理。
日常操作Excel,通常是对Excel中某一选定区域的操作,现假定需要实现的功能如下:将当前文件“Sheet1”中“A1”单元格的值设定为“100”。
人工操作的方法可按如下步骤完成:
1,将“sheet1”激活,设置为当前工作表;
2,选中单元格“A1”,将其设置为当前单元格;
3,在当前单元格“A1”中输入“100”。
对应的VBA代码如下:
Sub Value()
Sheets("Sheet1").Select
Range("A1").Select
ActiveCell.Value = "100"
End Sub
其中Sub Value()及End Sub两句分别表示程序的开头和结尾,与操作过程无对应关系。中间的三句代码分别与人工操作的三个步骤相对应,选中“sheet1”,选中“A1”、设定选中的单元格值为“100”,如此分析可以看出,程序运行的每一步都是和人工操作相对应的。
二、获取代码
问题来了,俺还不会写代码,分析个屁屁呀,木有关系,代码都是可以自动的生成的,只需找到“宏”这位小哥就行啦。不过,这位小哥是不会轻易跟你见面哒,需要在Excel中召唤一下,请看VCR,啊啊,木有VCR,惭愧呀。
1,在“工具栏”空白处右击,粗线下面的弹出菜单,选择“自定义功能区”;
2,在“开发工具”选项前的方框中打勾勾,选择右下角的”确定“,完成。不用集齐龙珠,就这么神奇滴成功啦。
此时,可看到工具栏中多出了一般人木有的“开发工具”选项。
现在,我们可以通过“宏”录制的方式得到一段代码了,一旦启动宏录制功能,你在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”。
在模块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,脱单有望啊。
今天先回答道这里,如果大家喜欢呢,会继续介绍。