VB的Do…Until和While…Wend循環(huán)語句

2021-12-08 14:29 更新

除了Do...while以外,還有另外一種方便的循環(huán)語句Do…Until,也可以讓你重復一條或多條語句,直到條件為真。換句話說,Do…Until語句是只要當某個條件為假的時候重復一塊代碼。這是它的語法:

Do Until 條件
語句1
語句2
語句N
Loop
使用上面的語法,你可以將前面的過程ApplyBold重新寫成下面的方式:

Sub ApplyBold2()
Do Until IsEmpty(ActiveCell)
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Loop
End Sub
該過程的第一條語句意思是執(zhí)行下列語句,直到遇到第一個空單元格。結果上,如果當前單元格不為空,VB就執(zhí)行循環(huán)內(nèi)部的那兩條語句。只要條件IsEmpty(ActiveCell)測試為假,這個過程就反復繼續(xù)著。因為過程ApplyBold2在循環(huán)的前面就測試條件,如果第一個單元格就為空的話,循環(huán)內(nèi)部的語句就不會運行。


和Do…While循環(huán)類似,Do…Until循環(huán)也有第二種語法讓你在循環(huán)的底部測試條件:

Do
語句1
語句2
語句N
Loop Until 條件

如果你想要程序至少執(zhí)行一次,那么就將條件放置于Loop語句一行,無論條件的值是什么。我們來試驗一下下面的例子,該例子將工作簿里的空工作表刪除。


1.  在你前面創(chuàng)建的DoLoop模塊里輸入下面的過程DeleteBlankSheets:

Sub DeleteBlankSheets()
Dim myRange As Range
Dim shcount As Integer
shcount = Worksheets.Count
Do
Worksheets(shcount).Select
Set myRange = ActiveSheet.UsedRange
If myRange.Address = "$A$1" And _
Range("A1").Value = "" Then
Application.DisplayAlerts = False
Worksheets(shcount).Delete
Application.DisplayAlerts = True
End If
shcount = shcount - 1
Loop Until shcount = 1
End Sub
2.  手動在當前工作簿里面插入一些工作表。在一個工作表里輸入一些數(shù)據(jù)與單元格A1;另一個工作表的單元格B2和C10里輸入一些數(shù)據(jù);第三個工作表里不要輸入任何數(shù)據(jù)。


3.  運行過程DeleteBlankSheets。當你運行該過程時,無論何時,只要兩個條件都為真——屬性UsedRange返回單元格A1并且A1為空,VB就會刪除所選的工作表。屬性UsedRange應用于對象Worksheet,包含工作表中的每個非空單元格以及他們之間的空單元格。


例如,如果你在單元格B2和C10里輸入里東西(包括格式),使用了的區(qū)域為$B$2:$C$10。如果你后面又在A1里輸入了數(shù)據(jù),那么UsedRange將會是$A$1:$C$10。已使用區(qū)域是一個從左上角最遠的地方到右下角最遠的地方包圍起來的區(qū)域。因為工作簿至少要保留一個工作表,所以代碼執(zhí)行到變量shcount等于1時就停止了。語句shcount = shcount-1確保變量shcount在循環(huán)里面的代碼每執(zhí)行一次就減少1。變量shcount的值在過程的開始處用下列語句:Worksheets.Count初始化了。


注意,當刪除工作表的時候,Excel通常會顯示一個確認對話框,如果你不想看到這個確認提示框的話,就是要下列語句:

Application.DisplayAlerts = False
當你完成任務時,使用下列語句,再打開系統(tǒng)信息。
Application.DisplayAlerts = True

技巧:計數(shù)器

計數(shù)器是個數(shù)字變量,用來追蹤已進行的項目次數(shù)。上面的過程DeleteBlankSheets聲明了變量shcount來追蹤檢查的工作表個數(shù)。計數(shù)器變量必須在程序的開始就被初始化(賦值),這可以確保你總能在開始使用之前知道計數(shù)器的確切值。計數(shù)器可以按照確定的值增加或減少。


觀察過程執(zhí)行
當你使用循環(huán)結構運行過程時,有時很難看到該過程會按預期地執(zhí)行。有時,你很想觀察程序慢慢地運行,這樣你就能夠檢查該程序的邏輯。我們來看看VB如何讓你一行接一行地執(zhí)行程序。


1.  在單元格區(qū)域A1:A5里面輸入任何數(shù)據(jù)
2.  選擇單元格A1
3.在Excel窗口,選擇“工具”-“宏”-“運行宏”
4.  在宏對話框里,選擇ApplyBold2并點擊“單步執(zhí)行”按鈕。VB編輯屏幕將出現(xiàn),過程的名稱被黃色加亮(參加圖6-1)。注意代碼窗口左邊的黃色箭頭。



圖6-1 觀察程序一行接一行地執(zhí)行


5.  使VB窗口縮小一些,可以點擊VB標題欄的“還原”按鈕縮小窗口
6.按下F8,黃色加亮區(qū)將跳到DoUntil IsEmpty(ActiveCell)行
7.繼續(xù)按F8,同時觀察代碼和工作表窗口


While…Wend 循環(huán)

While…Wend循環(huán)功能上和Do…While循環(huán)一樣,它是從Microsoft Basic的早期版本遺留下來的并且VBA保留它也是為了支持兼容性。該循環(huán)以關鍵字While開始以關鍵字Wend結束。這是它的語法:
While 條件
語句1
語句2
語句N
Wend
條件在循環(huán)的上面就被測試,只要提供的條件為真,這些語句就會被執(zhí)行。一旦條件為假,VB就將退出該循環(huán)。我們來看一個使用While…Wend循環(huán)結構的過程:


1.  在當前工程里插入一新模塊,重命名為WhileLoop
2.  輸入下述過程:

Sub ChangeRHeight()
While ActiveCell <>""
ActiveCell.RowHeight = 28
ActiveCell.Offset(1, 0).Select
Wend
End Sub
3.  在單元格區(qū)域B1:B4里輸入一些數(shù)據(jù)
4.  選擇單元格B1并且運行過程ChangeRHeight。當當前單元格不為空時,上面的過程ChangeRHeight將設置行高位28。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號