在使用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 <> 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<=>=> 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列的内容。 |
|