. 循环结构VBA的循环结构有:For...Next循环、For Each...Next循环和Do...Loop循环。 For...Next循环For...Next循环重复执行一组语句,直到循环次数达到指定次数为止。其格式如下: For 〈变量〉=〈初值〉 To 〈终值〉 Step 〈步长〉 〈语句块〉 Next 〈变量〉 下面举例说明For循环的使用方法。 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 For Each...Next循环在Excel对象库中处理一类对象时,应使用集合。如WorkBooks(工作簿集合)、WorkSheets(工作表集合)等等,称为对象集或对象类。要从对象集合中选定单一对象,需要指明对象的序号或是对象的名称。例如,要得到Book2工作簿中第三页工作表的C9单元格数据,若不知道第三页工作表的名称,则可表示为:Workbooks(“Book2”).Worksheets(3).Range(“C9”) 对于对象集或对象类,VBA提供了一种有效的循环控制结构:For Each循环,其格式如下: For Each 〈对象变量〉 In 〈对象集〉 〈语句块〉 其中,For Each语句的作用类似于Set语句,将对象引用赋值给变量。不过For Each语句是将同一对象集中的每个对象引用依次赋值给同一变量。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,再选定对象指针指向的对象(即激活工作表),然后将页打印方向设置为横向,最后打印预览该工作表。 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循环。 Do While 〈条件表达式〉 〈语句块〉 Loop 该Do循环的功能是:只要条件为真,就重复执行语句块,直到条件为假时才结束循环,执行Loop语句的下一条语句。 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语句,就会出现死循环。 3. 自定义函数 在VBA的整个程序结构中,自定义函数是非常重要且十分方便的工具。 〈语句块〉 下面举例说明用户如何建立自定义函数。 Function Random(Optional Midpoint = 0.5, Optional Range = 0.5, Optional Round = False) Application.Volatile True Random = Rnd * (Range * 2) + (Midpoint - Range) If Round Then Random = CLng(Random) End If End Function 其中: |
|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )
GMT+8, 2024-5-28 07:38 , Processed in 0.065597 second(s), 16 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.