3、[VBA入门到放弃笔记] For...Next循环语句

Sub 循环0()
    Dim x As Integer
    x = 0
    x = x + 1
    x = x + 1
    x = x + 1
    x = x + 1
    x = x + 1
    x = x + 1
    Debug.Print x
End Sub

上面代码运行 【x = x + 1】6次后得出x=6,假如需要运行【x = x + 1】 100次,1000次呢?

Sub 循环1()
    Dim x As Integer, i As Integer
    x = 0
    For i = 1 To 6
      x = x + 1
    Next
    Debug.Print x
End Sub

上面两个代码同样可以得出x=6的相同结果。当然,我们也可以像下面的代码这样,结果也是x=6。可以理解【循环就是循环结构内代码执行的次数】
【用F8逐句执行代码,For...Next就是这么运行代码的。】


F8很有用.gif
Sub 循环2()
    Dim x As Integer, i As Integer
    x = 0
    For i = 10 To 15'i值从10到15,循环了6次
      x = x + 1
    Next
    Debug.Print x
End Sub

不要纠结i的值,只需要知道For循环里i的值变化了几次。如 For i = 1 To 6,i,1-2-3-4-5-6变化了6次;For i = 10 To 15,i,10-11-12-13-14-15同样变化了6次,所以,x=x+1,在For循环的结构内都执行了6次运算,拆开来就是第一个代码【循环0】那个样子。最后,要100次循环就是For i = 1 to 100
For...Next,有For必有Next,在写代码的时候,先写结构,再填语句。即先写完For...Next这个结构,再在中间写代码。

For
然后在这里写代码,就不会老有提示【For没有Next】
Next

【For...Next的步长Step和方向】

Sub 循环3()
    Dim x As Integer, i As Integer
    x = 0
    For i = 1 To 6 step 1'############看这里step 1
      x = x + 1
    Next
    Debug.Print x
End Sub

Sub 循环4()
    Dim x As Integer, i As Integer
    x = 0
    For i = 6 To 1 step -1'############看这里step -1
      x = x + 1
    Next
    Debug.Print x
End Sub

循环3和循环4两个代码返回相同的结果x=6。对比循环3和循环1两个代码其实是一样的,当【从小到大循环】默认步长为1,【step 1】往往省略,step 1 表示步长为1,方向为从小到大;在循环4中step -1表示【从大到小循环】,步长为1,“- ”表示反向,自然 i = 6 to 1。

【在军训的时候,教官分组时,常常喊口令报数,然后单数出列,双数留队】

Sub 循环5()
    Dim i As Integer
    For i = 1 To 10 Step 2
      Debug.Print i
    Next
End Sub
步长.gif

循环5里step 2 表示步长2,当i=1开始,那么下一次循环时,i=1+2,i=3,跳过了2......依此计算。

【循环可以用来干神马:代替重复性的操作】
例1:批量新建工作表--新建一个XLSM工作簿,然后新建5个工作表,并分别以12345命名。

Sub 批量新建工作表()
    Dim sht As Worksheet '定义工作表对象变量
    Dim i As Integer
    For i = 1 To 5
        Set sht = Worksheets.Add(after:=Worksheets(i)) 'Add方法新建工作表
        sht.Name = i  '工作表名称赋值
    Next
End Sub
批量新建工作表.gif

例2:工作表中单元格A1:A10,是一个1-10的序列,用循环使奇数的单元格变背景颜色变黄色。

Sub 单元格背景变黄色()
    Dim i As Integer
    For i = 1 To 10 Step 2 '步长取奇数
        Range("A" & i).Interior.ColorIndex = 6 '设置单元格的背景颜色为黄色,黄色的代码是6
    Next
End Sub
黄色背景

--------------------分割线----------------------------分割线-------------------------
【For循环“变种”:For each....Next循环】
For each....Next用来遍历集合中每一个成员。
例3:将成绩大于等于90的单元格值改成优秀。

成绩表.png
Sub 选优秀()
    Dim Rng As Range
    Dim Cell As Range
    '定义两个变量为单元格对象
    Set Rng = Range("B2:G7") '单元格集合
    For Each Cell In Rng '遍历Rng集合中的每一个单元格
        If Cell.Value >= 90 Then  '如果单元格的值大于等于90,那么
            Cell.Value = "优秀"        '将单元格的值改为优秀
        End If
    Next
    Set Rng = Nothing '释放对象变量,释放内存
    Set Cell = Nothing
End Sub
结果

例2:批量提取当前活动工作簿中所有工作表的名称。

Sub 提取工作表名称()
    Dim Sht As Worksheet '定义工作表变量
    For Each Sht In Worksheets '遍历工作簿中的工作表集合的每一个工作表
        Debug.Print Sht.Name '打印工作表的名称
    Next
End Sub
工作表名称

【温习WorkSheets集合和Sheets集合】工作簿中有6个工作表和1个图表

Paste_Image.png
Sub 提取工作表名称()
    Dim Sht As Worksheet '定义工作表变量
    For Each Sht In Worksheets '遍历工作簿中的Worksheets集合的每一个工作表
        Debug.Print Sht.Name '打印工作表的名称
    Next
End Sub
Sub 提取sheet表名称()
    Dim Sht As Object '定义对象变量
    For Each Sht In Sheets '遍历工作簿中的Sheets集合的每一个对象
        Debug.Print Sht.Name '打印对象的名称
    Next
End Sub
worksheets和sheets

推荐阅读更多精彩内容