作者:靛蓝工作室 2018-04-19 07:00:00
在使用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列中,如下图:
当你知道你需要重复运行多少次某段语句时,可以使用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 条件
语句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
可以解释为不满足 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循环功能上和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循环。该循环不需要计数器变量,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])
参数说明
注2: Cells用法: Cells(i,j)中i指的是行数,j指的是列数,Cells(i,j)指的是第i行的第j列单元格。Cells(3,4)代表第3行D列的内容。