找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 422|回复: 1

[VBA程序]:VBA的循环结构

[复制链接]
发表于 2004-3-16 14:37:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
循环结构

VBA的循环结构有:For...Next循环、For Each...Next循环和Do...Loop循环。

   

For...Next循环

For...Next循环重复执行一组语句,直到循环次数达到指定次数为止。其格式如下:

For 〈变量〉=〈初值〉 To 〈终值〉 Step 〈步长〉

〈语句块〉

Next 〈变量〉

    下面举例说明For循环的使用方法。

    设计算机等级考试成绩存放在Deg_Score工作表上,其中笔试成绩存放在E列、上机成绩存放在F列,且这两个区域分别命名为Pening、Operating。现需要创建一个宏,将不及格的以红色显示、成绩优秀(笔试成绩和上机成绩都在85分以上)的以绿色显示。相应的VBA宏程序如下所示:

   

Sub DegreeScore( )

Dim i As Integer

For i = 1 To Range("Pening").Cells.Count

If Range("Penging").Cells(i) < 60 Then

   Range("Pening").Cells(i).Interior.Color = vbRed

End If

If Range("Operating").Cells(i) < 60 Then

   Range("Operating ").Cells(i).Interior.Color = vbRed

End If

If Range("Pening").Cells(i) > 85 And Range("Operating ").Cells(i) > 85 Then

   Range("Pening").Cells(i).Interior.Color = vbGreen

   Range("Operating ").Cells(i).Interior.Color = vbGreen

End If

Next i

End Sub

    其中,Range("Pening").Cells.Count给出了区域内单元格的个数;Range("Pening").Cells(i)返回Pening区域内的第i个单元格;Range对象的Interior属性返回引用的新对象:Interior对象。Interior对象控制单元格内部的颜色和图案格式。此外,在Visual Basic中已经为常用颜色预先定义了名字,引用时直接引用颜色的名字即可。

   

For Each...Next循环

    在Excel对象库中处理一类对象时,应使用集合。如WorkBooks(工作簿集合)、WorkSheets(工作表集合)等等,称为对象集或对象类。要从对象集合中选定单一对象,需要指明对象的序号或是对象的名称。例如,要得到Book2工作簿中第三页工作表的C9单元格数据,若不知道第三页工作表的名称,则可表示为:

    Workbooks(“Book2”).Worksheets(3).Range(“C9”)

        对于对象集或对象类,VBA提供了一种有效的循环控制结构:For Each循环,其格式如下:

    For Each 〈对象变量〉 In 〈对象集〉

   

〈语句块〉

Next 〈对象变量〉

    其中,For Each语句的作用类似于Set语句,将对象引用赋值给变量。不过For Each语句是将同一对象集中的每个对象引用依次赋值给同一变量。For Each循环的功能是为对象集中的每个对象重复执行一组语句。

    下面举例说明For Each循环的使用方法。

    Excel提供了打印预览工作表的方法,然而,每次只能对活动工作表进行打印预览。假设现有一个包含若个部门预算工作表的工作簿,在打印前需要预览每一个预算工作表,那么可使用For Each循环编写如下宏实现:

Sub PrintPreviewSheets( )

Dim mySheet As Worksheet

For Each mySheet In Worksheets

mySheet.Select

mySheet.PageSetup.Orientation = xlLandscape

mySheet.PrintPreview

Next mySheet

End Sub

    PrintPreviewSheets宏的执行过程是:依次将工作表集合中的每个对象(工作表)引用赋值给变量mySheet,再选定对象指针指向的对象(即激活工作表),然后将页打印方向设置为横向,最后打印预览该工作表。

    同样,可使用For循环编写宏实现上述功能:

Sub PrintPreviewSheets( )

Dim mySheet As Worksheet

Dim i As Integer

For i = 1 To Worksheets.Count

Set mySheet = Worksheets(i)

mySheet.Selete

mySheet.PageSetup.Orientation = xlLandscape

mySheet.PrintPreview

Next i

End Sub

    请注意区分:For语句是将一个值赋给变量,而For Each语句是将一个对象引用赋给变量。通常,使用For Each循环比使用For循环更方便、更快捷,但For循环的使用范围更广。例如,当需要利用计数器控制循环时,或要在两个同类的对象集(如两个区域)之间进行比较时,就只能使用For循环,而不能使用For Each循环。

   

Do…Loop循环

    For Each循环通过对象集来控制循环的执行与结束,For循环通过计数器的初值、终值、步长来控制循环执行的次数。然而在某些情况下,需要通过条件判断来控制循环的执行与结束。为此,Visual Basic提供了另一种更有效的循环控制结构:Do循环。

    Visual Basic提供了多种灵活的Do循环形式,一方面可以用Until 〈条件〉或while 〈条件〉来控制循环,另一方面Until 〈条件〉和while 〈条件〉既可放在Do语句中,也可放在Loop语句中,使用十分方便。其中,最常用的Do循环格式如下:

Do While 〈条件表达式〉

〈语句块〉

Loop

    该Do循环的功能是:只要条件为真,就重复执行语句块,直到条件为假时才结束循环,执行Loop语句的下一条语句。

    下面举例说明Do While循环的使用方法。

    假设需要对活动工作簿的Sheet1工作表先按第一列数据进行排序,然后删除包含重复数据的行,使用Do While循环编写如下VBA宏实现:

Sub DeleteRepeatData( )

Worksheets("Sheet1").Range("A1").Sort_

key1 :=Worksheets("Sheet1").Range("A1")

Set currentCell = Worksheets("Sheet1").Range("A1")

Do While Not IsEmpty(currentCell)

   Set nextCell = currentCell.Offset(1, 0)

   If nextCell.Value = currentCell.Value Then

       currentCell.EntireRow.Delete

   End If

   Set currentCell = nextCell

Loop

End Sub

    Do循环具有很强的适应性,但使用时必须保证在循环体内有产生循环结束的程序代码,以避免出现死循环。譬如,在本例中若没有Set currentCell = nextCell语句,就会出现死循环。

    VBA提供了功能强大的分支结构和循环结构。如果能将循环控制结构与条件控制结构联合使用,则可以设计出灵活多变、功能强大的宏。

*-*a
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-3-16 18:24:12 | 显示全部楼层
建议楼主把这些帖打包让我们下载,这样的话我们就不用一个帖一个帖的看了!:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 04:46 , Processed in 0.185137 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表