优秀的编程知识分享平台

网站首页 > 技术文章 正文

VBA|简单实例比较4种循环结构(vba循环语句实例)

nanyue 2024-11-07 11:28:43 技术文章 3 ℃

虽然宏的功能可以让一部分的工作自动化执行,但只能机械地录制用户的操作,自动录制的代码只能按顺序执行,相当于照本宣科或鹦鹉学舌,条件判断语句和循环语句无法通过录制宏产生。但程序代码的强大和智能却主要是因为可以按条件判断进行跳转的选择和循环控制结构。

循环语句,它可能重复执行一系列代码,从而批量地完成工作任务。循环语句在实际工作中应用极广,且因为循环语句不可能利用录制宏产生,所以必须潜心掌握它的所语法与结构。

1 For…Next

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

2 For Each...Next

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方法选择这些单元格

3 While...Wend

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列最后一个非空行的值。

4 Do While...Loop

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

5 Do Until...Loop

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

6 Do...Loop While

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

7 Do...Loop Until

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列最后一个非空行的行号,当计数器“行号”等于该值时必须停止循环,否则否逐一判断后面的空单元格,浪费资源

最近发表
标签列表