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

2021-12-08 14:29 更新

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

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

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


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

Do
語(yǔ)句1
語(yǔ)句2
語(yǔ)句N
Loop Until 條件

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


1.  在你前面創(chuàng)建的DoLoop模塊里輸入下面的過(guò)程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.  手動(dòng)在當(dāng)前工作簿里面插入一些工作表。在一個(gè)工作表里輸入一些數(shù)據(jù)與單元格A1;另一個(gè)工作表的單元格B2和C10里輸入一些數(shù)據(jù);第三個(gè)工作表里不要輸入任何數(shù)據(jù)。


3.  運(yùn)行過(guò)程DeleteBlankSheets。當(dāng)你運(yùn)行該過(guò)程時(shí),無(wú)論何時(shí),只要兩個(gè)條件都為真——屬性UsedRange返回單元格A1并且A1為空,VB就會(huì)刪除所選的工作表。屬性UsedRange應(yīng)用于對(duì)象Worksheet,包含工作表中的每個(gè)非空單元格以及他們之間的空單元格。


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


注意,當(dāng)刪除工作表的時(shí)候,Excel通常會(huì)顯示一個(gè)確認(rèn)對(duì)話框,如果你不想看到這個(gè)確認(rèn)提示框的話,就是要下列語(yǔ)句:

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

技巧:計(jì)數(shù)器

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


觀察過(guò)程執(zhí)行
當(dāng)你使用循環(huán)結(jié)構(gòu)運(yùn)行過(guò)程時(shí),有時(shí)很難看到該過(guò)程會(huì)按預(yù)期地執(zhí)行。有時(shí),你很想觀察程序慢慢地運(yùn)行,這樣你就能夠檢查該程序的邏輯。我們來(lái)看看VB如何讓你一行接一行地執(zhí)行程序。


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



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


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


While…Wend 循環(huán)

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


1.  在當(dāng)前工程里插入一新模塊,重命名為WhileLoop
2.  輸入下述過(guò)程:

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


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)