• VBA基础六:遍历、循环的实例DO....WHILE/UNTILL/LOOP


    Do While...Loop 语句是条件为True时循环

    Do until...Loop 语句是直到条件变成True时才停止循环

    如果事先知道循环次数,应该使用For循环,据说它比Do循环速度快

    不知道起点和终点,需要在循环内计算结果出来以后才能判断是否该终止循环的,用Do Loop循环。反之,如果很明确需要循环计算的次数,则用For……Next……计量循环。

    For 循环有两种:
    1. For Each a In C

        遍历集合C中所有a元素。当然毫无疑问也可以使用If Then Exit For随时提前退出。
    好处是不用设置循环计数变量。因此在很多确实需要遍历全部元素的情况下,是效率最高的循环遍历方式。

    2. For i = a To b [Step c]
    Next

    和For Each 循环相比,因为有了计数器、计数变量i的使用,可以非常灵活和实用。实用之处在于: 【计数变量本身可以用来参与计算】这个在数组循环中尤其重要。
    [Step c] 为缺省参数,正常默认设置为 Step 1 即按步长=1进行正向递增循环。

    如 For i = 1 To 100
    相当于 For i = 1 To 100 Step 1
    即从1 循环直到 100为止,共计循环 100-1+1=100次。

    而c可以设置为任意正负数(不可设置=0……将陷入死循环。)
    注意,如果设置c为负数,即进行逆向负循环时,则要求 a >= b 否则如果a < b则无法启动循环。 

    例:把>=90分的人打上勾。

    Private Sub CommandButton1_Click()
    Dim rs%
    rs = 1
    Do
    rs = rs + 1
    If rs > 10 Then
    Exit Sub
    Else
    If Cells(rs, 2) >= 90 Then Cells(rs, 3) = "√"
    End If
    Loop
    End Sub

    缺点:不能清理。如把51分改为510分,打勾后再改回到51分,再点筛选键,不能清除这个51分的勾。

      Range("B7:AG26").Select
      Selection.ClearContents
      Range("D28:AG29").Select
      Selection.ClearContents

    指定块清除

    从右取字符串截取的笨办法

    从左第n个字符:=MID(A1,n,1)
    从右第n个字符:=LEFT(RIGHT(A1,n))

    =LEFT(RIGHT(A2,2),1)  '从A2行第2列开始,右边数第二个汉字或字母/数字长度为1个字。

    如果(A2,2)的内容是“张平之子”,右数第二个字为之,长度为1,结果是“子”。长度为2结果是“之子”

    "在不清楚总字符的前提下,只说从右边第几个字符开始提取N个字符,这就不好直接用MID函数指定位置,可以变通用:
    (假设对单元格A1从右边第M个字符开始提取N个字符)
    =MID(A1,LEN(A1)-(M+N-2),N)"

    Private Sub CommandButton1_Click()
    Dim rs As Integer
    rs = 2
    Do While Cells(rs, 1) <> "" '当单元格不等于空时,则循环
    If Cells(rs, 1) <> "" Then Cells(rs, 3) = Mid(Cells(rs, 1), 2, 1) '如果第1列长度为4,在该行第3列中取,从第2字取长度为1字符。
    rs = rs + 1
    Loop '循环
    End Sub

    一直循环到没有内容为止

    Private Sub CommandButton1_Click()
    Dim rs As Integer
    rs = 2
    Do Until Cells(rs, 2) = "" '直到单元格为空为止,才结束
    If Cells(rs, 2) >= 90 Then Cells(rs, 3) = "√"
    rs = rs + 1
    Loop '循环
    End Sub

    '实例-隔行填色

    Sub 隔行填色()
    Dim rs As Integer
    rs = 2
    Do Until Sheet2.Range("a" & rs) = ""
    Sheet2.Range("a" & rs & ":g" & rs).Interior.ColorIndex = 7
    rs = rs + 2
    Loop
    End Sub

    输入密码验证,3次不正确退出,正确为123

    Private Sub CommandButton1_Click()
    Dim pss$, i!
    Do
    i = i + 1
    If i > 3 Then Exit Do
    pss = InputBox("请输入密码")
    Loop While pss <> "123"
    End Sub

    'FOR...NEXT也是循环语句,与之前的DO...LOOP不同之处在于,for next有一个内置计数器


    Sub for next循环2()
    Dim i!, j!
    For i = 100 To 1 Step -2
    j = j + i
    Next
    MsgBox j
    End Sub


    Sub fornext循环()
    Dim rng!
    For rng = 2 To 16
    Sheet1.Cells(rng, 4) = Sheet1.Cells(rng, 2) * Sheet1.Cells(rng, 3)
    Next
    End Sub

    有表格,字段为商品,单价,数量,自动填写总金额公式

    Private Sub CommandButton1_Click()
    Dim rng!
    For rng = 2 To 16 '第2到16行,第一行为标题,共有16行
    Sheet1.Cells(rng, 4) = Sheet1.Cells(rng, 2) * Sheet1.Cells(rng, 3) '在第4列写出第2列和第3行相乘的结果
    Next '从第2行开始,顺序朝下,直到第16行为止
    End Sub

    Sub 九九乘法表制作()
    Dim a!, b!
    For a = 1 To 9
    For b = 1 To 9
    If b > a Then
    Sheet2.Cells(a, b) = ""
    Else
    Sheet2.Cells(a, b) = a & "×" & b & "=" & a * b
    End If
    Next
    Next
    End Sub

    'exit是退出当前语句
    '1.Exit Do
    '2.Exit For
    '3.Exit Function
    '4.Exit Sub
    Sub exitfor退出()
    Dim i!
    For i = 2 To 7
    If Sheet1.Cells(i, 1) = "田七" Then
    Exit For
    End If
    Next i
    MsgBox "第一个(田七)的位置在" & i & "行"
    End Sub

    'end结束一个过程或块。
    'End
    'End Function
    'End If
    'End Select
    'End Sub
    Sub aa()
    i = 1
    End
    Exit Sub
    j = 1
    End Sub

    Sub onerrorresume()
    Dim i!
    On Error Resume Next '当错误的时候继续执行下去
    For i = 2 To 8
    Cells(i, 4) = Cells(i, 3) + Cells(i, 2)
    Next i
    End Sub

    'On Error GoTo当错误的时候去哪儿?
    Sub onerrorgoto()
    On Error GoTo 100
    For i = 2 To 8
    k = Sheet1.Cells(i, 2) + Sheet1.Cells(i, 3)
    Next i
    100:
    MsgBox "对不起,错误发生在第" & i & "行"

    End Sub

    循环对每行进行分割填写

     Private Sub CommandButton1_Click()

    Dim i%, j% '定义循环参数
    Dim br '定义系列
    i = 6 '从第6行开始
    Do While Cells(i, 3) <> "" '非空执行:从第6行第3列开始
    br = Split(Cells(i, 3), " ") '从第6行第3行开始,把单元格内容进行拆分
    If IsArray(br) Then Cells(i, 4).Resize(, UBound(br) + 1) = br '如果能分成数组,则从第6行4列开始,搂数组+1进行调整得出新数组值
    i = i + 1
    Loop
    End Sub

    array("A","B","C","D","E")
    UBound(array)返回的是4,因为默认下标是从0开始的。相当于A(0 to 4)。

    UBound语法如下:
    返回一个 Long 型数据,其值为指定的数组维可用的最大下标。


    UBound(arrayname[, dimension])
    arrayname
    必需的。
    数组变量的名称,遵循标准变量命名约定。
    dimension
    可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2
    表示第二维,如此等等。如果省略 dimension,就认为是 1。

    对具有下述维数的数组而言,UBound 的返回值见下表:

    Dim A(1 To 100, 0 To 3, -3 To 4)

    UBound(A, 1) = 100

    UBound(A, 2) = 3

    UBound(A, 3) = 4
    如果没指明下标,下标默认为0。定义一年365天的开支参数,用数组表示如下:
    Dim curExpense(364) As Currency
    0占一个元素位置+364个元素。

    UBound的是数组的上界。
    比如一组数组arr(1 to 10),那么ubound(arr)=10
    二维数组arr(1 to 10,1 to 100),
    ubound(arr,1)=10
    表示第一维的上界是10
    ubound(arr,2)=100表示第二维的上界是100

    数组测试

    Private Sub Constant_demo_Click()

    Dim a,b as Variant

    a = array("Red","Blue","Yellow")

    b = "12345"


    msgbox("数组类型测试结果组 1 : " & IsArray(a))

    msgbox("数组类型测试结果组 2 : " & IsArray(b))

    End Sub


    当执行上面的函数时,它会产生下面的输出。


    数组类型测试结果组 1 : True
    数组类型测试结果组 2 : False



  • 相关阅读:
    867. Transpose Matrix
    896. Monotonic Array
    Java并发包中线程池ThreadPoolExecutor原理探究
    Java中的线程协作之Condition
    Java中的读写锁
    Java中的锁——Lock和synchronized
    Java中的队列同步器AQS
    Java并发编程基础之volatile
    leetcode-数组中只出现一次的数字
    leetcode-比特位计数
  • 原文地址:https://www.cnblogs.com/yuanscn/p/13298884.html
Copyright © 2020-2023  润新知