按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
vbThursday 5
vbFriday 6
vbSaturday 7
4。 从VB窗口运行该程序。运行几次,每次提供不同的日期。对照你的桌面或日历检查VB的答案是
否正确。
技巧5…3 什么是结构化程序?
结构化编程要求所有的程序具有模块化的设计,并使用三种逻辑结构:顺序,决定和循环。顺序结
构为一条接一条地执行语句;决定结构则是让你基于一些条件的测试来执行一些特定的语句;而只
要某特定的条件为真,循环结构就重复地执行某条或某些语句。循环是下章的主题。在结构化编程
里,其它一些逻辑语句,例如GoTo,是不允许的。结构化程序的代码容易跟踪——它从上到下平稳
地走下来,没有任何跳跃到特定标志去的语句。下面就是一个结构化程序和非结构化程序的例子:
非结构化程序:
Sub GoToDemo()
Dim num; mystr
num = 1
If num = 1 Then
GoTo line1
Else
GoTo Line2
Line1:
mystr = “Number equals 1”
GoTo LastLine
Line2:
mystr = “Number equals 2”
LastLine:
107
… 页面 124…
Debug。Print mystr
End sub
结构化程序:
Sub Structure()
Dim num; mystr
num = 1
If num = 1 Then
mystr = “Number equals 1”
Debug。Print mystr
Else
mystr = “Number equals 2”
End if
End Sub
当你在起草你的VBA程序,并且需要从一个程序的一行跳到另一行时,你可能会被使用GoTo语句所
诱惑,不要跳跃。依赖于使用GoTo语句来你程序的路径将导致令人迷惑的代码,被称为意大利式面
条代码。使用结构化编程,你可以轻易地到达你程序里的目的地。
这里是另外一个示范If…Then…Else语句的过程:
Sub EnterData()
Dim cell As Object
Dim strmsg As String
On Error GoTo VeryEnd
strmsg = 〃Select any cell:〃
Set cell = Application。InputBox(prompt:=strmsg; Type:=8) cell。Select
If IsEmpty(ActiveCell) Then
ActiveCell。Formula = InputBox(〃Enter text or number:〃)
Else
ActiveCell。Offset(1; 0)。Select
End If
VeryEnd:
End Sub
上面的字程序EnterData提示用户选择任意单元格,然后单元格地址赋值于对象变量cell。
If…Then…Else结构检查被选择的单元格是否为空。IsEmpty是个内置函数,用来决定某个变量是
否已经被初始化了。如果该变量没有被初始化,那么IsEmpty函数返回true(真)。回想我们说过,
当变量被赋予第一个值时,它就被初始化了。在本过程中,如果当前单元格为空时,VB将它当作一
个零长度的字符串(””)。除了:
If IsEmpty(ActiveCell) Then
你还可以使用下述指令:
If ActiveCell。Value = 〃〃 Then
如果当前单元格为空,Then后面的语句就会被执行。该语句提示用户输入一个文本或数字,并且一
旦数据被提供,该数据就会输入给当前单元格。如果当前单元格不为空,VB将跳到子句Else后面的
指令。该指令将让VB选择同列里的下一个单元格。当你运行该过程,信息框提示你选择一个单元格,
在工作表上,点击任何单元格。被选择的单元格地址就会出现在信息框的编辑框里面。点击确定退
出信息框。VB检查被选择单元格的内容并且跳到你过程里的true或false指令块(true指令块在Then
后面,而false指令块在Else后面)。
5。If…Then…ElseIf 语句
很多时候,你需要检查很多种情况,你可以使用子句ElseIf来将一些If条件结合在一起。使用
If…Then…ElseIf语句,你可以比用前面章节中的If…Then…Else语句评估更多的条件。这里是
If…Then…ElseIf语句的语法:
If 条件1 Then
108
… 页面 125…
条件1为真时要执行的语句
ElseIf 条件2 Then
条件2为真时要执行的语句
ElseIf 条件3 Then
条件3为真时要执行的语句
ElseIf 条件N Then
条件N为真时要执行的语句
Else
所有条件都为假时要执行的语句
End If
Else子句是可选的;如果当所有条件为假时,没有要执行的操作,那么你就可以忽略它。
技巧5…4 ElseIf子句
你的程序里可以包括任何多个ElseIf子句和条件。ElseIf子句总是出现在Else子句之前的,只有当
ElseIf子句的条件为真时,它的语句才会被执行。
我们来看看下述例子:
If ActiveCell。Value = 0 Then
ActiveCell。Offset(0; 1)。Value = 〃zero〃
ElseIf ActiveCell。Value 》0 Then
ActiveCell。Offset(0; 1)。Value = 〃positive〃
ElseIf ActiveCell。Value 0),如果该值不大于0,VB将跳到下个ElseIf并检查条件
ActiveCell。Value 0 Then
ActiveCell。Offset(0; 1)。Value = 〃positive〃
ElseIf ActiveCell。Value 《 0 Then
ActiveCell。Offset(0; 1)。Value = 〃negative〃
‘End If (原文错误,多一个End If)
End If
End Sub
因为你需要运行过程WhatValue好几次来测试各种条件,所以,我们给它设置个临时的快捷键。
4。 打开立即窗口,并且输入下列语句:
Application。OnKey 〃^+y〃; 〃WhatValue〃
一旦按下回车键,VB就会运行OnKey方法将过程WhatValue赋予组合键Ctrl+Shift+Y。这个键盘快捷
键只是临时的——当你重新启动Excel后它就不起作用了。你同样也可以用Excel界面…工具菜单…
宏对话框里的选项来设置快捷键。
5。 切换到Excel界面,并激活Sheet1
6。 在单元格A1里输入0,并且按下Ctrl+Shift+Y。VB将调用过程WhatValue并在单元格B1厘米输入
“zero”
109
… 页面 126…
7。 在单元格A1里输入任意大于0的数字,并按下Ctrl+Shift+Y,VB将再次调用WhatValue。VB评估
第一种条件,因为该测试的结果为假,所以它跳到ElseIf语句。第二个条件为真,因此VB执行
Then后面的语句,并且跳过下一条语句,直接到End If。因为End If后面并没有其它的语句了,
该过程便结束了,单元格B1现在显示“positive”。
8。 在单元格A1里输入任意小于0的数字,并按下Ctrl+Shift+Y。这次,前面两个条件都返回假,
因此VB继续检查第三个条件。因为这次的测试为真,VB就在单元格B1里贴上标签“negative”
9。 在单元格A1里输入任何文本,并按下Ctrl+Shift+Y,VB的反应是“positive”,然而,这不是
个满意的答案。你也许希望VB通过显示“text”来区分开正数和文本。要使你的过程WhatValue
更“聪明”些,你就需要学习如何通过使用嵌套的If…Then语句来作一些更复杂的决定。
6。嵌套的 If…Then 语句
将一个If…Then语句或If…Then…Else语句放在另外一个If…Then语句或If…Then…Else语句里
面,你可以在你的VBA过程里作出更复杂的决定。这种一个If语句里包含另一个If指令块的结构称
为嵌套的If语句。
接下来的过程TestConditions世上节里的过程WhatValue的修正版,演示嵌套的If…Then语句是如
何工作的:
Sub TestConditions()
Range(〃A1〃)。Select
If IsEmpty(ActiveCell) Then
MsgBox 〃The cell is empty。〃
Else
If IsNumeric(ActiveCell。Value) Then
If ActiveCell。Value = 0 Then
ActiveCell。Offset(0; 1)。Value = 〃zero〃
ElseIf ActiveCell。Value 》 0 Then
ActiveCell。Offset(0; 1)。Value = 〃positive〃
ElseIf ActiveCell。Value 《 0 Then
ActiveCell。Offset(0; 1)。Value = 〃negative〃
End If
Else
ActiveCell。Offset(0; 1)。Value = 〃text〃
End If
End If
End Sub
为了使过程TestConditions