在使用VBA表格出来程序的时候,最核心的逻辑有两点,一是循环,二是判断语句。一般要么是循环里面嵌套判断语句,要么就是判断语句里面嵌套判断语句。更复杂点的就是嵌套里面既有循环还有判断。今天重点通过一个小小的例子,说明一下VBA中的常见的五种循环语句。
For ….next,
Do while ….loop,
Do ….loop until,
While… wend,
For each… in .. Next,
其中我最常用的是 For ….next ,Do while ….loop。
Do ….loop until,While… wend,这两个基本上都可以被写成 For … Next, Do while ….loop的形式。
For each… in .. Next 主要是遍历元素集合,比如数组,对象,文件什么。
初学者最好先掌握好For Next 和Do While … loop,然后再学一下 IF … Then ..的判断语句。就基本上可以应对大部分EXCEL表格处理的问题了,至少模拟一下EXCEL自带的公式是绰绰有余了。
今天通过解决一个小问题来学习一下这五种循环。
问题:通过编写VBA匹配生产企业中的省市名称。比如要提取A列“中山市花城食品饮料有限公司”中的地级市名称“中山”两字到B列中,如下图:
- 1、For…Next 循环,
当你知道你需要重复运行多少次某段语句时,可以使用For…Next语句。它的语法如下:
For 计数器 = 开始 To 结束 [步长]
语句1
语句2
语句N
Next [计数器]
比如计算2到100之间所有偶数之和,就可以这样写:
Sub 求和()
Dim Sum As Integer
For i = 2 To 100 Step 2
Sum = Sum i
Next
MsgBox Sum
End Sub
将 i= 2 改为 i = 2, step 2改为 step 1(若步长为1 step 1 可以省略) 就是计算1加到100的和。
解决省市匹配的问题 如图:
首先我们需要用for循环读取要查找的企业名称,A列从第2行到第33行:
Dim strName as Sring
for i = 2 to 33
strName = cells(i,1)
next
然后我们需要用for循环读取被查找的广东省的省市地址关键词,C列从第2行到第23行:
Dim strAddr as Sring
for j =2 to 23
strAddr = cells(j,1)
next
再次我们需要在企业名称里面(strName)查找广东省的省市地址关键词(strAddr),我们需要用到
Instr()这个函数。加上判断语句是这样的:
IF Instr(strName,strAddr) > 0 Then
Cells(i,2)=strAddr
End IF
最后我们将我们的代码汇总下:
Sub 提取企业名称省市()
For i = 2 To 33
strName = Cells(i, 1)
For j = 2 To 23
strAddr = Cells(j, 3)
If InStr(strName, strAddr) > 0 Then
Cells(i, 2) = strAddr
End If
Next
Next
End Sub
- Do…While循环
如果不知道循环多少次,可以用Do ..while循环 只要或者直到某个条件为真,它们就会重复一系列的语句。语法如下:
Do While 条件
语句1
语句2
语句N
Loop
或者也可以写成第二种写法:
Do
语句1
语句2
语句N
Loop While 条件
第二种写法循环体内的代码至少会运行一次。
比如刚才的计算2到100之间所有偶数之和,就可以这样写:
Sub 求和2()
Dim Sum As Integer
i =2
Do While i <=100
Sum = Sum i
Next
MsgBox Sum
End Sub
解决省市匹配的问题 ,思路是一样的,只是用Do while 循环代替了For 循环。
首先我们需要用Do While循环读取要查找的企业名称,A列从第2行到第33行:
Dim strName as Sring
i = 2
Do While Cells(i, 1) <> “”
strName = Cells(i, 1)
i=i 1
Loop
然后我们需要用Do While循环读取被查找的广东省的省市地址关键词,C列从第2行到第23行:
Dim strAddr as Sring
j = 2
Do while cells(j,3)<>””
strAddr = cells(j,3)
next
再次我们需要在企业名称里面(strName)查找广东省的省市地址关键词(strAddr),我们需要用到
Instr()这个函数。加上判断语句是这样的:
IF Instr(strName,strAddr) > 0 Then
Cells(i,2)=strAddr
End IF
最后我们将我们的代码汇总下:
Sub 提取企业名称省市W()
i = 2
Do While Cells(i, 1) <> “”
strName = Cells(i, 1)
j = 2
Do While Cells(j, 3) <> “”
strAddr = Cells(j, 3)
If InStr(strName, strAddr) > 0 Then
Cells(i, 2) = strAddr
End If
j = j 1
Loop
i = i 1
Loop
End Sub
- Do …Loop Until循环
可以解释为不满足 Until的条件时,执行循环体内的语句:
Do Until 条件
语句1
语句2
语句N
Loop
也可以讲 Until放在后面,这样循环体内的语句至少执行一次:
Do Until 条件
语句1
语句2
语句N
Loop
计算2到100之间所有偶数之和,就可以这样写:
Sub 求和3()
i = 2
Dim Sum As Integer
Do Until i > 100
Sum = Sum i
i = i 2
Loop
MsgBox Sum
End Sub
解决省市匹配的问题,代码如下:
Sub 提取企业名称省市D()
i = 2
Do Until Cells(i, 1) = “”
strName = Cells(i, 1)
j = 2
Do Until Cells(j, 3) = “”
strAddr = Cells(j, 3)
If InStr(strName, strAddr) > 0 Then
Cells(i, 2) = strAddr
End If
j = j 1
Loop
i = i 1
Loop
End Sub
- While Wend循环
While…Wend循环功能上和Do…While循环一样,它是从Microsoft Basic的早期版本遗留下来的并
且VBA保留它也是为了支持兼容性。该循环以关键字While开始以关键字Wend结束。这是它的语法:
While 条件
语句1
语句2
语句N
Wend
条件在循环的上面就被测试,只要提供的条件为真,这些语句就会被执行。一旦条件为假,VB就将
退出该循环。
计算2到100之间所有偶数之和,就可以这样写:
Sub 求和4()
i = 2
Dim Sum As Integer
While i<= 100
Sum = Sum i
i = i 2
Wend
MsgBox Sum
End Sub
- For Each…Next 循环
当你的过程需要在一个集合的所有对象或者一个数组的所有元素(数组将在第七章里涉及)之间循
环时,应该使用For Each…Next循环。该循环不需要计数器变量,VB自己知道应该执行几次循环。
该循环的形式是:
For Each 元素 In 组合
语句1
语句2
语句N
Next [元素]
比如简单的求和计算:
Sub 求和5()
Dim Num() As Variant
Num = Array(1, 2, 3, 4, 5)
Dim Sum As Integer
For Each N In Num
Sum = Sum N
Next
MsgBox Sum
End Sub
其中Num 为数组,For Each N In Num 时读取数组里的每一个数值,然后执行循环体内的语句。
明显可以看出For Next 循环要比其他Do while Loop 或 While Wend 代码要简洁一些,但需要提前知道循环的起点和终点。Do while Loop 或 While Wend用好的关键需要控制好循环的入口和出口,避免进入死循环。Do While Loop,Do Until Loop 和 While Wend 从对比图中可以看出循环控制流程基本一致。
注1:Instr 用法:InStr([start,]string1,string2[,compare])
参数说明
- Start – 一个可选参数。指定搜索的起始位置。搜索从第一个位置开始,从左到右。
- String1 – 必需的参数。要搜索的字符串。
- String2 – 必需的参数。要在String1中搜索的字符串。
- Compare – 一个可选参数。指定要使用的字符串比较。它可以采取以下提到的值:
- 0 = vbBinaryCompare – 执行二进制比较(默认)
- 1 = vbTextCompare – 执行文本比较
注2: Cells用法: Cells(i,j)中i指的是行数,j指的是列数,Cells(i,j)指的是第i行的第j列单元格。Cells(3,4)代表第3行D列的内容。
编者的话:写了两天终于写完了,自己也学了不少东西。那啥,求关注,求转发。关注后留言,可有机会定制属于自己的VBA 代码工具。