Excel VBA四种循环的用法和区别(For...next,For each ...next,Do...loop,While...wend)

在Excel VBA中需要用循环去遍历某些参数时,就会考虑到VBA中常见的四种循环方法:For…next, For each …next, Do…loop,While…wend。一般情况下,四种方法是等效的,可以互相替换使用,但是在使用的便利性上,上述方法各有优势。

接下来逐个解析四种方法的特点。

1>For…next
先看一下它的用法:

For 计数器 = Start to End [ 步长 ]
[ statements ]
[ Exit for ]
[ statements ]
Next [ 计数器 ]

For…Next 语句的语法包含以下部分:

计数器 必填。 用作循环计数器的数值变量。 该变量不能是布尔值或数组元素。
start 必填。 counter 的初始值。
end 必填。 counter 的最终值。
步长 可选。 counter 每次通过循环时更改的量。 如果不指定,step 默认为 1。
statements 可选。 For 和 Next 之间执行指定次数的一个或多个语句。

解释一下上述用法,开始指的是循环开始的值,结束指的是循环结束的值,实质上就是计数器值的一个值域,如果计数器的值在值域内,就执行循环语句,计数器每运行到Next,就增加一个步长(不指定默认为1),可以为负数。
我们先来看一些实例。

Case1:计算1+2+3+…+98+99+100的和。

Sub Sumdemo1()
Dim num%, I%   '定义数据类型
num = 0
I = 1
For I = 1 To 100   'I是计数器,值域是1到100,默认步长是1
  num = num + I   '求和
Next I   'I这步可省略,经过一次步长+1
  MsgBox num   '对话框显示求和结果
End Sub

运行上述代码,可以得到如下图所示的结果。
求和结果
上述代码是一个比较经典的循环的例子,利用步长的变化求和,延伸至可以等差求和。
接下来看另一个经典的例子。

Case2:在Excel里生成九九乘法表。

Sub testdemo2()
Dim num1%, num2%   '定义变量类型
For num1 = 1 To 9
  For num2 = 1 To 9
    If num2 > num1 Then   '九九乘法表是左下三角形,必须行>列
      Exit For
    Else
      Cells(num1, num2) = num2 & "x" & num1 & "=" & num1 * num2   '将字符和数值写入单元格
    End If
  Next num2
Next num1
End Sub

运行上述代码,可以得到如下图所示的结果。
九九乘法表
上述代码进行了嵌套循环,从而进行二维方向的遍历,在实际的使用中,嵌套循环使用的几率比较高,"九九乘法表"这个例子值得学习和理解。

结合For…next的用法和两个例子,可以发现它适用于已知范围数字循环,这种循环是以一定的次数来执行语句的。

2>For each … next
同理,先看一下它的用法:

For each Element in Collection
[statements]
[ Exit for ]
[ statements ]
Next Element

Element 必填。 用作循环计数器的数值变量。
Collection 必填。一组变量的集合或者数组。
statements 可选。 For each和 Next 之间执行指定次数的一个或多个语句。

在使用这个方法时,由于循环里面有Each Element的存在,因此需要锚定一个范围或者组群Collection,即对象,并用一个变量去表示它,通过next逐步遍历里面的元素。接下来看一下实例。

Case3:显示当前工作簿的所有工作表的名称。

Sub testdemo1()
Dim ws As Worksheet   '定义变量类型
For Each ws In Worksheets   '遍历工作表
  MsgBox ws.Name   '显示当前的工作表名称
Next ws
End Sub

运行上述代码,可以得到如下图所示的结果。
遍历工作簿的工作表名称

由于当前的工作簿只有一张工作表,因此循环进行了一次就结束了。上述例子中,ws就是已知类型的变量,表示Each Element,去遍历Collection即worksheets,并将工作表的名称显示出来。

Case4:计算表格所示8位业务员的提成金额。

计算提成金额

Sub testdemo2()
Dim rng As Range   '定义变量类型
For Each rng In Range("b2:b9")   '遍历range("b2:b9"),多个工作表应指明具体worksheet
  rng.Offset(0, 1) = rng.Value * 0.1   '计算结果放在变量的右侧一列c列
Next rng   
End Sub

运行上述代码结果如下:

提成结果

Case4的代码中rng,range(“b2:b9”)分别代表Each Element和Collection,遍历一次就计算当前变量的提成。

结合For each…next的用法和案例,可以发现这种循环主要针对集合或数组进行操作,让所用元素执行一次循环语句。

3>Do…loop
同理,先看一下它的用法:

Do while Condition
[statements]
[exit do]
[statements]
Loop

Condition 必填。 计算结果为“True”或“False”的数值表达式或字符串表达式。 如果条件 为 Null,则条件 被视为 False。
statements 可选。 Do 和 Loop 之间执行指定次数的一个或多个语句。

在执行这个循环语句时,首先先判断条件,如果是True,即满足condition的条件,就执行后面的statement代码,执行循环,直到循环结束,否则跳出循环,执行loop后的代码,所以想要实现遍历的目的,条件设置非常重要(避免进入死循环)。

Case5:计算1+2+3+…+98+99+100的和。

Sub testdemo_1()
Dim num%,I%   '定义变量类型
num = 0: I = 1
Do while I <= 100   '先判断条件,true则进入循环
  num = num + I   '求和
  I=I+1   '每个变量的迭代
Loop
  msgbox num
End Sub

运行代码可以得到和case1图示一样的结果。关于Do…loop还有另外一种形式,case5的代码还可以写成下述这种类型,结果也是一样的。

Sub testdemo_2()
Dim num%,I%   '定义变量类型
num = 0: I = 1
Do 
  num = num + I   '求和
  I=I+1   '每个变量的迭代
Loop while I <=100 '先进入循环,再判断条件
  msgbox num
End Sub

Case5的Do…loop采用了case1的例子,不同遍历方法得到了相同的结果,说明在某些案例中与for…next可以互相替换使用,另外case5的两种实现方法是while关键字在不同位置,即在进入循环前检查条件(testdemo_1)和在至少运行循环一次后检查条件(testdemo_2)。

此外,while关键字还可以与until关键字替换使用,不过此时case5 testdemo_1中的Do while I <= 100要改成Do until I > 100,
case5 testdemo_2中的Loop while I <=100要改成Loop while I >100。

无论是While还是until,都可以顺利得到结果,但是值得注意的是,对于while(until)在后的循环在条件为 False 时仍继续运行,此时在Do while(until)和loop while(until)两种方式执行的次数是不同的。

Case6:计算Case4中8位业务员的提成金额。

Sub testdemo_3()
Dim num%,n%   '定义变量类型
n = 1
Do
  n = n + 1
  If Cells(n, "A") = "" Then   '条件判断
    Exit Do   '条件成立退出循环
  Else
    Cells(n, "C") = Cells(n, "B") * 0.1   '计算提成
  End If
Loop
End Sub

上述代码也可以得到case4图示的结果。在这个实例中,增加了退出Do…loop的Exit Do,此时如果将判断条件交给IF…else…end if,则循环中while(until)也可以省略,Do…loop只是执行循环不进行判断。

Do…loop的用法和实例表明,如果事先只知道判断的条件,循环内容和次数不确定,那么可以设置合适的条件采取这种循环。

3>While…Wend
同上,先看一下它的用法:
While Condition
[statements]
[exit do]
[statements]
Wend

Condition 必填。 计算结果为“True”或“False”的数值表达式或字符串表达式。 如果条件 为 Null,则条件 被视为 False。
statements 可选。条件为“True”时执行的一个或多个语句

在执行这个循环语句时,如果条件 为“True”,则将执行所有语句,直至遇到“Wend”语句,则重复该过程,知道不满足条件,退出循环。While…Wend循环可嵌套到任何级别。

Case7:计算1+2+3+…+98+99+100的和。

Sub testdemo_1()
Dim num%, I%   '定义变量类型
num = 0: I = 1
While I <= 100   '条件判断
  num = num + I   '求和
  I = I + 1   '每个变量的迭代
Wend
  MsgBox num
End Sub

该实例计算结果也是同上。接着看下一个例子。

Case8:找出D列平均成绩的最大值。

求一列的最大值

Sub testdemo_2()
Dim i%, MaxValue!   '定义变量类型
i = 2
While i <= 6   '条件判断
    If Range("d" & i) > MaxValue Then
        MaxValue = Range("d" & i)   '变量的迭代
    End If
    i = i + 1
Wend
    MsgBox "成绩的最大值是: " & MaxValue
End Sub

这个实例是在D列逐个循环判断大于变量MaxValue的值,并将最大值赋给MaxValue。循环的逻辑和前述的例子一样,但是在While…wend里面嵌套了一个if逻辑判断,组合使用比较灵活。

While…wend循环与Do while…loop循环非常相似,但是while…wend不能用exit do退出循环,而且执行时优先执行循环体后进行判断。

综上分析,总结一下四种循环结构的特点:

循环结构特点
For…next适用于已知范围数字循环
For each …next主要针对集合或数组
Do…loop事先只知道判断的条件,循环内容和次数不确定
While…wend同Do…loop
您可以使用以下VBA代码实现此功能: ```VBA Sub MergeExcelFiles() Dim Path As String, FileName As String, SheetName As String Dim LastRow As Long, LastCol As Long, StartRow As Long Dim wb As Workbook, MainWorkbook As Workbook Dim ws As Worksheet, MainWorksheet As Worksheet '设置要汇总的文件夹路径 Path = "C:\YourFolderPath\" '创建新的工作簿 Set MainWorkbook = Workbooks.Add Set MainWorksheet = MainWorkbook.Sheets(1) '设置汇总表格的起始行号 StartRow = 1 '循环遍历文件夹中的所有Excel文件 FileName = Dir(Path & "*.xlsx") Do While FileName <> "" '打开Excel文件 Set wb = Workbooks.Open(Path & FileName) '循环遍历Excel文件中的所有工作表 For Each ws In wb.Worksheets '获取工作表名称 SheetName = ws.Name '获取工作表中数据的最后一行最后一列 LastRow = ws.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row LastCol = ws.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column '将数据复制到汇总表格中 ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Copy MainWorksheet.Cells(StartRow, 1) '设置汇总表格的起始行号 StartRow = MainWorksheet.Cells(Rows.Count, 1).End(xlUp).Row + 1 Next '关闭Excel文件,释放资源 wb.Close SaveChanges:=False Set wb = Nothing '获取下一个Excel文件的文件名 FileName = Dir() Loop '自动调整汇总表格的列宽 MainWorksheet.Cells.EntireColumn.AutoFit End Sub ``` 您需要将代码中的文件夹路径“C:\YourFolderPath\”替换为您要汇总的Excel文件所在的文件夹路径。此外,该代码假定所有要汇总的Excel文件都位于同一个文件夹中,并且每个Excel文件中只有一个工作表。如果您的情况不同,请根据实际情况对代码进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值