网站首页 > 技术文章 正文
虽然宏的功能可以让一部分的工作自动化执行,但只能机械地录制用户的操作,自动录制的代码只能按顺序执行,相当于照本宣科或鹦鹉学舌,条件判断语句和循环语句无法通过录制宏产生。但程序代码的强大和智能却主要是因为可以按条件判断进行跳转的选择和循环控制结构。
循环语句,它可能重复执行一系列代码,从而批量地完成工作任务。循环语句在实际工作中应用极广,且因为循环语句不可能利用录制宏产生,所以必须潜心掌握它的所语法与结构。
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列最后一个非空行的行号,当计数器“行号”等于该值时必须停止循环,否则否逐一判断后面的空单元格,浪费资源
猜你喜欢
- 2024-11-07 EXCEL-VBA- For Each Next(收藏不看系列)
- 2024-11-07 一口气带你踩完五个 List 的大坑,真的是处处坑啊
- 2024-11-07 VBA基本语法之For Each Next结构,都有什么特点以及使用注意事项
- 2024-11-07 foreach循环使用方法详解(foreach循环遍历的语法)
- 2024-11-07 for 、foreach 、iterator三种方式的比较
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)