VB的For Each…Next循環(huán)

2021-12-08 14:30 更新

當(dāng)你的過程需要在一個集合的所有對象或者一個數(shù)組的所有元素之間循環(huán)時,應(yīng)該使用For Each…Next循環(huán)。該循環(huán)不需要計數(shù)器變量,VB自己知道應(yīng)該執(zhí)行幾次循環(huán)。我們拿工作表集合作個例子,要刪除工作簿里面的工作表,你首先不得不要選擇它,再選擇“編輯”-“刪除工作表”。如果要只留一個工作表在工作簿里面的話,你就不得不使用同樣的命令,次數(shù)取決于工作表的總數(shù)。因為每個工作表都是工作表集合里的一個對象,所以使用ForEach…Next循環(huán)來加速刪除工作表。


該循環(huán)的形式是:

For Each 元素 In 組合
語句1
語句2
語句N
Next [元素]

在上面的語法中,元素一個數(shù)組或者集合的所有元素都將被賦予的變量,如果是數(shù)組的話,該變量必須為Variant數(shù)據(jù)類型;如果是集合的話,則必須是個對象數(shù)據(jù)類型。組合是集合的名稱或者數(shù)組的名稱。

現(xiàn)在,我們來使用For Each…Next循環(huán)刪除工作表。


1.  在當(dāng)前工程里插入新模塊并且重命名為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

第一條指令A(yù)pplication.DisplayAlerts = False讓Excel在過程運行的時候不要顯示警告和信息。如果你忽略了它,Excel將會要你確認(rèn)是否刪除所選的工作表。接下來,過程打開一個新工作簿并且選擇Sheet2。ForEach…Next循環(huán)遍歷每個工作表(從所選的Sheet2開始)并且刪除它們。當(dāng)過程結(jié)束的時候,該工作簿只剩一個工作表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

提前跳出循環(huán)

有時候,你并不想等到循環(huán)自己結(jié)束,可能是用戶輸入了錯誤的數(shù)據(jù),過程遇到了錯誤或者可能是任務(wù)已經(jīng)完成并且沒有必要作更多的循環(huán)。你可以提前跳出循環(huán),而不必等到條件正常結(jié)束。VB有兩種Exit語句:

①Exit For語句用來提前退出For…Next或者For Each…Next循環(huán)

②Exit Do語句立即退出任何VBA Do 循環(huán)

下面的過程示范如何使用Exit For語句提前跳出For Each…Next循環(huán):
1.  在當(dāng)前模塊里輸入下列過程:
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過程檢查特定區(qū)域A1:H10里每個單元格的內(nèi)容,如果當(dāng)前單元格為空,VB就會在當(dāng)前單元格力輸入文本“empty”。當(dāng)VB遇到第一個非空單元格,它就會跳出循環(huán)。


2.  打開一個新工作簿并且在單元格區(qū)域A1:H10的任意單元格里輸入數(shù)據(jù)


3.  運行過程EarlyExit


技巧:退出過程
如果你想提前退出子過程,那么可以使用ExitSub語句。如果該過程是一個函數(shù)的話,就使用Exit Function語句代替就行。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號