分享

Excel || VBA之循环和比较运算符

 L罗乐 2018-03-16



前方碎碎念

春节长假,大部分的你们都在欢快的过年吧。我!也!是!真的特别特别喜欢放假,玩了游戏之后还有那么多空余时间可以看看书,补补课,写写公号什么的。懒得在大年三十晚上爬上来发图片祝大家春节快乐的懒人我就借着这大年初二的推文祝大家春节快乐吧。

希望新的一年里,大家对自己有什么期望都自己努力地去实现了,不自我设限,不过度自责但也不自我放纵,踏实努力地去走好每一步。盗用一句今年我最喜欢的拜年唠嗑回复:成为更好的自己,不为别人。 


唠嗑完,我们来讲讲正事,今天讲讲比较运算符和循环语句。比较运算符贼简单,我就准备随便带过了。循环语句才是大头,所以我们来道关于它的新年后的第一道思考题吧。

思考


我们在码代码时候,需求人人都不一样,有简单也有复杂。那么,我们需要多少种“句式”能够解决所有的问题?

当当当,答案揭晓,我们只需要三种就够用啦:是顺序语句,分支语句和循环语句,是不是觉得很神奇?三种语句就可以包罗万象满足所有的需求啦。所以嘛,今天我们就先来讲讲其中之一循环语句。


不相信三种语句就可以解决所有问题的童鞋们,可以去看看这个:C. Bohm& G. Jacopini, 'Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules,' Communications of the ACM, vol9(5) May 1966, pp 366-371.


一、比较运算符

这个太太太简单了啊,我就不举例讲了啊。

=   等于

<   小于

>   大于

<=   小于等于

>=   大于等于

<>   不等于

应该大家唯一可能不熟悉的也就最后一个不等于的写法了,看一眼就懂了。


二、循环语句

循环语句在编程中是特别常用的语句,很多刚开始码代码的小伙伴可能会特别不习惯一种穷举的思维。因为现代电脑的运行速度其实已经非常非常快了,所以很多我们通过其他办法解决的问题,对于电脑来说完全可以通过穷尽全部的可能去找到一个合适的答案。而在穷举过程中,循环语句是一个特别特别容易被用到的语句哦。


因为今天的几个循环语句其实达到的是基本完全一致的结果,所以每种循环语句我都会先列出语法,再举个一模一样case的例子来让大家看看循环语句是如何利用的。我们还是接着上节课的资产清单,这次我在资产清单前面加了一列,今天的例子就是通过各种循环语句给第一列加上序列号。


把之前的资产清单再拿出来给大家瞅瞅,它长这样:


好啦,我们要开始啦。坐稳,发车咯。


三、For...Next 循环

For...Next 循环适合于开始和结尾都特别明确的循环,语法如下:

For <循环变量> = <初值> To <终值> [Step 步长值]

    <循环体>

    [Exit For]

    [循环体]

Next [循环变量]

*<>中的内容为必填项,[]中的内容为选填

*Exit For可以中途退出循环,一般和某些分支语句一起使用


因为初值和终值都是必填项,所以说For...Next 循环适用于首尾明确的循环。


示例

这里我们用到了我们之前学的所有知识哦,能找到么?

i 和 AssetList都是变量(常量和变量)

 是整数型而AssetList是工作表对象(数据类型)

AssetList是Asset工作表 (变量赋值)

i 是一个随着循环不断变化的值。(变量赋值)

给A1单元格对象填入序号两个字。(单元格对象)


简单的解释下循环语句的运行部分。i 会从2开始每一次循环加上1,一直到 i 等于30最后运行一次循环停止,所以一共运行了29次。

每次循环都会经过一个循环体:

AssetList.Cells(i,1)=i-1

那么:

 i=2的时候,单元格A2=2-1=1

 i=3的时候,单元格A3=3-1=2

……

最后一次是 i =30的时候,单元格A30=30-1=29

我们就帮A列编好了顺序序号。


有小伙伴就会有个问题了,我怎么知道我该编到30行呢,也许有内容的行数不定的啊,有时候可能是20行,有时候可能是40行呢。


这种想法非常正确,因为我们对程序很大一部分的要求就是灵活性。不可能每次我们看到多少航,我们再进去改代码。但是很不幸的是,如果仅仅使用For...Next 循环而不加假设语句,是么有办法解决这个问题的。所以呢,我们还有下面的循环可以使用啊!


四、Do While 循环

Do While有两种写法,两种写法只是While地方不同:

Do [While 逻辑表达式]

      <循环体>

      [Exit Do]

      [循环体]

Loop

Do

       <循环体>

      [Exit Do]

      [循环体]

Loop [While 逻辑表达式]

*<>中的内容为必填项,[]中的内容为选填

*Exit Do可以中途退出循环,一般和某些分支语句一起使用


这个循环式While的逻辑表达式为true的时候,循环就会一直进行下去。所以我们很容易就能得出while位置不同导致的区别啦:

当While逻辑表达式放在第一行Do后面的时候,如果While后的逻辑表达式为false这个循环语句有可能一次都不进行循环。而当While逻辑表达式放在最后一句Loop后面,那么这个循环最少最少也会被执行一次,第一次执行之后才到While逻辑表达式进行判断,是否进行第二次的循环。


示例

可以看到Do while 循环语句和刚才不同的几个地方:

① 因为用了while逻辑表达式之间的判断语句,我们就不需要去规定死循环多少次,而是让B列有数据的时候,就进行标号了。

② Do While循环语句自身的语法结构内没有规定初值、终值和步长值,所以我需要另外去规定:

初值:在循环开始之前,我就规定了i=2这点,那么循环内的cells(i,1)=i-1就等于从2开始循环啦。

步长值:循环体内写上了i=i 1,就相当于规定了步长值。

终值:终值靠while逻辑判断句实现,当cells(31,2) 为空的时候,我们就不再循环了。所以编号就在30行停止啦。


五、Do Unitl 循环

Do Unitl循环和Do While循环在语法上基本完全一致:

Do [Until 逻辑表达式]

      <循环体>

      [Exit Do]

      [循环体]

Loop


Do

      <循环体>

      [Exit Do]

      [循环体]

Loop [Until 逻辑表达式]

但是需要注意的地方是,While逻辑表达式是Ture的时候执行,而Do Unitl循环是为False时执行。


示例

可以看到,刚才Do While的语句中,我们用的条件是Cells(i,2) <> '' 也就是对应的B列单元格不为空;而当我们用Do Unitl的语句的时候,条件就变成了Cells(i,2) = '',也就是B列单元格为空。这两个循环语句的判断区别大家在写的时候一定不要弄混啦。



六、For Each...Next 循环

这个循环初学者可能有一点点难理解,大家先看个有个大概概念就好了。语法是这样的:

For Each 元素变量 In 集合名称或数组名称

      <语句块1>

      [Exit For]

      [语句块2]

Next [元素变量]

*<>中的内容为必填项,[]中的内容为选填

*Exit For可以中途退出循环,一般和某些分支语句一起使用


示例

一样是刚才编号的小例子。

我们来解释一下这个稍微有点难理解的循环:

首先我定义了Rng是个单元格对象

之后,循环的范围是A2到A30单元格中的每一个单元格。

而我对每次循环的单元格进行赋值的公式是Rng.Row-1,也就是循环到的单元格的行减一。因为我们的编号是从第二行开始的,于是在A2单元格时候,A2单元格的内容就是A2单元格的行数2减去1,也就是序号为1。


当然除了单元格我们还可以在数组(这个我们还没讲)里循环,在集合里(单元格/工作表等)中循环等等,这个大家看看眼熟就好啦。以后再慢慢讲。


七、结束语

我们今天非常迅速的过完了循环语句,下一次分享准备讲讲分支语句。分支语句大家更加熟悉啦,比如if就是一种分支语句,理解起来也会比循环容易得多。分支语句讲完之后我们就学会了能解决所有问题的“句式”方面,我们就会来尝试一下拆分表这一点。


下次见咯,再次祝大家新一年有新收获:)



这是一个很随性的公众号,用来分享公号主自己学到的,用到的,听到的,感受到的各种乱七八糟的事情,如果你有兴趣:



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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多