二维码 购物车
部落窝在线教育欢迎您!

VBA实战入门教程(三):循环语句

 

作者:E图表述来源:部落窝教育发布时间:2020-05-20 15:26:52点击:5902

分享到:
0
收藏    收藏人气:0人
版权说明: 原创作品,禁止转载。

编按:

哈喽,大家好!今天是第三篇VBA实战入门教程,我们将给大家带来VBA中最常见语句之一,循环语句。典型的循环语句有4种,分别是Do While…Loop循环、Do…Loop Until循环、For…Next循环、For Each x In y … Next循环。查看循环逻辑图可以更快理解循环语句。

 

【前言】

 

在看过我们前两篇的VBA实战入门教程后,有没有兴趣继续学习呢?也许同学们的兴趣早就有了,但就是还没有找到入门的路,当然了前面的两篇文章也算不得是让你入门的途径,充其量也就是一道开胃菜。继续跟上作者E图表述的步伐,我不会让你像哑巴英语似的,变成只会看不会写的手残VBA”。那如果前两篇的文章让你了解了一些单元格对象的属性,那现阶段,你就需要了解写代码中不可规避、而又十分重要的两个语句

 

 

一、循环语句

 

 

1.给一个单元格的赋值

 

在前面的文章中,同学们应该抓住了一个知识点,就是对单元格的赋值过程。什么是赋值呢?就是将一个表达式的结果,输入到某一个(某一个区域)单元格对象的VALUE属性中,例如下面的写法:

 

 

Sub 赋值1()

  Sheets("A").[A1] = Sheets("A").[A1].Row

End Sub

 

【代码解析】

 

Line1:将工作表AA1单元格的ROW属性,赋值给工作表AA1单元格。

 

2.10个单元格赋值

 

下面我们提高一些需求难度,给A1:A10单元格赋值,如果你能看懂上面的代码,那就非常简单了,写10行代码就是了。

 

 

Sub 赋值2()

  With Sheets("A")

    .[A1] = .[A1].Row

    .[A2] = .[A2].Row

    .[A3] = .[A3].Row

    .[A4] = .[A4].Row

    .[A5] = .[A5].Row

    .[A6] = .[A6].Row

    .[A7] = .[A7].Row

    .[A8] = .[A8].Row

    .[A9] = .[A9].Row

    .[A10] = .[A10].Row

  End With

End Sub

 

除了写的内容多了之外,没什么问题,何况我们还可以使用复制粘贴,再改单元格地址,也不是很麻烦。

 

3.100个单元格赋值,不,玩大点儿,给10W个单元格赋值

 

同学们,你准备写10W条命令行吗?直接一些,给你答案,代码如下:

 

Sub 赋值3()

  For i = 1 To 100000

    With Sheets("A")

      .Cells(i, 1) = .Cells(i, 1).Row

    End With

  Next i

End Sub

 


Line1设定循环变量i,循环的范围是从1开始,到100000结束;

 

Line2使用Sheets("A")作为同一系列对象的父级隶属关系;

 

Line3操作Sheets("A")中,从Cells(1, 1)开始的,Cells(2, 1)……Cells(i, 1) ……,到Cells(100000, 1)为止的对象,并将对应的ROW属性赋值给对应单元格;

 

Line4结束With语句;

 

Line5循环语句的结束语句,满足循环条件时,继续循环,不满足条件时,跳出循环。

 

上面就是一个用循环语句写的给10W个单元格赋值的代码,加上WITH语句,也就5行命令行。不需要写那么多的命令代码,利用循环代码,可以很方便的操作你需要的数据源,这就是循环语句最根本的优势。

 

4.循环逻辑图解

 


 

作者E图表述认为循环的流程,归纳后也就上面的两种格式,其主要的差别就是:蓝色的流程是先考虑循环条件,满足时才执行语句,不满足时跳出循环橙色的流程是先执行语句,再判断循环变量是否满足条件,如果不满足,则循环到执行语句再次运行,否则跳出循环

 

5.循环语句的两种语法形态

 

EXCEL VBA中有两种循环语句,简单来说:一种是Do循环,一种是For循环,而它们又分别有两种格式。

 

1Do While…Loop循环语句,举例如下:

 

需求:在工作表“Do循环A列中,找到第一个空单元格。

 

Sub DoWhile循环()

  i = 1

  With Sheets("Do循环")

    Do While .Cells(i, 1) <> ""

      i = i + 1

    Loop

    MsgBox "第一个空单元格是" & .Cells(i, 1).Address

  End With

End Sub

 

 

【代码解析】

 

Line1确定循环变量初始值为1

 

Line2使用Sheets("Do循环")作为同一系列对象的父级隶属关系;

 

Line3循环语句的起始语句,While(循环条件)为单元格不为空;

 

Line4单元格不为空的时候,循环条件满足,执行语句i=i+1这句代码相当的重要,俗称计数器,尤其在循环语句中,起到使变量规律性的累增或者累减的效果,当再次使用变量的时候会使对象的引用发生规律性改变

 

Line5循环语句的结束语句,返回到Line3,进行新的i值的判断。当单元格为空时,循环条件不满足,跳出循环;

 

Line6Msgbox显示规定的文本说明性文字,即“第一个空单元格是”。

 

Do While…Loop的循环结构,满足循环流程图解里面的蓝色流程,属于先判断条件再运行的结构。

 

2Do…Loop Until循环语句,举例如下:

 

需求:还以上例为题,使用Until的方式找到第一个空单元格。

 

Sub DoUntil循环()

  i = 1

  With Sheets("Do循环")

    Do

      i = i + 1

    Loop Until .Cells(i, 1) = ""

    MsgBox "第一个空单元格是" & .Cells(i, 1).Address

  End With

End Sub

 

 

代码就不解析了,基本和Do While…Loop的代码一样,唯独循环条件的位置和写法不一样。

 

Do…Loop Until的循环结构,满足循环流程图解里面的橙色流程,属于先执行语句,再判断条件是否满足,如果不满足条件,继续循环,满足的时候才可以跳出循环。

 

心得分享

 

很多初学Excel VBA Do循环的同学,都会在这两个循环上栽跟头,如果这个循环条件找不好,就很容易造成死循环。所以作者E图表述分享给大家一个小心得:While条件是看前门的,有票许可才能进来玩;Until条件是看后门的,有票许可才能出去走。

 

这样理解后,你在看上面的Until代码,是不是:当单元格为= ""时,结束语句,执行下面的Msgbox

 

3For…Next循环语句:

 

通过上面的案例我们可以发现循环语句的一个规律,都是先有初始值,再逐步累加或者累减改变循环变量,达到对不同对象的操作,For…Next循环也是如此,不过它更加的直接简便,看一个示例代码。

 

需求1:对A列的数值进行求和

 

Sub For循环()

  With Sheets("For循环")

    a = .[A1040000].End(3).Row

    For i = 1 To a

      b = b + .Cells(i, 1)

    Next i

    MsgBox "A列累加值=" & b

  End With

End Sub

 

 

【代码解析】

 

Line1使用工作表("For循环")作为同一系列对象的父级隶属关系;

 

Line2A1040000单元格,向上取末行的行号,并赋值给变量a

 

Line3For循环的起始语句,并规定出从1a,为循环范围;

 

Line4设定一个变量bb的值等于“b本身的值+单元格的值通过循环变量i的变化,将A列单元格遍历一遍,逐步累积求和。这句代码和i=i+1的格式差不多,本身的值加上某个值,达到累加的效果

 

Line5For循环的结束语句,如果下一个i值在范围内,则继续循环,否则跳出循环;

 

Line6Msgbox显示规定的文本说明性文字;

 

Line7With语句的结束语句。

 

需求2:还是这列数据,提取偶数行的值累加求和

 

很简单,一个小知识点就可以搞定的。For循环可以设定在循环范围内,每次循环的步距,只需要将上面的代码加一点点内容,如下:

 

 

循环变量从第2行开始,每次的步距(Step)为2个值的距离,那么整体i变量就是2468如此类推了。

 

相对于Do循环,For循环可以给出十分确切的起止范围,对于我们遍历工作表,遍历单元格是相当有用而且十分常用的循环方式,它也属于蓝色图解流程,先判断再执行。

 

4For Each x In y … Next循环语句:

 

这个语句严格来说,还是属于For…Next的结构,是另一种形式的表现,以后我们讲到字典的时候,还会再遇到这个结构,今天我们先来初窥端倪,举个例子:

 

需求:对选中的单元格区域进行求和

 

Sub Foreach循环()

  Dim rg As Range

  For Each rg In Selection

    a = a + rg.Value

  Next

  MsgBox "选中区域求和=" & a

End Sub

 

 

【代码解析】

 

Line1定义一个rg变量,为单元格变量;(后面我们会专门来讲定义变量的问题)

 

Line2这句代码用英语直译就好,在Selection(被选中的单元格区域)中,循环每一个rg单元格变量;

 

Line3累加给变量a

 

Line4For循环的结束语句,如果下一个rg值在Selection范围内,则继续循环,否则跳出循环;

 

Line5Msgbox显示规定的文本说明性文字。

 

这个结构的For循环,主要是指在一个指定的“对象集”中,遍历每一个单独对象,也属于蓝色图解流程,先判断再执行,如果在“对象集中,就执行语句,否则跳出循环。

 

【编后语】

 

今天的教程给大家介绍了VBA中最常见最重要语句之一循环语句。学到了循环,才能说明同学们“上道了,否则就真的只是手残VBA”,会看不会写。对于循环来说,初学者理解起来都需要过程,可是你要知道真正的实战中还有很多的变数等着我们去总结、去填坑,找个时间赶紧动手试一下吧,祝同学们早日写出自己的代码。
  下篇将继续为大家分享VBA中另一重要语句,判断语句。

 

本文配套的练习课件请加入QQ群:1043683754下载。

Excel高手,快速提升工作效率,部落窝教育《一周Excel直通车》视频和《Excel极速贯通班》直播课全心为你

扫下方二维码关注公众号,可随时随地学习Excel

IMG_256

相关推荐:

VBA基础教程②《VBA系列基础教程(二):使用RANGE对象实现单元格偏移及确定首末行列号

VBA基础教程①《VBA系列基础教程(一):excel中最常使用的对象——RANGE

VBA制作疫情地图《用excel制作全国动态疫情地图(VBA篇)》

VBA使excel自杀《灵异事件!一打开工作簿,文件就“自杀”了???》