人气 4136

VBA简单实例比较几种循环结构 [复制链接]

lubansoft 2017-3-22 17:08:50
循环语句,它可能重复执行一系列代码,从而批量地完成工作任务。循环语句在实际工作中应用极广,且因为循环语句不可能利用录制宏产生,所以必须潜心掌握它的所语法与结构。
1 For…NextSub 汇总1到100的奇数2()Dim Item As Byte, Total As Integer  '定义两个变量,一个用于计数器,一个保存合计值For Item = 1 To 100 Step 2  '从1到100,步长值为2Total = Total + Item  '如果计数器的值是奇数则累加到变量Total中Next Item  '执行下一轮循环MsgBox Total  '报告最终结果End SubSub 删除空白单元格所在行() '定义两个变量,前者表示循环语句的计数器,后者用于存放所有已删除行的行号Dim Item As Integer, RowName As String '从B列最后一个非空单元格的行号开始,到第一行结束,步长值为负1For Item = Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1If Len(Cells(Item, "B")) = 0 Then  '如果单元格中没有字符Rows(Item).Delete  '那么删除整行RowName = RowName & Chr(13) & Item  '记录被删除的行End IfNext ItemIf Len(RowName) > 0 Then MsgBox "以下行已成功删除:" & RowName  '如果变量RowName非空则报告已删除的行号End Sub2 For Each...NextSub 定位大于某值的所有单元格()If TypeName(Selection)  "Range" Then End  '如果选择对象不是单元格,那么结束程序 '定义Range型的变量,用于代表操作区域,使用变量参与后续运算可提升代码效率Dim 操作区域 As RangeIf 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 IfEnd IfNext 单元格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  0 And 行号 4 Do While...LoopSub 判断B列的工号是否重复2()  'Do While condition…LoopDim 继续 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 行号 5 Do Until...Loop
Sub 判断B列的工号是否重复3()  'Do Until condition…LoopDim 继续 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 行号  1Else  '否则MsgBox "B列不存在重复工号!", vbOKOnly, "友情提示"Exit Do  '提示用户后结束循环End If行号 = 行号 + 1  '累加计数器Loop '如果变量的值等于False,表示已经出现重复值,那么提示用户If 继续 = True Then MsgBox "B列存在重复工号!", vbOKOnly, "友情提示"End Sub6 Do...Loop While
Sub 判断B列的工号是否重复4()  'Do…Loop While conditionDim 继续 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 行号 7 Do...Loop UntilSub 判断B列的工号是否重复5()  'Do…Loop Until conditionDim 继续 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 行号  1Else  '否则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列最后一个非空行的行号,当计数器“行号”等于该值时必须停止循环,否则否逐一判断后面的空单元格,浪费资源
您需要登录后才可以回帖 登录 | 立即注册

QQ|手机版|精益人 ( 沪ICP备19004111号-1 )

GMT+8, 2024-6-2 23:08 , Processed in 0.238583 second(s), 19 queries .

Powered by Lean.ren X3.5 Licensed  © 2001-2030 LEAN.REN