前面我們介紹過Excel的對(duì)象模型及一些常用的對(duì)象,也解過對(duì)象變量的概念及聲明對(duì)象變量的方法。其實(shí),在絕大多數(shù)情況下,我們都是通過使用Excel VBA操縱Excel對(duì)象來達(dá)到我們的目的。例如,我們可以操作工作表對(duì)象,為工作表命名、排序工作表、統(tǒng)計(jì)工作表個(gè)數(shù);我們可以操作單元格對(duì)象,在單元格區(qū)域中填充內(nèi)容、查找有指定內(nèi)容的單元格;等等。
為方便操控Excel對(duì)象,VBA提供了For Each-Next結(jié)構(gòu),可以在對(duì)象組成的集合中循環(huán),給集合中的所有對(duì)象執(zhí)行操作,或者集合中滿足相關(guān)條件的對(duì)象執(zhí)行操作。
使用For Each-Next結(jié)構(gòu),我們無需知道集合中對(duì)象的數(shù)目,只需要聲明相應(yīng)的對(duì)象變量,編寫執(zhí)行操作的指令。
For Each-Next結(jié)構(gòu)的語法如下:
For Each 對(duì)象變量In 對(duì)象集合
[語句塊]
[Exit For]
[語句塊]
Next [對(duì)象變量]
說明:
按照慣例,方括號(hào)中的內(nèi)容表示可選項(xiàng)。
對(duì)象變量在使用前需要進(jìn)行聲明。
Exit For語句表示提前退出循環(huán)。
無需知道集合中的對(duì)象數(shù)目。
可以與其它語法結(jié)構(gòu)相互嵌套。
下面通過示例來演示For Each-Next結(jié)構(gòu)的使用。
示例1:下面的代碼遍歷當(dāng)前工作簿中的工作表并依次顯示工作表的名字。
Sub ForEach1()
Dim wks As Worksheet ‘聲明工作表對(duì)象變量
‘遍歷工作表集合并依次顯示工作表的名字
For Each wks In Worksheets
MsgBox “工作表的名字是:”& wks.Name
Next wks
End Sub
示例2:通過改進(jìn)上面的示例1,在顯示工作表名字時(shí)表明是第幾個(gè)工作表,最后統(tǒng)計(jì)出工作簿中的工作表數(shù),代碼如下。
Sub ForEach2()
Dim wks As Worksheet ‘聲明工作表對(duì)象變量
Dim i As Long ‘聲明用于統(tǒng)計(jì)工作表數(shù)的變量
i = 0 ‘給變量賦初始值
For Each wks In Worksheets
i = i + 1
MsgBox “第” &i & “個(gè)工作表的名字是:” & wks.Name
Next wks
MsgBox “本工作簿共有” & i& “個(gè)工作表.”
End Sub
示例3:下面的代碼遍歷當(dāng)前工作表的單元格區(qū)域A1:A5,并依次顯示每個(gè)單元格中的內(nèi)容。
Sub ForEach3()
Dim cell As Range ‘聲明單元格對(duì)象變量
‘遍歷單元格區(qū)域A1:A5并依次顯示單元格內(nèi)容
For Each cell In Range(“A1:A5”)
MsgBox cell.Value
Next cell
End Sub
示例4:下面的代碼與示例3的效果相同,但我們?cè)O(shè)置了代表單元格區(qū)域的對(duì)象變量并賦值,讓For Each結(jié)構(gòu)在對(duì)象變量代表的區(qū)域內(nèi)循環(huán)遍歷。
Sub ForEach4()
Dim cell As Range, rng As Range ‘聲明單元格對(duì)象變量
‘設(shè)置rng變量的值
Set rng = Range(“A1:A5”)
‘遍歷rng對(duì)象變量代表的單元格區(qū)域并依次顯示單元格內(nèi)容
For Each cell In rng
MsgBox cell.Value
Next cell
End Sub
示例5:下面的代碼結(jié)合If-Then結(jié)構(gòu)判斷滿足相應(yīng)條件的單元格數(shù)。
如下圖所示,要統(tǒng)計(jì)成績(jī)大于80分的學(xué)生人數(shù)。
運(yùn)行下面的代碼即可。
Sub ForEach5()
Dim cell As Range, rng As Range ‘聲明單元格對(duì)象變量
Dim i As Long ‘聲明計(jì)數(shù)變量
‘設(shè)置rng變量的值
Set rng = Range(“B2:B9”)
i = 0
‘遍歷rng對(duì)象變量代表的單元格區(qū)域
‘并判斷單元格中的值是否大于80
For Each cell In rng
If cell.Value > 80 Then
i = i + 1
End If
Next cell
MsgBox “共有” & i& “名學(xué)生超過80分.”
End Sub
代碼在For Each循環(huán)結(jié)構(gòu)中使用If-Then語句來檢查每個(gè)單元格中的值,如果其值大于80,變量i就增加1。