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

2021-12-08 14:30 更新

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


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

For Each 元素 In 組合
語(yǔ)句1
語(yǔ)句2
語(yǔ)句N
Next [元素]

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

現(xiàn)在,我們來(lái)使用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.  運(yùn)行過程RemoveSheets。



VB將會(huì)打開一個(gè)新工作簿并且刪除除Sheet1之外的所有工作表。注意,變量mySheet代表工作表集合里的所有對(duì)象。除了按通常的方法將對(duì)象變量聲明為Object類型,你還可以將它聲明為更具體的對(duì)象類型,這樣會(huì)更好。在這個(gè)具體的例子里,你可以使用下面的聲明:

Dim mySheet As Worksheet

而不是:


Dim mySheet As Object

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


這里是另外一個(gè)檢查某個(gè)工作表是否存在于一工作簿中:


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)

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

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

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

下面的過程示范如何使用Exit For語(yǔ)句提前跳出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里每個(gè)單元格的內(nèi)容,如果當(dāng)前單元格為空,VB就會(huì)在當(dāng)前單元格力輸入文本“empty”。當(dāng)VB遇到第一個(gè)非空單元格,它就會(huì)跳出循環(huán)。


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


3.  運(yùn)行過程EarlyExit


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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)