當你的過程需要在一個集合的所有對象或者一個數組的所有元素之間循環時,應該使用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
提前跳出循環
下面的過程示范如何使用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語句代替就行。