乐于分享
好东西不私藏

Excel VBA 编程基础 — 语句(九)- 循环语句(二)

Excel VBA 编程基础 — 语句(九)- 循环语句(二)

前面我们讨论了 For 循环语句。For 循环主要用于初始值和终止值都已知的情况。今天我们讨论 Do While 循环语句。
还是从例子入手。
例1. 为单元格填色
图1 表格填色
以右边的图例为左边的表格填色。因为是为若干行的单元格填色,很自然第就会想到使用循环语句。假如我们不知道这个销售报表的第一个数据单元格的地址,怎么办?
从表格中可以看出,“奉止”为第一个数据单元格,但不知道“奉止”单元格所在的行列位置,如何确定该单元格的位置?
幸运的是,VBA 为我们提供了一个强有力的 Find 函数,我们可以用这个函数来找到值为“奉止”的单元格:
Dim cell AsRangeSet cell = Cells.Find(What := "奉止", LookIn := xlValues)
找到值为“奉止”的单元格(cell)之后,cell.Row 就是该单元格所在的行,cell.Column 即为该单元格的列。有了第一个数据单元格的行与列,我们就可以遍历这个销售报表,根据图例来填色了。
Dim rowAsIntegerDim col AsIntegerrow= cell.Rowcol = cell.Column +1Do While Cells(row, col).Value<> ""SelectCase Cells(row, col).ValueCase "东北"      cell.Interior.Color = RGB(166166166)Case "西北"      ...EndSelectrow=row+1Loop
通过 Find 找到的 cell 在 姓名 列,cell.Column + 1 则是 区域列,Cells(row, col) 则是 区域 列的第一个数据单元格(值为“华东”)。
我们这里用到的循环语句是 Do While … Loop 结构。这个结构的一般形式是:
Do While condition[ statements ][ Exit Do ][ statements ]Loop
这个循环的执行流程是:只要 condition 为 True,则执行其中的 statements。注意:其中的 statements 都位于 [ ] 中,说明 Do While … Loop 可以没有要执行的语句,最极端的死循环语句为:
DoWhile TrueLoop
这个循环语句什么也不干,只是一味地循环——死循环!
回到我们的例子。表达式 Cells(row, col).Value <> “” 的意思是:检查单元格的值是否为空,如果不为空,就一直循环。
在循环体中,我们使用昨天学过的 Select Case 语句来检查单元格的具体值,根据单元格的值设置它的背景色。
下面的赋值语句用来控制循环步进,一次一行,直到空白行,此时 单元格的值为空,Cells(row, col).Value <> “” 条件变为 False,退出循环。
完整的代码如下图所示:
图2 完整的示例代码
Do While 循环有一个中途退出机制,那就是 Exit Do 语句。我们可以设置一个条件,在循环过程中检测这个条件,如果条件满足,则执行 Exit Do 语句退出 Do While 循环。利用这个退出机制重写上面的 Do While 循环,如下:
...= Cells(row, col).ValueDo While True  If v = "" Then Exit DoSelectCase vCase "东北"      Cells(row, col).Interior.Color = RGB(162162162)    ...EndSelectrow=row+1  v = Cells(row, col).ValueLoop
这段代码中,If v = “” Then Exit Do 就成了结束循环的出口。
与确定初始值和终止值的区间循环的 For 语句不同,Do While 语句是根据条件测试结果来进行循环的。如果条件测试一开始就不为 True,则 Do While 循环也就不会执行。但如果条件测试一直为 True,那么 Do While 就会一直循环下去。所以,在循环体中一定要有改变条件测试结果的语句,才能确保 Do While 循环能够终止。如上面代码中的 row = row + 1,这是确保 Do While 循环终止的语句。
这段示例代码还是有潜在风险的:如果单元格中一直有值怎么办?
相关阅读
Excel VBA 编程基础 — 语句(八)- 循环语句