編按:哈嘍,大家好!今天是第三篇VBA實戰入門教程,我們將給大家帶來VBA中最常見語句之一,循環語句。典型的循環語句有4種,分別是Do While…Loop循環、Do…Loop Until循環、For…Next循環、For Each x In y … Next循環。查看循環邏輯圖可以更快理解循環語句。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
【前言】
在看過我們前兩篇的VBA實戰入門教程後,有沒有興趣繼續學習呢?也許同學們的興趣早就有了,但就是還沒有找到入門的路,當然了前面的兩篇文章也算不得是讓你入門的途徑,充其量也就是一道「開胃菜」。繼續跟上作者E圖表述的步伐,我不會讓你像「啞巴英語」似的,變成只會看不會寫的「手殘VBA」。那如果前兩篇的文章讓你了解了一些單元格對象的屬性,那現階段,你就需要了解寫代碼中不可規避、而又十分重要的兩個「語句」!
一、循環語句
1.給一個單元格的賦值
在前面的文章中,同學們應該抓住了一個知識點,就是對單元格的賦值過程。什麼是賦值呢?就是將一個表達式的結果,輸入到某一個(某一個區域)單元格對象的VALUE屬性中,例如下面的寫法:
Sub 賦值1()
Sheets("A").[A1] = Sheets("A").[A1].Row
End Sub
【代碼解析】
Line1:將工作表A的A1單元格的ROW屬性,賦值給工作表A的A1單元格。
2.給10個單元格賦值
下面我們提高一些需求難度,給A1:A10單元格賦值,如果你能看懂上面的代碼,那就非常簡單了,寫10行代碼就是了。
Sub 賦值2()
With Sheets("A")
.[A1] = .[A1].Row
.[A2] = .[A2].Row
.[A3] = .[A3].Row
.[A4] = .[A4].Row
.[A5] = .[A5].Row
.[A6] = .[A6].Row
.[A7] = .[A7].Row
.[A8] = .[A8].Row
.[A9] = .[A9].Row
.[A10] = .[A10].Row
End With
End Sub
除了寫的內容多了之外,沒什麼問題,何況我們還可以使用複製粘貼,再改單元格地址,也不是很麻煩。
3.給100個單元格賦值,不,玩大點兒,給10W個單元格賦值
同學們,你準備寫10W條命令行嗎?直接一些,給你答案,代碼如下:
Sub 賦值3()
For i = 1 To 100000
With Sheets("A")
.Cells(i, 1) = .Cells(i, 1).Row
End With
Next i
End Sub
Line1:設定循環變量i,循環的範圍是從1開始,到100000結束;
Line2:使用Sheets("A")作為同一系列對象的父級隸屬關係;
Line3:操作Sheets("A")中,從Cells(1, 1)開始的,Cells(2, 1),……,Cells(i, 1) ,……,到Cells(100000, 1)為止的對象,並將對應的ROW屬性賦值給對應單元格;
Line4:結束With語句;
Line5:循環語句的結束語句,滿足循環條件時,繼續循環,不滿足條件時,跳出循環。
上面就是一個用循環語句寫的給10W個單元格賦值的代碼,加上WITH語句,也就5行命令行。不需要寫那麼多的命令代碼,利用循環代碼,可以很方便的操作你需要的數據源,這就是循環語句最根本的優勢。
4.循環邏輯圖解
作者E圖表述認為循環的流程,歸納後也就上面的兩種格式,其主要的差別就是:藍色的流程是先考慮循環條件,滿足時才執行語句,不滿足時跳出循環;橙色的流程是先執行語句,再判斷循環變量是否滿足條件,如果不滿足,則循環到執行語句再次運行,否則跳出循環。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
5.循環語句的兩種語法形態
在EXCEL VBA中有兩種循環語句,簡單來說:一種是Do循環,一種是For循環,而它們又分別有兩種格式。
1)Do While…Loop循環語句,舉例如下:
需求:在工作表「Do循環」的A列中,找到第一個空單元格。
Sub DoWhile循環()
i = 1
With Sheets("Do循環")
Do While .Cells(i, 1) <> ""
i = i + 1
Loop
MsgBox "第一個空單元格是" & .Cells(i, 1).Address
End With
End Sub
【代碼解析】
Line1:確定循環變量初始值為1;
Line2:使用Sheets("Do循環")作為同一系列對象的父級隸屬關係;
Line3:循環語句的起始語句,While(循環條件)為單元格不為空;
Line4:單元格不為空的時候,循環條件滿足,執行語句i=i+1。這句代碼相當的重要,俗稱「計數器」,尤其在循環語句中,起到使變量規律性的累增或者累減的效果,當再次使用變量的時候會使對象的引用發生規律性改變;
Line5:循環語句的結束語句,返回到Line3,進行新的i值的判斷。當單元格為空時,循環條件不滿足,跳出循環;
Line6:Msgbox顯示規定的文本說明性文字,即「第一個空單元格是…」。
Do While…Loop的循環結構,滿足循環流程圖解裡面的藍色流程,屬於先判斷條件再運行的結構。
2)Do…Loop Until循環語句,舉例如下:
需求:還以上例為題,使用Until的方式找到第一個空單元格。
Sub DoUntil循環()
i = 1
With Sheets("Do循環")
Do
i = i + 1
Loop Until .Cells(i, 1) = ""
MsgBox "第一個空單元格是" & .Cells(i, 1).Address
End With
End Sub
代碼就不解析了,基本和Do While…Loop的代碼一樣,唯獨循環條件的位置和寫法不一樣。
Do…Loop Until的循環結構,滿足循環流程圖解裡面的橙色流程,屬於先執行語句,再判斷條件是否滿足,如果不滿足條件,繼續循環,滿足的時候才可以跳出循環。
心得分享
很多初學Excel VBA Do循環的同學,都會在這兩個循環上栽跟頭,如果這個循環條件找不好,就很容易造成「死循環」。所以作者E圖表述分享給大家一個小心得:While條件是看「前門」的,有票許可才能進來玩;Until條件是看「後門」的,有票許可才能出去走。
這樣理解後,你在看上面的Until代碼,是不是:當單元格為= ""時,結束語句,執行下面的Msgbox。
3)For…Next循環語句:
通過上面的案例我們可以發現循環語句的一個規律,都是先有初始值,再逐步累加或者累減改變循環變量,達到對不同對象的操作,For…Next循環也是如此,不過它更加的直接簡便,看一個示例代碼。
需求1:對A列的數值進行求和
Sub For循環()
With Sheets("For循環")
a = .[A1040000].End(3).Row
For i = 1 To a
b = b + .Cells(i, 1)
Next i
MsgBox "A列累加值=" & b
End With
End Sub
【代碼解析】
Line1:使用工作表("For循環")作為同一系列對象的父級隸屬關係;
Line2:以A1040000單元格,向上取末行的行號,並賦值給變量a;
Line3:For循環的起始語句,並規定出從1到a,為循環範圍;
Line4:設定一個變量b,b的值等於「b本身的值+單元格的值」,通過循環變量i的變化,將A列單元格遍歷一遍,逐步累積求和。這句代碼和i=i+1的格式差不多,本身的值加上某個值,達到累加的效果;
Line5:For循環的結束語句,如果下一個i值在範圍內,則繼續循環,否則跳出循環;
Line6:Msgbox顯示規定的文本說明性文字;
Line7:With語句的結束語句。
需求2:還是這列數據,提取偶數行的值累加求和
很簡單,一個小知識點就可以搞定的。For循環可以設定在循環範圍內,每次循環的步距,只需要將上面的代碼加一點點內容,如下:
循環變量從第2行開始,每次的步距(Step)為2個值的距離,那麼整體i變量就是2、4、6、8、…如此類推了。
相對於Do循環,For循環可以給出十分確切的起止範圍,對於我們遍歷工作表,遍歷單元格是相當有用而且十分常用的循環方式,它也屬於藍色圖解流程,先判斷再執行。
4)For Each x In y … Next循環語句:
這個語句嚴格來說,還是屬於For…Next的結構,是另一種形式的表現,以後我們講到字典的時候,還會再遇到這個結構,今天我們先來初窺端倪,舉個例子:
需求:對選中的單元格區域進行求和
Sub Foreach循環()
Dim rg As Range
For Each rg In Selection
a = a + rg.Value
Next
MsgBox "選中區域求和=" & a
End Sub
【代碼解析】
Line1:定義一個rg變量,為單元格變量;(後面我們會專門來講定義變量的問題)
Line2:這句代碼用英語直譯就好,在Selection(被選中的單元格區域)中,循環每一個rg單元格變量;
Line3:累加給變量a;
Line4:For循環的結束語句,如果下一個rg值在Selection範圍內,則繼續循環,否則跳出循環;
Line5:Msgbox顯示規定的文本說明性文字。
這個結構的For循環,主要是指在一個指定的「對象集」中,遍歷每一個單獨對象,也屬於藍色圖解流程,先判斷再執行,如果在「對象集」中,就執行語句,否則跳出循環。
【編後語】
今天的教程給大家介紹了VBA中最常見最重要語句之一循環語句。學到了循環,才能說明同學們「上道」了,否則就真的只是「手殘VBA」,會看不會寫。對於循環來說,初學者理解起來都需要過程,可是你要知道真正的實戰中還有很多的變數等著我們去總結、去填坑,找個時間趕緊動手試一下吧,祝同學們早日寫出自己的代碼。下篇將繼續為大家分享VBA中另一重要語句,判斷語句。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
****部落窩教育-excel循環語句邏輯理解****
原創:E圖表述/部落窩教育(未經同意,請勿轉載)
更多教程:部落窩教育