ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1597|回复: 0

VBA基础知识(二)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-8 14:27 | 显示全部楼层 |阅读模式
正 文:
1.IF条件句
If语句利用应用程序根据测试条件的结果对不同的情况作出反应。if条件语句有3种语句形式,简单地介绍如下。
(1)If…Then
在程序需要作出“或者”的选择时,应该使用该语句。该语句又有两种形式,分别为单行形式和多行形式。
单行形式的语法为:
If条件Then语句
其中,“条件”是一个数值或一个字符串表达式。若“条件”为True (真),则执行Then后面的语句。“
语句”可以是多个语句,但多个语句要写在一行。例如:
If 1> 10 Then A - A + I 1-0 B-2*A
多行形式的语法为:
If 条件 Then
语句
End If
可以看出,与单行形式相比,要执行的语句是要通过End If来标志结束的。对于执行不方便写在同一行的多条语句时,使用这种形式会使代码整齐美观。例如上面的那个条件语句可以写成:
If 1> 10 Then
B-2*A
(2) If…Then…Else
如果程序必须在两种条件中选择种,则使用If…Then…Else。语法格式为:
If条件Then
语句
Else
语句
End If
若“条件”为True,则执行Then后面的语句:否则,则执行Else后面的语句。例如下面的代码,判断如果UpdateFlag的值为True,则显示一条消息“Update Successfully”,否则显示一条信息“Failed!”。
If UpdateFlag Then
MsgBox "Update Successfully"
Else
MsgBox “Failed”
End If
(3) If…Then…ElseIf…Else
如果要从3种或3种以上的条件中选择1种,则要使用If…They…ElseIf …Else。语法格式为:
IF 条件 1 Then
语句
Elself 条件 2 Then
语句
[Elself 条件 2 Then
语句]…
Else
语句
End If
若“条件1”为True,则执行Then后的语句:否则,再判“条件2”,为Trne时,执行随后的语句,依次类推。当所有的条件都不满足时,执行Else块的语句。例如,下面的语句通过对销售额进行判断,给出雇员的评价和佣金。
If Sales>15000 Then
     Coramission-Sales*0.08
     Rating^Excellent*
     Elself Salses>12000 And Salses<=15000 Then
         Commission-Sales^O.06
         Rating=”Good”
    Elself Sal3es>8000 And Salses<=12000 Then
         Commis3ion-Sales*0.05
         Rating=”Adequate”
Else
     Commission=Sales*0.04
     Rating=”Need Improvement”
End If
2. Select Case 语句
从上面的例子可以看出,如果条件复杂,分支太多,使用If语句就会显得累赘,而且程序变得不易阅读。这时可使用Select Case语句来写出结构清晰的程序。Select Case语句可根据表达式的求值结果,选择执行几个分支中的一个。其语法如下:
Select Case 表达式
Case表达式1
语句
Case表达式2
语句
Case表达式3
语句
Case Else
End Select
在Select Case语句的语法中,Select Case后的表达式是必要参数,可为任何数值表达式或字符串表达式;在每个Case后出现表达式,是多个“比较元素”的列表,其中可包含“表达式”、“表达式To表达式”、“Is<比较操作符>表达式”等几种形式。每个Case后的语句都可包含一条或多条语句。
在程序执行时,如果有一个以上的Case子句与“检验表达式”匹配,则VBA只执行第1个匹配的Case后面的“语句”。如果前面的Case子句与<验表达式>都不匹配,则执行Case Else子句中的“语句”。例如,下面改写上文If语句的雇员佣金的例子:
Select Case Sales
     Case Is>15000
     Commission=Sales*0.08
     RatingVExcellent"
Case 12000 To 15000
     Commission=Sales*0.06
     Rating=”Good”
Case 8000 To 12000
     Commission=Sales*0.05
     Rating="Adequate"
Case Else
     Commission=Sales*0.04
     Rating="Need Improvement"
End Select
3. Do…Loop语句
在许多实例中,用户需要重复一个操作直到满足给定条件才终止操作。例如,用户希望检査单词、句子或文档中的每一个字符,或对有许多元素的数组赋值。循环就是用于这种情况下的。一个较为通用的循环结构的形式是Do…Loop语句,它的语法如下:   
Do [{While | Until}条件]
[语句]
[Exit Do]
[语句]
Loop

Do
[语句]
[Exit Do]
[语句]
Loop [{While|Until}条件]
其中,“条件”是可选参数,是数值表达式或字符串表达式,其值为True或False。如果条件为Null (无条件),则被当作False。While子句和Until子句的作用正好相反,如果指定了前者,则当<条件>是真时继续执行:如果指定了后者,则当<条件>为真时循环结束。如果把While或Until子句放在Do子句中,则必须满足条件才执行循环中的语句;如果把While或Until子句放在Loop子句中,则在检测条件前先执行
        循环中的语句。在Do…Loop中可以在任何位置放置仟意个数的Exit Do语句,随时跳出Do…Loop循环。Exit Do通常用于条件判断之后,例如If…Then,在这种情况下,Exit Do语句将控制权转移到紧接在Loop命令之后的语句。如果Exit Do使用在嵌套的Do…Loop语句中,则Exit Do会将控制权转移到Exit Do所在位置的外层循环
例如下面的代码,通过循环为一个数组陚值。
Dim MyArray(lO) As Integer
Dim i As Integer
i=0
Do While i<=10
MyArray (i)=i
i=i+1
Loop
4. While…Wend 语句
在VBA中支持While…Wend循环,它与Do While…Loop结构相似,但不能在循环的中途退出。它的语法为:
while条件
语句
Wend
如果条件为True,则所有的语句都会执行,一直执行到Wend语句。然后再回到While语句,并再一次检查条件,如果条件还是为True,则审复执行:如果不为True,则程序会从Wend语句之后的语句继续执行。While…Wend循环也可以是多层的嵌套结构,每个Wend匹配最近的While语句。
例如上面的Do…Loop的代码,可以用While…Wend来实现,语法格式如下:
Dim MyArray(10) As Integer
Dim i As Integer
I=0
While i<=10
MyArray(i)=i
i=i+1
Wend
在VBA中提供While…Wend结构是为了与BASIC的早期版本兼容,用户应该逐渐抛弃这种使用法,而使用Do…Loop语句这种结构化与适应性更强的方法来执行循环。
5. For...Next 语句
For循环可以将一段程序重复执行指定的次数,循环中使用一个计数变虽,每执行一次循环,其值都会增加(或减少)。语法格式如下:
For计数器=初值To末值[步长]
语句
[Exit For]
语句
Next[计数器]
其中,“计数器”是一个数值变最。若未指定“步长”,则默认为1。如果“步长”是正数或0,则“初值”应大于等于“末值”;否则,“初值”应小于等于“末值”。VBA在开始时,将“计数器”的值设为“初值”。在执行到相应的Next语句时,就把步长加(减)到计数器上。在循环中可以在任何位置放置任意个Exit For语句,随时退出循环。Exit For经常在条件判断之后使用(例如If…Then),并将控制权转移到紧接在Next之后的语句。可以将—个For…Next循环放置在另一个
        For…Next循环中,组成嵌套循环。不过在每个循环中的计数器要使用不同的变量名。
下面的代码使用For..Next循环为MyArray数组斌值。
Dim MyArray(10) As Integer
Dim i As Integer
For i=0 To 10
MyArray(i)=i
Next i
6. For Each…Next 语句
For Each…Next语句针对一个数组或集合中的每个元素,重复执行一组语句。语法格式为:
For Each元素In组或集合
语句
[Exit For]
语句_
Next元素
For…Each…Next语句中的元素用来遍历集合或数组中所有元素的变量。对于集合来说,这个元素可能是一个Variant变量、一个通用对象变量或任何特殊对象变量。对于数组而言,这个元素只能是一个Variant变量。组或集合是数组或对象集合的名称。如果集合中至少有一个元素,就会进入For…Each块执行。一旦进入循环,便先针对组或集合中第一个元素执行循环中的所有语句。如果在该组中还有其他的元素,则会针对它们执行循环中的语句,当组中的所有元素都执行完了,便会退出循环,然后从Next语句之后的语句继续执行。可以在循环中的任何位置放置任意个Exit For语句,以便随时退出循环。Exit For经常在条件判断之后使用(例如If…Then),并将控制权转移到紧接在Next之后的语句。可以将一个For…Each…Next循环放在另一个之中来组成嵌套式For…Each…Next循环,但是每个循环的元素必须是惟一的。下面的代码,定义一个数组并陚值,然后使用For…Each…Next循环在Debug窗口中打印数组中每一项的值。
Sub demo()
Dim MyArray (10) As Integer
Dim i As Integer
Dim x As Variant
For i - 0 To 10 ‘数组賦值
MyArray(i)=i
Next i
For Each x In MyArray For…Each…Next 循环
Debug.Print x ‘打印数组中的每一项
Next x
End Sub
运行时在Debug窗口中的输出结果为:
7.With…End With 语句
With语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在With控制结构中加上属性的陚值语句,这时候只是引用对象一次而不是在每个域性陚值时都要引用它。它的语法格式如下:
With对象
语句
End with
下面的例子显示了如何使用With语句来给同一个对象的几个属性賦值。
With MyLabel
.Height = 2000
.Width - 2000
.Caption = "This is MyLabel"
End With
当程序一旦进入With块,对象就不能改变。因此不能用一个With语句来设置多个不同的对象。可以将一个With块放在另一个之中,而产生嵌套的With语句。但是,由于外层With块成员会在内层的With块中被屏蔽掉,所以必须在内层的With块中,使用完整的对象引用來指出在外层的With块中的对象成员。
8. Exit语句
Exit语句用于退出Do…Loop、For…Next、Function、Sub或Property代码块。它包含Exit Do、Exit For、Exit Function、Exit Property 和 Exit Sub 几个语句。
下面的示例使用Exit语句退出For…Next循环、Do…Loop循环及子过程
Sub ExitStatementDemo()
Dim I, MyNum
Do’建立无穷循环
For I = 1 To 1000'循环1000次
MyNum = Int(Rnd * 1000)'生成一随机数
Select Case MyNum’检査随机数
Case 7: Exit For'如果是7退出For…Next循环.
Case 29: Exit Do'如果是29,退出DO…Loop循环.
Case 54: Exit Sub'如果是54,退出子过程
End Select
Next I
Loop
End Sub
9. GoTo语句
无条件地转移到过程中指定的行,它的语法为:GoTo行标签其中行标签用来指示一行代码。行标签可以是任何字符的组合,以字母开头,以冒号 (:)结尾。行标签与大小写无关,必须从第1列开始标注行标签。GoTo语句将用户代码转移到行标签的位置,并从该点继续执行。下面的示例使用GoTo语句在个过程内的不同程序段间作流程控制,不同程序段用不同的行标签来区分。
Sub GotoStatementDeino ()
Dim Number, MyString
Number = 1 '设置变量初始值
'判断Number的值以决定要完成那一个裎序区段(以”行标签"来表式),
If Number =1 Then GoTo Linel Else GoTo Line2
Linel: '行标签
MyString = "Number equals 1"
GoTo LastLine '完成最后一行.
Line2: '行标签
'下列的语句根本不会被完成.
MyString = "Number equals 2"
LastLine: '行标签
Debug.Print MyString  '将""Number equals 1”"显示在"立即"窗口.
End Sub
太多的GoTo语句,会使程序代码不容易阅读及调试。在VBA中使用GoTo语句只有一个目的,就是用On Error GoTo Label语句处埋错误。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 19:00 , Processed in 0.031110 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表