循环语句,它可能重复执行一系列代码,从而批量地完成工作任务。循环语句在实际工作中应用极广,且因为循环语句不可能利用录制宏产生,所以必须潜心掌握它的所语法与结构。
Sub 汇总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
Sub 定位大于某值的所有单元格()
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对象
'当循环完毕后判断是否有符合条件的单元格,如果有则使用Range.Select方法选择这些单元格
Sub 在第几行处超过500()
Dim total, Item As Integer '声明变量,前者存放合计,后者表示计数器
Item = 1 '预先赋值1,因为产量从第二行开始
While total < 500 '只要变量total的值小于500就继续执行
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(Rows.Count, "B").End(xlUp).Row Then
''判断单元格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列最后一个非空行的值。
Sub 判断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(Rows.Count, "B").End(xlUp).Row Then
'判断单元格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
Sub 判断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(Rows.Count, "B").End(xlUp).Row Then
'判断单元格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
Sub 判断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(Rows.Count, "B").End(xlUp).Row Then
'判断单元格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
Sub 判断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(Rows.Count, "B").End(xlUp).Row Then
'判断单元格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列最后一个非空行的行号,当计数器“行号”等于该值时必须停止循环,否则否逐一判断后面的空单元格,浪费资源