雖然宏的功能可以讓一部分的工作自動化執行, 但只能機械地錄製用戶的操作, 自動錄製的代碼只能按循序執行, 相當於照本宣科或鸚鵡學舌, 條件判斷語句和迴圈語句無法通過錄製巨集產生。 但程式碼的強大和智慧卻主要是因為可以按條件判斷進行跳轉的選擇和迴圈控制結構。
迴圈語句, 它可能重複執行一系列代碼, 從而批量地完成工作任務。 迴圈語句在實際工作中應用極廣, 且因為迴圈語句不可能利用錄製巨集產生, 所以必須潛心掌握它的所語法與結構。
1 For…NextSub 匯總1到100的奇數2()
Dim Item As Byte, Total As Integer '定義兩個變數,
For Item = 1 To 100 Step 2 '從1到100,步長值為2
Total = Total + Item '如果計數器的值是奇數則累加到變數Total中
Next Item '執行下一輪迴圈
MsgBox Total '報告最終結果
End Sub
Sub 刪除空白儲存格所在行()
'定義兩個變數, 前者表示迴圈語句的計數器, 後者用於存放所有已刪除行的行號
Dim Item As Integer, RowName As String
'從B列最後一個非空儲存格的行號開始, 到第一行結束, 步長值為負1
For Item = Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1
If Len(Cells(Item, "B")) = 0 Then '如果儲存格中沒有字元
Rows(Item).Delete '那麼刪除整行
RowName = RowName & Chr(13) & Item '記錄被刪除的行
End If
Next Item
If Len(RowName) > 0 Then MsgBox "以下行已成功刪除:" & RowName '如果變數RowName非空則報告已刪除的行號
End Sub
2 For Each...NextSub 定位大於某值的所有儲存格()
If TypeName(Selection) <> "Range" Then End '如果選擇物件不是儲存格,那麼結束程式
'定義Range型的變數, 用於代表操作區域, 使用變數參與後續運算可提升代碼效率
Dim 操作區域 As Range
If Selection.Cells.Count = 1 Then '如果只選擇了單個儲存格
Set 操作區域 = ActiveSheet.UsedRange '將變數賦值為活動工作表的已用區域
Else '否則
Set 操作區域 = Intersect(ActiveSheet.UsedRange, Selection) '將變數賦值為選區與已用區域的交集
End If
'定義兩個Range型的變數,和一個變體型變數"參照值",該變數必須用變體量, 否則無法區別用戶輸入了0還是按下了"取消"按鈕
Dim 儲存格 As Range, 目的地區域 As Range, 參照值
參照值 = Application.InputBox("請指定參照值:", "參照值", , , , , , 1) '讓用戶在輸入框中輸入參照值
If 參照值 = "False" Then End '如果用戶按下了取消鍵則結束程式
For Each 儲存格 In 操作區域
'遍歷"操作區域"的每一個元素
If IsNumeric(儲存格) Then '如果變數"儲存格"的值是數值
If 儲存格.Value > 參照值 Then '如果"儲存格"的值大於"參照值"
'如果"目的地區域"尚未初始化,那麼將"儲存格"賦值給"目的地區域",否則將"目的地區域"與"儲存格"合併,再賦值給"目的地區域"
If 目的地區域 Is Nothing Then Set 目的地區域 = 儲存格 Else Set 目的地區域 = Union(目的地區域, 儲存格)
End If
End If
Next 儲存格
If Not 目的地區域 Is Nothing Then 目的地區域.Select '如果"目的地區域"已初始化則選中"目的地區域"
End Sub
'代碼思路分析:
'首先判斷當前選擇的物件是否儲存格, 不是儲存格則結束程式
'然後設置迴圈語句的操作物件, 當使用者只選擇單個儲存格時, 用ActiveSheet.UsedRange 作為操作物件(即在此區域中迴圈)
'當用戶選擇多個儲存格則用選區與 ActiveSheet.UsedRange的交集作為操作對象
'接著通過Application.InputBox方法彈出輸入框讓用戶指定參照值, 將Application.InputBox的最後一個參數設置為1, 表示只能輸入數值
'最後通過For Each...Next迴圈逐一判斷指定區域中的每個儲存格是否符合條件, 使用 Union方法將所有符合條件的儲存格合併為一個Range物件
'當迴圈完畢後判斷是否有符合條件的儲存格,
Sub 在第幾行處超過500()
Dim total, Item As Integer '聲明變數,前者存放合計,後者表示計數器
Item = 1 '預先賦值1,因為產量從第二行開始
While total
Item = Item + 1 '累加計數器
total = total + Cells(Item, 2) '將儲存格逐個累加至變數中
Wend
MsgBox Cells(Item, "A") & "日時超過500" & _
Chr(10) & "當前值為" & total
End Sub
'代碼思路分析:
'首先將變數Item賦值預設值1, 然後在While Wend迴圈語句中累加第2列的產量, 從第2個儲存格開始
'只要累計值小於500就繼續執行下去
'當首次遇到大於等於500的儲存格時, 迴圈語句會停止, 此時儲存格Cells(Item,"A")的日期則是產量超過500的日期
Sub 判斷B列的工號是否重複2()
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始, 所以初始值採用2
繼續 = True '設置變數的預設值為True
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最的一個非空儲存格的行號
While 繼續
'只要變數值等於True就繼續執行
'如果儲存格Cells(行號, "B")不是空白儲存格, 而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
''判斷儲存格Cells(行號, "B")的值是否重複, 將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) = 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
End '提示用戶後結束過程
End If
行號 = 行號 + 1 '累加計數器
Wend
'如果變數的值等於False, 表示已經出現重複值, 那麼提示用戶
If 繼續 = False Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
'代碼思路分析:
'本例和前面的代碼思路一致, 只不過為了避免出現兩個空白儲存格時也按重複處理, 加了一些必要地判斷
'判斷包括兩個:其一是 Cells(行號, "B")儲存格的值的長度大於0時才計算 Cells(行號, "B")儲存格是否重複
'其二是變數“行號”的值必須小於等B列最後一個非空行的值。
4 Do While...LoopSub 判斷B列的工號是否重複2() 'Do While condition…Loop
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
繼續 = True '設置變數的預設值為True
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do While 繼續 '只要變數值等於True就繼續執行
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) = 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = False Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
5 Do Until...LoopSub 判斷B列的工號是否重複3() 'Do Until condition…Loop
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do Until 繼續 '只要變數值等於True就繼續執行
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) > 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = True Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
6 Do...Loop WhileSub 判斷B列的工號是否重複4() 'Do…Loop While condition
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) = 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop While 繼續 '只要變數值等於True就繼續執行
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = False Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
7 Do...Loop UntilSub 判斷B列的工號是否重複5() 'Do…Loop Until condition
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) > 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop Until 繼續 '只要變數值等於True就繼續執行
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = True Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
'代碼思路分析:
'利用Do Loop實現上一個案例中While Wend語句的同等功能
'首先初始化一些變數,包括:
'“行號”:賦值為2,因為第一個工號保存在第一行
'“繼續”:賦值為true,因為只有條件為True才會執行迴圈語句,而布林形變量的預設值為False,所以需要先賦值True
'“最大行”:賦值是B列最後一個非空行的行號,當計數器“行號”等於該值時必須停止迴圈,否則否逐一判斷後面的空儲存格,浪費資源
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
繼續 = True '設置變數的預設值為True
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do While 繼續 '只要變數值等於True就繼續執行
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) = 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = False Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
5 Do Until...LoopSub 判斷B列的工號是否重複3() 'Do Until condition…Loop
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do Until 繼續 '只要變數值等於True就繼續執行
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) > 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = True Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
6 Do...Loop WhileSub 判斷B列的工號是否重複4() 'Do…Loop While condition
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) = 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop While 繼續 '只要變數值等於True就繼續執行
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = False Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
7 Do...Loop UntilSub 判斷B列的工號是否重複5() 'Do…Loop Until condition
Dim 繼續 As Boolean, 行號 As Integer, 最大行 As Integer '聲明三個變數
行號 = 2 '工號從第二行開始,所以初始值採用2
最大行 = Cells(Rows.Count, "B").End(xlUp).Row '計算B列最後一個非空儲存格的行號
Do
'如果儲存格Cells(行號, "B")不是空白儲存格,而且行號小於等於B列最後一個非空行的行號
If Len(Cells(行號, "B")) > 0 And 行號
'判斷儲存格Cells(行號, "B")的值是否重複,將判斷結果賦值給變數“繼續”
繼續 = WorksheetFunction.CountIf(Range("b2:b" & 最大行), Cells(行號, "B")) > 1
Else '否則
MsgBox "B列不存在重復工號!", vbOKOnly, "友情提示"
Exit Do '提示用戶後結束迴圈
End If
行號 = 行號 + 1 '累加計數器
Loop Until 繼續 '只要變數值等於True就繼續執行
'如果變數的值等於False,表示已經出現重複值,那麼提示用戶
If 繼續 = True Then MsgBox "B列存在重復工號!", vbOKOnly, "友情提示"
End Sub
'代碼思路分析:
'利用Do Loop實現上一個案例中While Wend語句的同等功能
'首先初始化一些變數,包括:
'“行號”:賦值為2,因為第一個工號保存在第一行
'“繼續”:賦值為true,因為只有條件為True才會執行迴圈語句,而布林形變量的預設值為False,所以需要先賦值True
'“最大行”:賦值是B列最後一個非空行的行號,當計數器“行號”等於該值時必須停止迴圈,否則否逐一判斷後面的空儲存格,浪費資源