| 在使用VBA表格出來程序的時候,最核心的邏輯有兩點,一是循環(huán),二是判斷語句。一般要么是循環(huán)里面嵌套判斷語句,要么就是判斷語句里面嵌套判斷語句。更復(fù)雜點的就是嵌套里面既有循環(huán)還有判斷。今天重點通過一個小小的例子,說明一下VBA中的常見的五種循環(huán)語句。 For ....next, Do while ....loop, Do ....loop until, While... wend, For each... in .. Next, 其中我最常用的是 For ....next ,Do while ....loop。 Do ....loop until,While... wend,這兩個基本上都可以被寫成 For ... Next, Do while ....loop的形式。 For each... in .. Next 主要是遍歷元素集合,比如數(shù)組,對象,文件什么。 初學(xué)者最好先掌握好For Next和Do While ... loop,然后再學(xué)一下IF ... Then ..的判斷語句。就基本上可以應(yīng)對大部分EXCEL表格處理的問題了,至少模擬一下EXCEL自帶的公式是綽綽有余了。 今天通過解決一個小問題來學(xué)習(xí)一下這五種循環(huán)。 問題:通過編寫VBA匹配生產(chǎn)企業(yè)中的省市名稱。比如要提取A列“中山市花城食品飲料有限公司”中的地級市名稱“中山”兩字到B列中,如下圖: 
 當(dāng)你知道你需要重復(fù)運行多少次某段語句時,可以使用For…Next語句。它的語法如下: For 計數(shù)器 = 開始 To 結(jié)束 [步長] 語句1 語句2 語句N Next [計數(shù)器] 比如計算2到100之間所有偶數(shù)之和,就可以這樣寫: Sub 求和() Dim Sum As Integer For i = 2 To 100 Step 2 Sum = Sum + i Next MsgBox Sum End Sub 將 i= 2 改為 i = 2,step 2改為 step 1(若步長為1 step 1 可以省略) 就是計算1加到100的和。 解決省市匹配的問題 如圖: 首先我們需要用for循環(huán)讀取要查找的企業(yè)名稱,A列從第2行到第33行: Dim strName as Sring for i = 2 to 33 strName = cells(i,1) next 然后我們需要用for循環(huán)讀取被查找的廣東省的省市地址關(guān)鍵詞,C列從第2行到第23行: Dim strAddr as Sring for j =2 to 23 strAddr = cells(j,1) next 再次我們需要在企業(yè)名稱里面(strName)查找廣東省的省市地址關(guān)鍵詞(strAddr),我們需要用到 Instr()這個函數(shù)。加上判斷語句是這樣的: IF Instr(strName,strAddr) > 0 Then Cells(i,2)=strAddr End IF 最后我們將我們的代碼匯總下: Sub 提取企業(yè)名稱省市() For i = 2 To 33 strName = Cells(i, 1) For j = 2 To 23 strAddr = Cells(j, 3) If InStr(strName, strAddr) > 0 Then Cells(i, 2) = strAddr End If Next Next End Sub 
 如果不知道循環(huán)多少次,可以用Do ..while循環(huán) 只要或者直到某個條件為真,它們就會重復(fù)一系列的語句。語法如下: Do While 條件 語句1 語句2 語句N Loop 或者也可以寫成第二種寫法: Do 語句1 語句2 語句N Loop While 條件 第二種寫法循環(huán)體內(nèi)的代碼至少會運行一次。 比如剛才的計算2到100之間所有偶數(shù)之和,就可以這樣寫: Sub 求和2() Dim Sum As Integer i =2  Do While i <> Sum = Sum + i Next MsgBox Sum End Sub 解決省市匹配的問題 ,思路是一樣的,只是用Do while 循環(huán)代替了For 循環(huán)。 首先我們需要用Do While循環(huán)讀取要查找的企業(yè)名稱,A列從第2行到第33行: Dim strName as Sring i = 2 Do While Cells(i, 1) <> '' strName = Cells(i, 1) i=i+1 Loop 然后我們需要用Do While循環(huán)讀取被查找的廣東省的省市地址關(guān)鍵詞,C列從第2行到第23行: Dim strAddr as Sring j = 2 Do while cells(j,3)<>'' strAddr = cells(j,3) next 再次我們需要在企業(yè)名稱里面(strName)查找廣東省的省市地址關(guān)鍵詞(strAddr),我們需要用到 Instr()這個函數(shù)。加上判斷語句是這樣的: IF Instr(strName,strAddr) > 0 Then Cells(i,2)=strAddr End IF 最后我們將我們的代碼匯總下: Sub 提取企業(yè)名稱省市W() i = 2 Do While Cells(i, 1) <> '' strName = Cells(i, 1) j = 2 Do While Cells(j, 3) <> '' strAddr = Cells(j, 3) If InStr(strName, strAddr) > 0 Then Cells(i, 2) = strAddr End If j = j + 1 Loop i = i + 1 Loop End Sub 
 可以解釋為不滿足 Until的條件時,執(zhí)行循環(huán)體內(nèi)的語句: Do Until 條件 語句1 語句2 語句N Loop 也可以講 Until放在后面,這樣循環(huán)體內(nèi)的語句至少執(zhí)行一次: Do Until 條件 語句1 語句2 語句N Loop 計算2到100之間所有偶數(shù)之和,就可以這樣寫: Sub 求和3() i = 2 Dim Sum As Integer Do Until i > 100 Sum = Sum + i i = i + 2 Loop MsgBox Sum End Sub 解決省市匹配的問題,代碼如下: Sub 提取企業(yè)名稱省市D() i = 2 Do Until Cells(i, 1) = '' strName = Cells(i, 1) j = 2 Do Until Cells(j, 3) = '' strAddr = Cells(j, 3) If InStr(strName, strAddr) > 0 Then Cells(i, 2) = strAddr End If j = j + 1 Loop i = i + 1 Loop End Sub 
 While…Wend循環(huán)功能上和Do…While循環(huán)一樣,它是從Microsoft Basic的早期版本遺留下來的并 且VBA保留它也是為了支持兼容性。該循環(huán)以關(guān)鍵字While開始以關(guān)鍵字Wend結(jié)束。這是它的語法: While 條件 語句1 語句2 語句N Wend 條件在循環(huán)的上面就被測試,只要提供的條件為真,這些語句就會被執(zhí)行。一旦條件為假,VB就將 退出該循環(huán)。 計算2到100之間所有偶數(shù)之和,就可以這樣寫: Sub 求和4() i = 2 Dim Sum As Integer While i<=>=> Sum = Sum + i i = i + 2 Wend MsgBox Sum End Sub 
 當(dāng)你的過程需要在一個集合的所有對象或者一個數(shù)組的所有元素(數(shù)組將在第七章里涉及)之間循 環(huán)時,應(yīng)該使用For Each…Next循環(huán)。該循環(huán)不需要計數(shù)器變量,VB自己知道應(yīng)該執(zhí)行幾次循環(huán)。 該循環(huán)的形式是: For Each 元素 In 組合 語句1 語句2 語句N Next [元素] 比如簡單的求和計算: Sub 求和5() Dim Num() As Variant Num = Array(1, 2, 3, 4, 5) Dim Sum As Integer For Each N In Num Sum = Sum + N Next MsgBox Sum End Sub 其中Num 為數(shù)組,For Each N In Num 時讀取數(shù)組里的每一個數(shù)值,然后執(zhí)行循環(huán)體內(nèi)的語句。 
 
 明顯可以看出For Next 循環(huán)要比其他Do while Loop 或 While Wend 代碼要簡潔一些,但需要提前知道循環(huán)的起點和終點。Do while Loop 或 While Wend用好的關(guān)鍵需要控制好循環(huán)的入口和出口,避免進入死循環(huán)。Do While Loop,Do Until Loop 和 While Wend 從對比圖中可以看出循環(huán)控制流程基本一致。 注1:Instr 用法:InStr([start,]string1,string2[,compare]) 參數(shù)說明 
 注2: Cells用法: Cells(i,j)中i指的是行數(shù),j指的是列數(shù),Cells(i,j)指的是第i行的第j列單元格。Cells(3,4)代表第3行D列的內(nèi)容。 | 
|  |