当你的过程需要在一个集合的所有对象或者一个数组的所有元素之间循环时,应该使用For Each…Next循环。该循环不需要计数器变量,VB自己知道应该执行几次循环。我们拿工作表集合作个例子,要删除工作簿里面的工作表,你首先不得不要选择它,再选择“编辑”-“删除工作表”。如果要只留一个工作表在工作簿里面的话,你就不得不使用同样的命令,次数取决于工作表的总数。因为每个工作表都是工作表集合里的一个对象,所以使用ForEach…Next循环来加速删除工作表。
该循环的形式是:
For Each 元素 In 组合 语句1 语句2 语句N Next [元素]
在上面的语法中,元素一个数组或者集合的所有元素都将被赋予的变量,如果是数组的话,该变量必须为Variant数据类型;如果是集合的话,则必须是个对象数据类型。组合是集合的名称或者数组的名称。
现在,我们来使用For Each…Next循环删除工作表。
1. 在当前工程里插入新模块并且重命名为ForEachNextLoop
2. 在模块ForEachNextLoop里输入下列过程:
Sub RemoveSheets() Dim mySheet As Worksheet Application.DisplayAlerts = False Workbooks.Add Worksheets("Sheet2").Select For Each mySheet In Worksheets ActiveWindow.SelectedSheets.Delete Next mySheet End Sub
3. 运行过程RemoveSheets。
VB将会打开一个新工作簿并且删除除Sheet1之外的所有工作表。注意,变量mySheet代表工作表集合里的所有对象。除了按通常的方法将对象变量声明为Object类型,你还可以将它声明为更具体的对象类型,这样会更好。在这个具体的例子里,你可以使用下面的声明:
Dim mySheet As Worksheet
而不是:
Dim mySheet As Object
第一条指令Application.DisplayAlerts = False让Excel在过程运行的时候不要显示警告和信息。如果你忽略了它,Excel将会要你确认是否删除所选的工作表。接下来,过程打开一个新工作簿并且选择Sheet2。ForEach…Next循环遍历每个工作表(从所选的Sheet2开始)并且删除它们。当过程结束的时候,该工作簿只剩一个工作表Sheet1了。
这里是另外一个检查某个工作表是否存在于一工作簿中:
Sub IsSuchSheet() Dim mySheet As Worksheet Dim counter As Integer counter = 0 For Each mySheet In Worksheets If mySheet.name = "Sheet2" Then counter =counter 1 End If Next mySheet If counter = 1 Then MsgBox "This workbook contains Sheet2." Else MsgBox "Sheet2 was not found." End if End Sub
提前跳出循环
有时候,你并不想等到循环自己结束,可能是用户输入了错误的数据,过程遇到了错误或者可能是任务已经完成并且没有必要作更多的循环。你可以提前跳出循环,而不必等到条件正常结束。VB有两种Exit语句:
①Exit For语句用来提前退出For…Next或者For Each…Next循环
②Exit Do语句立即退出任何VBA Do 循环
下面的过程示范如何使用Exit For语句提前跳出For Each…Next循环:
1. 在当前模块里输入下列过程:
Sub EarlyExit() Dim myCell As Range For Each myCell in Range("A1:H10") If myCell.Value = "" Then myCell.Value = "empty" Else Exit For End If Next myCell End Sub
EarlyExit过程检查特定区域A1:H10里每个单元格的内容,如果当前单元格为空,VB就会在当前单元格力输入文本“empty”。当VB遇到第一个非空单元格,它就会跳出循环。
2. 打开一个新工作簿并且在单元格区域A1:H10的任意单元格里输入数据
3. 运行过程EarlyExit
技巧:退出过程
如果你想提前退出子过程,那么可以使用ExitSub语句。如果该过程是一个函数的话,就使用Exit Function语句代替就行。