【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
VBA手册
VBA概述
VBA代表Visual Basic for Applications,这是一种来自Microsoft的事件驱动编程语言,现在主要与Microsoft Office应用程序(如MSExcel,MS-Word和MS-Access)一起使用。
它帮助技术人员构建定制的应用程序和解决方案,以增强这些应用程序的功能。这个工具的优点是不需要在电脑上安装visual basic,直接从安装Office软件中就能隐含地使用来达到目的。
您可以在所有Office版本中使用VBA,从MS-Office 97到MS-Office 2016以及任何最新版本。 在VBA中,Excel VBA是最流行的。使用VBA的好处是可以使用线性编程在MS Excel中建立非常强大的工具。
VBA之HelloWorld
我们来学习如何逐步编写一个简单的宏。
第1步 - 首先,在Excel 2016中启用“开发者”菜单。要完成这个设置,请点击左上角菜单:文件 -> 选项。如下图所示 -
第2步 - 点击“自定义功能区”选项卡并选中“开发工具”。然后点击“确定”。如下图所示 -
第3步 - “开发工具”功能区出现在菜单栏中。如下图所示 -
第4步 - 点击 “Visual Basic” 按钮打开VBA编辑器。如下图所示 -
第5步 - 通过添加一个按钮启动脚本。点击插入 -> 选择按钮。如下图所示 -
第6步 - 右键单击按钮并选择“属性”。如下图所示 -
第7步 - 编辑名称和标题,如下面的截图所示 -
第8步 - 现在双击该按钮,将显示子程序编写区域,如下图所示 -
第9步 - 通过简单编码,添加一条消息,运行并测试。如下图所示 -
Private Sub say_hello_Click() MsgBox "Hi,欢迎您学习VBA~!" End Sub Vb
第10步 - 点击按钮执行子程序,子程序的输出如下图所示 -
这样一个简单的VBA程序就编写完成了。
VBA术语
在本章中,将介绍常用的Excel VBA术语。这些术语将在很多的模块中使用,因此理解其中的每一个术语都很重要。
模块
模块是编写代码的区域。如下图中,这是一个新的工作簿,因此没有任何模块。
要插入模块,请导航到插入 -> 模块。当插入模块之后,就会有一个名称为“模块1”的模块被创建了。如下图所示 -
插入模块完成之后,就可以在模块中编写VBA代码,代码写在一个过程(Sub)中。 一个过程/子过程是一系列的VBA语句,指示要做什么工作。如下图所示 -
程序/过程
程序(也叫作过程)是作为一个整体执行的一组语句,它指示Excel如何执行特定的任务。 执行的任务可能是一个非常简单或非常复杂的任务。不过,把复杂的程序分解成小的程序是一个很好的做法。
程序的两种主要类型,它们分别是:子程序(Sub
)和函数(Function
)。下面是一段简单的代码 -
函数
函数是一组可重用的代码,可以在程序中的任何地方调用。 这消除了一遍又一遍地编写相同的代码的需要。 这有助于程序员将大型程序划分为许多小型且可管理的功能。
除了内置函数外,VBA还允许编写用户定义的函数,并在 Function
和 End Function
关键字之间写入语句。
子过程
子程序的功能与功能类似。虽然子程序没有返回值,函数可能会或不会返回一个值。子程序可以不使用call
关键字调用。子程序总是在Sub
和End Sub
之间包含执行的语句。
VBA宏注释
注释用于记录程序逻辑和用户信息,其他程序员将来可以阅读并理解相同的代码无缝工作。
它包括由开发者,修改者以及还可以包括合并逻辑的信息。 解释器在执行时忽略注释。
VBA中的注释用两种方法表示,它们分别如下 -
-
任何以单引号(
'
)开头的语句都被视为注释。以下是注释的一个例子。可以位于别的语句之尾,也可单独一行
' This Script is invoked after successful login ' Written by : Yiibai Yiibai ' Return Value : True / False
-
任何以关键字
"REM"
开头的语句。以下是注释的一个例子。只能单独一行
REM This Script is written to Validate the Entered Input REM Modified by : Yiibai Yiibai /user2
VBA基础
VBA变量
变量
变量是一个指定的内存位置,用于保存脚本执行过程中可以更改的值。以下是命名变量的基本规则。
-
变量名称必须使用一个字母作为第一个字符。
-
变量名称不能使用空格,句点(
.
),感叹号(!
)或字符@
,&
,$
,#
。 -
变量名称的长度不能超过
255
个字符。 -
不能使用Visual Basic保留关键字作为变量名称。
语法
在VBA中,变量需要在使用它们之前声明。
Dim <<variable_name>> As <<variable_type>>
数据类型
有许多VBA数据类型,可以分为两大类,即数字和非数字数据类型。
1. 数字数据类型
下表显示数字数据类型和允许的值范围。
编号 | 数字类型 | 范围值 |
---|---|---|
1 | Byte |
0 ~ 255 |
2 | Integer |
-32,768 ~ 32,767 |
3 | Long |
-2,147,483,648 ~ 2,147,483,648 |
4 | Single |
负值:-3.402823E+38 ~ -1.401298E-45 ,正值: 1.401298E-45 ~ 3.402823E+38 |
5 | Double |
负值:-1.79769313486232e+308 ~ -4.94065645841247E-324 ,正值: 4.94065645841247E-324 ~ 1.79769313486232e+308 |
6 | Currency |
-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
7 | Decimal |
如果不使用小数,则为+/- 79,228,162,514,264,337,593,543,950,335 ;如果使用小数,则为:+/- 7.9228162514264337593543950335 |
2. 非数字数据类型
下表显示了非数字数据类型和允许的值范围。
编号 | 数字类型 | 范围值 |
---|---|---|
1 | 固定长度:String |
1 ~ 65,400个字符 |
2 | 可变长度:String |
0到20亿字符 |
3 | Date |
100年1月1日至9999年12月31日 |
4 | Boolean |
True / False |
5 | Object |
任何嵌入的对象 |
6 | Variant (numeric) |
任何大到double的数字值 |
7 | Variant (text) |
与可变长度的string 一样。 |
示例
在这个示例中,创建一个按钮并命名为“VariablesDemo” 来演示变量的使用。
参考实现的代码如下 -
Private Sub VariablesDemo() Dim password As String password = "123456" Dim num As Integer num = 1234 Dim BirthDay As Date BirthDay = DateValue("1998-10-11") MsgBox ("设置的密码是:" & password & Chr(10) & "num的值是:" & num & Chr(10) & "Birthday的值是:" & BirthDay) End Sub
执行上面示例代码,得到以下结果 -
VBA常量
常量
常量是一个命名的内存位置,用于保存脚本执行期间固定(无法更改)的值。如果用户试图更改常量值,则脚本执行结束时会出现错误。常量声明与声明变量相同。
以下是命名常量的规则 -
-
常量名称必须使用一个字母作为第一个字符。
-
常量名称不能在名称中使用空格,句点(
.
),感叹号(!
)或字符@
,&
,$
,#
。 -
常量名称的长度不能超过
255
个字符。 -
不能使用Visual Basic保留关键字作为常量名称。
语法
在VBA中,需要为声明的常量赋值。如果试图改变常量的值,就会抛出一个错误。VBA中常量的语法如下所示 -
Const <<constant_name>> As <<constant_type>> = <<constant_value>>
示例
在这个示例中,创建一个“ConstantDemo”
程序来演示如何使用常量。
参考以下代码实现 -
Private Sub ConstantDemo() Const MyInteger As Integer = 720 Const myDate As Date = #10/21/2000# Const myDay As String = "Sunday" MsgBox ("整数值是:" & MyInteger & Chr(10) & "myDate的值是:" & myDate & Chr(10) & "myDay 的值是:" & myDay) End Sub
执行上面示例代码,得到以下结果 -
VBA变量和常量注意点
(1)VBA允许使用未定义的变量,默认是变体变量
(2)在模块通用说明部分,加入Option Explicit语句可以强迫用户进行变量定义
(3)变量定义语句及变量作用域
一般变量作用域的原则是,那部分定义就在那部分起作用,模块中定义则在该模块那作用。
(4)常量为变量的一种特例,用Const定义,且定义时赋值,程序中不能改变值,作用域也如同变量作用域。如下定义:Const Pi=3.1415926 as single
VBA运算符
运算符
运算符可以用一个简单的表达式定义,例如:4 + 5
等于9
。这里,4
和5
称为操作数,+
被称为运算符。VBA支持以下类型的运算符 -
-
算术运算符
-
比较运算符
-
逻辑(或关系)运算符
-
连接运算符
算术操作符
以下是VBA支持算术运算符。
假设变量A=5
,变量B=10
,那么 -
运算符 | 描述 | 示例 |
---|---|---|
+ |
两个操作数相加 | A + B = 15 |
- |
两个操作数相减 | A - B = -5 |
* |
两个操作数相乘 | A * B = 50 |
/ |
两个操作数相除 | B / A = 2 |
% |
模运算符,整数除法后的余数 | B % A = 0 |
^ |
指数运算符 | B ^ A = 100000 |
有关如何使用,请参考算术运算符示例。
比较运算符
VBA支持的比较运算符如下所示。
假设变量A=10
,变量B=20
,则 -
运算符 | 描述 | 示例 |
---|---|---|
= |
检查两个操作数的值是否相等。如果是,那么条件是真。 | (A = B) 结果为:False |
<> |
检查两个操作数的值是否不相等。如果值不相等,则条件为真。 | (A <> B) 结果为:True |
> |
检查左操作数的值是否大于右操作数的值。如果是,那么条件是真。 | (A > B) 结果为:False |
< |
检查左操作数的值是否小于右操作数的值。如果是,那么条件是真。 | (A < B) 结果为:True |
>= |
检查左操作数的值是否大于或等于右操作数的值。 如果是,那么条件是真。 | (A >= B) 结果为:False |
<= |
检查左操作数的值是否小于或等于右操作数的值。如果是,那么条件是真。 | (A <= B) 结果为:True |
有关如何使用,请参考比较运算符示例。
逻辑运算符
以下由VBA支持的逻辑运算符。
假设变量A=10
,变量B=0
,则 -
运算符 | 描述 | 示例 |
---|---|---|
AND |
逻辑AND 运算符。如果两个条件都为真,则表达式为真。 |
A<>0 AND B<>0 结果为:False |
OR |
逻辑OR 运算符。如果两个条件中的任何一个为真,则条件为真。 |
A<>0 OR B<>0 结果为:True |
NOT |
逻辑NOT 运算符。用于反转其操作数的逻辑状态。 如果条件成立,那么逻辑非运算符结果是条件不成立。 |
NOT(a<>0 OR b<>0) 结果为:False |
XOR |
逻辑排除。它是NOT 和OR 运算符的组合。如果表达式中只有一个表达式的值为True ,则结果为True 。 |
(a<>0 XOR b<>0) 结果为:True |
有关如何使用,请参考逻辑运算符示例。
连接操作符
VBA支持以下连接运算符。
假设变量A=5
,变量B=10
,则 -
运算符 | 描述 | 示例 |
---|---|---|
+ |
将两个值添加为变量,其值是数字 | A + B = 15 |
& |
连接两个值 | A & B = 510 |
假设变量A = "Microsoft"
,变量B = "VBScript"
,则 -
运算符 | 描述 | 示例 |
---|---|---|
+ |
连接两个值 | A + B 的结果为MicrosoftVBScrip |
& |
连接两个值 | A & B 的结果为MicrosoftVBScrip |
注 - 连接操作,可用于数字和字符串。输出取决于上下文,如果变量保存数字值或字符串值。
VBA标识符
标识符
标识符是一种标识变量、常量、过程、函数、类等语言构成单位的符号,利用它可以完成对变量、常量、过程、函数、类等引用。VBA标识符规则如下 -
-
字母打头,由字母、数字和下划线组成,如A987b_23Abc
-
字符长度小于40,(Excel2002以上中文版本等,可以用汉字且长度可达254个字符)
-
不能与VB保留字重名,如public,private,dim,goto,next,with,integer,single等
书写规范
-
VBA不区分标识符的字母大小写,一律认为是小写字母;
-
一行可以书写多条语句,各语句之间以冒号 : 分开;
-
一条语句可以多行书写,以空格加下划线 _ 来标识下行为续行;
-
标识符最好能简洁明了,不造成歧义。
VBA数据类型
VBA共有12种数据类型,具体见下表,此外用户还可以根据以下类型用Type自定义数据类型。
VBA语法
VBA判断语句
判断语句
判断允许程序员控制脚本或其中一个部分的执行流程。执行由一个或多个条件语句控制。 以下是在大多数编程语言中找到的典型决策结构的一般形式。
VBA提供了以下类型的决策声明。 点击以下链接来查看它们的详细信息。
编号 | 语句 | 描述 |
---|---|---|
1 | if语句 | 一个if语句由一个布尔表达式和一个或多个语句组成。 |
2 | if…else语句 | if else语句由一个布尔表达式和一个或多个语句组成。如果条件为True,则执行If语句下的语句。如果条件为false,则执行脚本的Else部分。 |
3 | if…elseif…else语句 | 一个if语句,后跟一个或多个else...if语句,它由布尔表达式组成,接着是一个可选的else语句,当所有条件变为false时执行else语句块。 |
4 | 嵌套if语句 | 一个if或elseif语句中可以嵌套另一个if或elseif语句。 |
5 | switch语句 | 一个switch语句允许一个变量与一个值列表进行测试。 |
VBA if语句
一个if
语句由一个布尔表达式和一个或多个语句组成。如果条件被评估为True
,则执行If
条件块下的语句。如果条件被评估为False
,则执行If
循环块后面的语句。
语法
以下是VBScript中的If
语句的语法。
If(boolean_expression) Then Statement 1 ..... ..... Statement n End If Vb
流程
示例
为了演示目的,实现一个函数找出两个Excel中最大的数字。
实现代码 -
Private Sub if_demo_Click() Dim x As Integer Dim y As Integer x = 234 y = 32 If x > y Then MsgBox ("X 的值大于 Y 的值") End If End Sub Vb
当上面的代码被执行时,它会产生以下结果。
VBA if...else语句
一个if语句由一个布尔表达式和一个或多个语句组成。如果条件评估为True
,则执行if
条件下的语句。如果条件评估为False
,则执行else
部分块下的语句。
语法
以下是VBScript中的if else
语句的语法。
If(boolean_expression) Then Statement 1 ..... ..... Statement n Else Statement 1 ..... .... Statement n End If Vb
流程图
示例
为了演示目的,这里借助一个函数找出两个Excel中最大的数字。如下图所示 -
参考实现代码 -
Private Sub if_demo_Click() Dim x As Integer Dim y As Integer x = 10 y = 20 If x > y Then MsgBox ("X 的值大于 Y 的值") Else MsgBox ("Y 的值大于 X 的值") End If End Sub Vb
执行上面示例代码,得到以下结果 -
VBA if...elseif...else语句
一个If语句,后面可以跟一个或多个由布尔表达式组成的elseif
语句,然后是一个默认的else
语句,当所有条件变为false
时执行else
语句块。
语法
以下是VBScript中If...Elseif...Else
语句的语法。
If(boolean_expression) Then Statement 1 ..... ..... Statement n ElseIf (boolean_expression) Then Statement 1 ..... .... Statement n ElseIf (boolean_expression) Then Statement 1 ..... .... Statement n Else Statement 1 ..... .... Statement n End If Vb
流程图
示例
为了演示目的,这里借助一个函数找出两个Excel中最大的数字。如下图示 -
参考实现代码 -
Private Sub if_demo_Click() Dim x As Integer Dim y As Integer x = 10 y = 10 If x > y Then MsgBox ("X 大于 Y 的值") ElseIf y > x Then MsgBox ("Y 大于 X 的值") Else MsgBox ("X 和 Y 的值相等") End If End Sub Vb
执行上面示例代码,得到以下结果 -
VBA嵌套if语句
一个If
或ElseIf
语句可以嵌套在另一个If
或ElseIf
语句中。内部的If
语句是根据最外层的If
语句执行的。这使得VBScript能够轻松处理复杂的条件。
语法
以下是VBScript中嵌套的If
语句的语法。
If(boolean_expression) Then Statement 1 ..... ..... Statement n If(boolean_expression) Then Statement 1 ..... ..... Statement n ElseIf (boolean_expression) Then Statement 1 ..... .... Statement n Else Statement 1 ..... .... Statement n End If Else Statement 1 ..... .... Statement n End If Vb
示例
为了演示目的,这里借助一个函数来判断一个正数的类型。如下图中所示 -
参考实现代码 -
Private Sub nested_if_demo_Click() Dim a As Integer a = 12 If a > 0 Then MsgBox ("The Number is a POSITIVE Number") If a = 1 Then MsgBox ("The Number is Neither Prime NOR Composite") ElseIf a = 2 Then MsgBox ("The Number is the Only Even Prime Number") ElseIf a = 3 Then MsgBox ("The Number is the Least Odd Prime Number") Else MsgBox ("The Number is NOT 0,1,2 or 3") End If ElseIf a < 0 Then MsgBox ("The Number is a NEGATIVE Number") Else MsgBox ("The Number is ZERO") End If End Sub Vb
执行上面示例代码,得到以下结果 -
点击确定按钮后,如下所示 -
VBA switch语句
当用户想要根据Expression的值执行一组语句时,使用Switch Case
语句。 每个值被称为一个”情况”,并根据每种情况变量接通测试。如果测试表达式与用户指定的任何Case
不匹配,则执行Case Else
语句。
Case Else
是Select Case
中的一个可选语句,但是,总是使用一个Case Else
语句是一个很好的编程习惯。
语法
以下是VBScript中的Switch
语句的语法。
Select Case expression Case expressionlist1 statement1 statement2 .... .... statement1n Case expressionlist2 statement1 statement2 .... .... Case expressionlistn statement1 statement2 .... .... Case Else elsestatement1 elsestatement2 .... .... End Select Vb
示例
为了演示目的,这里通过一个函数的来计算整型的类型。参考以下图 -
参考示例代码 -
Private Sub switch_demo_Click() Dim MyVar As Integer MyVar = 1 Select Case MyVar Case 1 MsgBox "The Number is the Least Composite Number" Case 2 MsgBox "The Number is the only Even Prime Number" Case 3 MsgBox "The Number is the Least Odd Prime Number" Case Else MsgBox "Unknown Number" End Select End Sub
执行上面示例代码,得到以下结果 -
VBA循环语句
当需要多次执行一段代码时,就可以使用循环语句。 一般来说,语句是按顺序执行的:函数中的第一个语句首先执行,然后是第二个,依此类推。
编程语言提供了各种控制结构,允许更复杂的执行路径。
循环语句允许多次执行语句或语句组。 以下是VBA中循环语句的一般形式。
VBA提供以下类型的循环来处理循环需求。点击以下链接查看详细信息。
编号 | 循环类型 | 描述 |
---|---|---|
1 | for循环 | 多次执行一系列语句,缩写管理循环变量的代码。 |
2 | for…each循环 | 如果组中至少有一个元素并为组中的每个元素重复执行,则执行此操作。 |
3 | while…wend循环 | 这在执行循环体之前测试条件。 |
4 | do…while循环 | do..while语句只要条件为True就会被执行(即,)循环应该被重复直到条件为False。 |
5 | do…until循环 | 只要条件是False,do..Until语句就会被执行(即,)循环应该被重复直到条件为真。 |
VBA for循环
for
循环是一种重复控制结构,它允许开发人员有效地编写需要执行特定次数的循环。
语法
以下是VBA中for
循环的语法。
For counter = start To end [Step stepcount] [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] .... [statement n] Next Vb
流程图
以下是For
循环中的控制流程 -
-
For
步骤先执行。这一步允许您初始化任何循环控制变量,并递增步进计数器变量。 -
其次,评估条件。 如果评估结果为:
True
,则循环体被执行。 如果为False
,则循环体不会执行,并且控制流将跳转到紧跟在For
循环之后的下一个语句。 -
在执行
For
循环体之后,控制流将跳转到下一个语句。 这个语句更新任何循环控制变量。 它根据步计数器值进行更新。 -
现在条件再次评估。 如果条件为:
True
,则循环执行并且该过程重复自身(循环体,然后递增步,然后再次条件)。 条件变为False
后,For
循环终止。
示例
添加一个模块,并添加以下函数代码 -
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 MsgBox ("The value is i is : " & i) Next End Sub Vb
当上面的代码被编译并执行时,会产生类似以下结果。
The value is i is : 0 The value is i is : 2 The value is i is : 4 The value is i is : 6 The value is i is : 8 The value is i is : 10 Shell
VBA For Each循环
For Each
循环用于为数组或集合中的每个元素执行语句或一组语句。 For Each
循环与For
循环类似; 然而,For Each
循环是为数组或组中的每个元素执行的。 因此,这种类型的循环中将不存在步计数器。 它主要用于数组或在文件系统对象的上下文中使用,以便递归操作。
语法
以下是VBA中For Each
循环的语法。
For Each element In Group [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] Next Vb
示例
Private Sub Constant_demo_Click() 'fruits is an array fruits = Array("苹果", "橙子", "樱桃") Dim fruitnames As Variant 'iterating using For each loop. For Each Item In fruits fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub Vb
当执行上面的代码时,它会在每行中打印一个项目的所有水果名称。
VBA While Wend循环
在While...Wend
循环中,如果条件为True
,则会执行所有语句,直到遇到Wend
关键字。
如果条件为false
,则退出循环,然后控件跳转到Wend
关键字后面的下一个语句。
语法
以下是VBA中While..Wend
循环的语法。
While condition(s) [statements 1] [statements 2] ... [statements n] Wend Vb
流程图
示例
参考以下示例代码的实现 -
Private Sub Constant_demo_Click() Dim Counter : Counter = 10 While Counter < 15 ' Test value of Counter. Counter = Counter + 1 ' Increment Counter. msgbox "The Current Value of the Counter is : " & Counter Wend ' While loop exits if Counter Value becomes 15. End Sub Vb
当上面的代码被执行时,它会在消息框中打印以下内容。
The Current Value of the Counter is : 11 The Current Value of the Counter is : 12 The Current Value of the Counter is : 13 The Current Value of the Counter is : 14 The Current Value of the Counter is : 15 Shell
VBA Do...While循环
一个Do...while
循环用于只要条件为真就重复一组语句。该条件可以在循环开始时或循环结束时检查。
语法
以下是VBA中的一个Do...While
循环的语法。
Do While condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop Vb
流程图
示例
以下示例使用Do...while
循环来检查循环开始处的条件。循环内部的语句只有在条件成立时才被执行。
Private Sub Constant_demo_Click() Do While i < 5 i = i + 1 msgbox "The value of i is : " & i Loop End Sub Vb
当上面的代码被执行时,它会在消息框中输出下面的输出。
The value of i is : 1 The value of i is : 2 The value of i is : 3 The value of i is : 4 The value of i is : 5 Vb
备用/替代语法
另外还有一个替代语句for...while
循环,用于在循环结束时检查条件。下面的例子解释了这两种语法的主要区别。语法 -
Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop While condition Vb
示例
以下示例使用Do...while
循环来检查循环结束时的条件。循环内的语句至少执行一次,即使条件为False
。
Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox "The value of i is : " & i Loop While i < 3 'Condition is false.Hence loop is executed once. End Sub Vb
当上面的代码被执行时,它会在消息框中输出下面的输出。
VBA循环控制语句
循环控制语句从正常顺序改变执行。 当执行离开一个作用域时,循环中的所有其余语句都不会被执行。
VBA支持以下控制语句。点击以下链接查看详细信息。
编号 | 控制语句 | 描述 |
---|---|---|
1 | Exit For语句 | 终止For循环语句并将执行转移到循环之后的语句 |
2 | Exit Do语句 | 终止Do While语句并将执行转移到循环之后的语句 |
VBA Exit For语句
当想要根据特定标准退出For
循环时,就可以使用Exit For
语句。当执行Exit For
时,控件会立即跳转到For
循环之后的下一个语句。
语法
以下是在VBA中Exit For
语句的语法。
Exit For Vb
流程图
示例
以下使用Exit For
语句的示例。 如果计数器(i
)的值达到4
,则退出For
循环,并在For
循环之后立即跳转到下一个语句。
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2 MsgBox ("The value is i is : " & i) If i = 4 Then i = i * 10 'This is executed only if i=4 MsgBox ("The value is i is : " & i) Exit For 'Exited when i=4 End If Next End Sub
当执行上面的代码时,它将在消息框中输出以下输出。
The value is i is : 0 The value is i is : 2 The value is i is : 4 The value is i is : 40 Shell
VBA Exit Do语句
当想要根据特定标准退出Do
循环时,可使用Exit Do
语句。 它可以同时用于Do...While
和Do...Until
直到循环。
当Exit Do
被执行时,控制器在Do
循环之后立即跳转到下一个语句。
语法
以下是在VBA中Exit Do
语句的语法。
Exit Do Vb
示例
以下示例演示如何使用Exit Do
语句,如果计数器的值达到10
,则退出Do
循环,并在For
循环之后立即跳转到下一个语句。
Private Sub Constant_demo_Click() i = 0 Do While i <= 100 If i > 10 Then Exit Do ' Loop Exits if i>10 End If MsgBox ("The Value of i is : " & i) i = i + 2 Loop End Sub Vb
当上面的代码被执行时,它会在消息框中输出下面的输出。
The Value of i is : 0 The Value of i is : 2 The Value of i is : 4 The Value of i is : 6 The Value of i is : 8 The Value of i is : 10
VBA字符串
字符串
字符串是一个字符序列,可以由字母,数字,特殊字符或全部字符组成。 如果一个变量被包含在双引号""
中,则被认为是一个字符串。
语法
variable_name = "this is a string"
简单示例
str1 = "string" ' Only Alphabets str2 = "132.45" ' Only Numbers str3 = "!@#$;*" ' Only Special Characters Str4 = "Asc23@#" ' Has all the above
字符串函数
预定义的VBA字符串函数可以帮助开发人员非常有效地处理字符串。以下是VBA中支持的字符串的方法。请点击每个方法来详细了解。
编号 | 函数 | 描述 |
---|---|---|
1 | InStr | 返回指定子字符串的第一个匹配项。从左到右搜索。 |
2 | InstrRev | 返回指定子字符串的第一个匹配项。从右到左搜索。 |
3 | Lcase | 返回指定字符串的小写字母。 |
4 | Ucase | 返回指定字符串转为大写字母的形式。 |
5 | Left | 返回在左侧指定数量字符的字符串。 |
6 | Right | 返回在右侧指定数量字符的字符串 |
7 | Mid | 根据指定的参数从字符串中返回特定数量的字符。 |
8 | Ltrim | 删除指定字符串左侧的空格后返回一个字符串。 |
9 | Rtrim | 删除指定字符串右侧的空格后返回一个字符串。 |
10 | Trim | 删除开头和结尾空格后返回一个字符串值。 |
11 | Len | 返回给定字符串的长度。 |
12 | Replace | 用另一个字符串替换字符串后返回字符串。 |
13 | Space | 用指定数量的空格填充字符串。 |
14 | StrComp | 比较两个指定的字符串后返回一个整数值。 |
15 | String | 返回指定次数的字符的字符串。 |
16 | StrReverse | 反转给定字符串的字符序列后,返回一个字符串。 |
VBA日期时间函数
VBScript日期和时间函数帮助开发人员将日期和时间从一种格式转换为另一种格式,或以适合特定条件的格式表示日期或时间值。
日期函数
编号 | 函数 | 描述 |
---|---|---|
1 | Date | 一个函数,它返回当前的系统日期。 |
2 | CDate | 一个函数,将给定的输入转换为日期。 |
3 | DateAdd | 一个函数,它返回一个指定的时间间隔被添加的日期。 |
4 | DateDiff | 一个函数,它返回两个时间段之间的差异。 |
5 | DatePart | 一个函数,它返回给定输入日期值的指定部分。 |
6 | DateSerial | 函数,返回给定年份,月份和日期的有效日期。 |
7 | FormatDateTime | 一个函数,根据提供的参数格式化日期。 |
8 | IsDate | 无论提供的参数是否为日期,都返回一个布尔值的函数。 |
9 | Day | 一个函数,它返回一个1到31之间的整数,表示指定日期的某一天。 |
10 | Month | 一个函数,它返回一个介于1和12之间的整数,表示指定日期的月份。 |
11 | Year | 一个函数,它返回一个表示指定日期的年份的整数。 |
12 | MonthName | 一个函数,返回指定日期的特定月份的名称。 |
13 | WeekDay | 一个函数,返回一个整数(1到7),表示指定日期的星期几。 |
14 | WeekDayName | 一个函数,返回指定日期的星期几名称。 |
时间函数
编号 | 函数 | 描述 |
---|---|---|
1 | Now | 一个函数,它返回当前系统的日期和时间。 |
2 | Hour | 一个函数,它返回一个介于0到23之间的整数,表示给定时间的小时部分。 |
3 | Minute | 一个函数,它返回0到59之间的整数,表示给定时间的分钟部分。 |
4 | Second | 一个函数,返回0到59之间的一个整数,表示给定时间的秒数部分。 |
5 | Time | 一个函数,它返回当前的系统时间。 |
6 | Timer | 一个函数,返回自上午12:00以来的秒数和毫秒数。 |
7 | TimeSerial | 一个函数,它返回小时,分钟和秒的特定输入的时间。 |
8 | TimeValue | 将输入字符串转换为时间格式的函数。 |
VBA数组
我们都知道,一个变量是一个存储值的容器。 有时,开发人员希望一次可以在一个变量中保存多个值。 当一系列值存储在单个变量中时,则称为数组变量。
数组声明
数组声明的方式与声明变量相同,只是数组变量的声明使用括号。 在下面的例子中,括号里提到了数组的大小。参考以下示例 -
'Method 1 : Using Dim Dim arr1() 'Without Size 'Method 2 : Mentioning the Size Dim arr2(5) 'Declared with size of 5 'Method 3 : using 'Array' Parameter Dim arr3 arr3 = Array("apple","Orange","Grapes")
在上面代码中,
-
虽然数组大小被指定为
5
,但是当数组索引从零开始时,它可以保持6
个值。 -
数组索引不能是负数。
-
VBScript数组可以在数组中存储任何类型的变量。因此,一个数组可以在一个数组变量中存储一个整数,字符串或字符。
赋值给数组
通过为每个要分配的值指定一个数组索引值,将这些值分配给数组。它可以是一个字符串。
例子
添加一个模块并添加以下代码 -
Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub Vb
当执行上面的函数时,它会产生下面的输出。
Value stored in Array index 0 : 1 Value stored in Array index 1 : VBScript Value stored in Array index 2 : 100 Value stored in Array index 3 : 2.45 Value stored in Array index 4 : 7/10/2013 Value stored in Array index 5 : 12:45:00 PM
多维数组
数组不仅限于一个维度,但它们最多可以有60
个维度。 二维数组是最常用的数组。
例子
在下面的例子中,一个多维数组被声明为3
行4
列。
Private Sub Constant_demo_Click() Dim arr(2,3) as Variant ' Which has 3 rows and 4 columns arr(0,0) = "Apple" arr(0,1) = "Orange" arr(0,2) = "Grapes" arr(0,3) = "pineapple" arr(1,0) = "cucumber" arr(1,1) = "beans" arr(1,2) = "carrot" arr(1,3) = "tomato" arr(2,0) = "potato" arr(2,1) = "sandwitch" arr(2,2) = "coffee" arr(2,3) = "nuts" msgbox("Value in Array index 0,1 : " & arr(0,1)) msgbox("Value in Array index 2,2 : " & arr(2,2)) End Sub
当执行上面的函数时,它会产生下面的输出。
Value stored in Array index : 0 , 1 : Orange Value stored in Array index : 2 , 2 : coffee
ReDim语句
ReDim
语句用于声明动态数组变量并分配或重新分配存储空间。
ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
参数说明
-
Preserve - 一个可选参数,用于在更改最后一个维度的大小时保留现有数组中的数据。
-
Varname - 必需的参数,表示变量的名称,应遵循标准变量命名约定。
-
Subscripts - 必需的参数,表示数组的大小。
例子
在下面的例子中,数组已经被重新定义,当数组的现有大小发生改变时,这些值被保存下来。
注意 - 调整数组的大小时,删除的元素中的数据将丢失。
Private Sub Constant_demo_Click() Dim a() as variant i = 0 redim a(5) a(0) = "XYZ" a(1) = 41.25 a(2) = 22 REDIM PRESERVE a(7) For i = 3 to 7 a(i) = i Next 'to Fetch the output For i = 0 to ubound(a) Msgbox a(i) Next End Sub
当执行上面的函数时,它会产生下面的输出。
XYZ 41.25 22 3 4 5 6 7
数组方法
VBScript中有各种内置函数,可以帮助开发人员有效地处理数组。 下面列出了与数组一起使用的所有方法。请点击方法名称来详细了解它们如何应用。
编号 | 方法 | 描述 |
---|---|---|
1 | LBound | 它返回一个整数,对应于给定数组的最小下标。 |
2 | UBound | 它返回一个整数,对应于给定数组的最大下标。 |
3 | Split | 它返回一个包含指定数量值的数组。根据分隔符分割。 |
4 | Join | 它返回一个包含数组中指定数量的子串的字符串。这是Split方法的一个完全相反的功能。 |
5 | Filter | 它返回一个基于零的数组,该数组包含基于特定过滤条件的字符串数组的子集。 |
6 | IsArray | 它返回一个布尔值,表示输入变量是否是一个数组。 |
7 | Erase | 为数组变量恢复分配的内存。 |
VBA用户自定义函数
函数是一组可重复使用的代码,可以在程序中的任何地方调用。这消除了一遍又一遍地编写相同的代码的需要。这使程序员能够将一个大程序划分成许多小的可管理的功能模块。
除了内置函数外,VBA还允许编写用户定义的函数。 在本章中,我们将学习如何在VBA中编写自己的函数。
函数定义
一个VBA函数可以有一个可选的return
语句。如果要从函数返回值,则可使用return
语句。 例如,可以在一个函数中传递两个数字,然后从函数中返回它们的乘积。
注 - 函数可以返回由逗号分隔的多个值,作为分配给函数名称本身的数组。
在使用函数之前,我们需要定义这个特定的函数。 在VBA中定义函数的最常见的方法是使用Function
关键字,后跟一个唯一的函数名称,它可能会也可能不会带有一个带有End Function
关键字的参数列表和一个语句,这表示函数的结束。以下是定义函数的基本语法。
基本语法
Function Functionname(parameter-list) statement 1 statement 2 statement 3 ....... statement n End Function Vb
例子
添加以下函数计算返回面积。请注意,可以使用函数名称本身返回一个值/值。
Function findArea(Length As Double, Optional Width As Variant) If IsMissing(Width) Then findArea = Length * Length Else findArea = Length * Width End If End Function Vb
调用函数
要调用函数,请使用函数名称调用函数,如以下屏幕截图所示。
计算面积的结果输出如下所示将显示给用户。
VBA子程序
子程序(Sub Procedures,也叫子过程)与函数类似,但有一些差异。
-
子过程不需要有返回一个值,而函数可能会或可能不会有返回一个值。
-
子程序可以不用
call
关键字来调用。 -
子程序总是包含在
Sub
和End Sub
语句中。
示例
Sub Area(x As Double, y As Double) MsgBox x * y End Sub Vb
调用程序
要在脚本的某处调用过程,可以使用函数进行调用。无法使用与函数相同的方式来调用子过程,因为子过程不会返回值。
Function findArea(Length As Double, Width As Variant) area Length, Width ' To Calculate Area 'area' sub proc is called End Function Vb
现在只能调用该函数,而不能调用子程序,如下图所示。
该区域的面积仅在消息框中计算和显示。
结果单元显示为零,因为计算的面积值不是从函数返回的。简而言之,不能直接在Excel工作表中调用子程序。
VBA消息框(MsgBox)
MsgBox
函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击的按钮执行相关的操作。
语法
MsgBox(prompt[,buttons][,title][,helpfile,context]) Vb
参数说明
-
prompt - 必需的参数。在对话框中显示为消息的字符串。提示的最大长度大约为
1024
个字符。 如果消息扩展为多行,则可以使用每行之间的回车符(Chr(13)
)或换行符(Chr(10)
)来分隔行。 -
buttons - 可选参数。一个数字表达式,指定要显示的按钮的类型,要使用的图标样式,默认按钮的标识以及消息框的形式。如果留空,则按钮的默认值为
0
。 -
title - 可选参数。 显示在对话框的标题栏中的字符串表达式。 如果标题留空,应用程序名称将被放置在标题栏中。
-
helpfile - 可选参数。一个字符串表达式,标识用于为对话框提供上下文相关帮助的帮助文件。
-
Context - 可选参数。一个数字表达式,用于标识由帮助作者分配给相应帮助主题的帮助上下文编号。 如果提供上下文,则还必须提供
helpfile
。
Buttons 参数可以使用以下任何值 -
-
0 vbOKOnly - 仅显示“确定” 按钮。
-
1 vbOKCancel - 显示“确定” 和“取消” 按钮。
-
2 vbAbortRetryIgnore - 显示“中止”,“重试”和“忽略” 按钮。
-
3 vbYesNoCancel - 显示“是”,“否”和“取消” 按钮。
-
4 vbYesNo - 显示“是”和“否”按钮。
-
5 vbRetryCancel - 显示“重试”和“取消”按钮。
-
16 vbCritical - 显示严重消息图标。
-
32 vbQuestion - 显示警告查询图标。
-
48 vbExclamation - 显示警告消息图标。
-
64 vbInformation - 显示信息消息图标。
-
0 vbDefaultButton1 - 第一个按钮是默认的。
-
256 vbDefaultButton2 - 第二个按钮是默认的。
-
512 vbDefaultButton3 - 第三个按钮是默认的。
-
768 vbDefaultButton4 - 第四个按钮是默认的。
-
0 vbApplicationModal 应用程序模式 - 当前的应用程序将不会工作,直到用户响应消息框。
-
4096 vbSystemModal 系统模式 - 所有的应用程序将不会工作,直到用户响应消息框。
上述值在逻辑上分为四组:第一组(0
至5
)指示要在消息框中显示的按钮。第二组(16
,32
,48
,64
)描述要显示的图标的样式,第三组(0
,256
,512
,768
)指示哪个按钮必须是默认的,第四组(0
,4096
)确定消息框的形式。
返回值
MsgBox
函数可以返回以下值之一,可用于标识用户在消息框中单击的按钮。
-
vbOK - 确定 按钮被点击。
-
vbCancel - 取消 按钮被点击。
-
vbAbort - 中止 按钮被点击。
-
vbIgnore - 忽略 按钮被点击。
-
vbYes - 是 按钮被点击。
-
vbNo - 否 按钮被点击。
示例
Function MessageBoxDemo() 'Message Box with just prompt message ' MsgBox("欢迎您~") 'Message Box with title, yes no and cancel Butttons ' result = MsgBox("你喜欢蓝色吗?", 3, "选择一个选项") ' Assume that you press No Button ' MsgBox ("返回 result 的值是:" &result) End Function Vb
输出结果
第1步 - 上述功能函数可以通过单击VBA窗口上的“运行”按钮或通过从Excel工作表调用函数来执行,如以下屏幕截图所示 -
运行子程序 -
第2步 - 显示一个简单的消息框,并显示消息“欢迎”和“确定”按钮
第3步 - 点击确定后,另一个对话框会显示一个消息,同时显示“是,否和取消”按钮。
第4步 - 点击“否”按钮后,该按钮(7
)的值将被存储为一个整数,并显示为一个消息框给用户,如以下屏幕截图所示。使用这个值,可以理解用户点击了哪个按钮。
VBA输入框(InputBox)
InputBox
函数提示用户输入值。当输入值后,如果用户单击确定 按钮或按下键盘上的ENTER 键,InputBox
函数将返回文本框中的文本。如果用户单击“取消” 按钮,该函数将返回一个空字符串(""
)。
语法
InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context]) Vb
参数说明
-
Prompt - 必需的参数。 在对话框中显示为消息的字符串。提示的最大长度大约为
1024
个字符。 如果消息扩展为多行,则可以使用每行之间的回车符(Chr(13)
)或换行符(Chr(10)
)来分隔行。 -
title - 一个可选参数。显示在对话框的标题栏中的字符串表达式。如果标题留空,应用程序名称将被放置在标题栏中。
-
default - 一个可选参数。用户希望显示的文本框中的默认文本。
-
xpos - 一个可选参数。
X
轴的位置表示水平从屏幕左侧的提示距离。 如果留空,则输入框水平居中。 -
ypos - 一个可选参数。
Y
轴的位置表示竖直方向从屏幕左侧的提示距离。如果留空,则输入框垂直居中。 -
helpfile - 一个可选参数。一个字符串表达式,标识用于为对话框提供上下文相关帮助的帮助文件。
-
context - 一个可选参数。一个数字表达式,用于标识由帮助作者分配给相应帮助主题的帮助上下文编号。如果提供上下文,则还必须提供
helpfile
。
示例
在这个示例中,通过在两个输入框(一个用于长度,一个用于宽度)的帮助下在运行时从用户获取值来计算矩形的面积。实现代码如下 -
Function CountArea() Dim Length As Double Dim Width As Double Length = InputBox("输入一个长度值: ", "输入长度") Width = InputBox("输入一个宽度值:", "输入宽度") findArea = Length * Width CountArea = findArea End Function Vb
实现过程 -
第1步 - 执行相同的操作,使用函数名称进行调用,然后按Enter
键,如下图所示。
第2步 - 执行时(点击单元格,然后移出时即触发执行),显示第一个输入框(长度),在输入框中输入一个值。
弹出一个输入框,并输入长度值 -
第3步 - 输入第一个值后,显示第二个输入框(宽度)。
第4步 - 输入第二个数字后,单击确定 按钮。该区域显示计算得到结果如下面的截图所示。
VBA事件
在VBA中,要手动更改单元格或单元格值范围时,可以触发事件驱动的编程。 更改事件可能会使事情变得更容易,但您可以非常快速地结束一个完整的格式化页面。VBA中有两种事件 -
-
工作表事件
-
工作簿事件
工作表事件
工作表事件在工作表中发生更改时被触发。 它是通过右键单击工作表选项卡并选择“查看代码”,然后粘贴代码来创建的。
用户可以选择这些工作表中的每一个,并从下拉列表中选择“工作表”以获取所有支持的工作表事件的列表。
以下是可以由用户添加的支持的工作表事件。
Private Sub Worksheet_Activate() Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Private Sub Worksheet_Calculate() Private Sub Worksheet_Change(ByVal Target As Range) Private Sub Worksheet_Deactivate() Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Private Sub Worksheet_SelectionChange(ByVal Target As Range) Vb
例子
在这个示例中,只需要双击之前显示一条消息。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox ("这是一个双击事件触发提示") End Sub Vb
双击任何单元格后,消息框将显示给用户,如以下屏幕截图所示。
工作簿事件
工作簿事件总是在工作簿发生更改时触发的。可以通过选择“ThisWorkbook”并从下拉列表中选择“workbook”来添加工作簿事件的代码,如下图所示。
立即将Workbook_open
子过程显示给用户,如以下屏幕截图所示。
以下是可以由用户添加的受支持的工作簿事件。
Private Sub Workbook_AddinUninstall() Private Sub Workbook_BeforeClose(Cancel As Boolean) Private Sub Workbook_BeforePrint(Cancel As Boolean) Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Private Sub Workbook_Deactivate() Private Sub Workbook_NewSheet(ByVal Sh As Object) Private Sub Workbook_Open() Private Sub Workbook_SheetActivate(ByVal Sh As Object) Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Private Sub Workbook_WindowActivate(ByVal Wn As Window) Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) Private Sub Workbook_WindowResize(ByVal Wn As Window) Vb
例子
只需要向用户显示一条消息,无论何时创建新的工作表,都会成功创建新的工作表。
Private Sub Workbook_NewSheet(ByVal Sh As Object) MsgBox "New Sheet Created Successfully" End Sub Vb
在创建一个新的excel工作表后,会向用户显示一条消息,如以下屏幕截图所示。
VBA错误处理
在(VBScript/VBA)编程中有三种类型的错误:
-
语法错误
-
运行时错误
-
逻辑错误
语法错误
语法错误(也称为解析错误)发生在VBScript的解释时间。 例如,下面一行导致语法错误,因为它缺少一个右括号。
Function ErrorHanlding_Demo() dim x,y x = "Yiibai Yiibai" y = Ucase(x End Function Vb
运行时错误
运行时错误(也称为异常)在执行期间发生,在解释之后。
例如,下面的行会导致运行时错误,因为这里的语法是正确的,但是在运行时它正在尝试调用fnmultiply
,但这是一个不存在的函数。
Function ErrorHanlding_Demo1() Dim x,y x = 10 y = 20 z = fnadd(x,y) a = fnmultiply(x,y) End Function Function fnadd(x,y) fnadd = x + y End Function Vb
逻辑错误
逻辑错误可能是最难追查的错误类型。这些错误不是语法或运行时错误的结果。 相反,当您在驱动脚本的逻辑中犯了一个错误,并且没有得到预期的结果时,就会发生这种情况。
你可能无法捕捉到这些错误,因为这取决于业务需求,在程序中加入什么类型的逻辑。
例如,将一个数字除以零,或写入一个进入无限循环的脚本。
Error对象
假设我们有一个运行时错误,那么通过显示错误信息来停止执行。作为开发人员,如果想捕获错误,那么使用Error
对象。
例子
在下面的例子中,Err.Number
给出错误号,Err.Description
给出错误描述。
Err.Raise 6 ' Raise an overflow error. MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description Err.Clear ' Clear the error. Vb
错误处理
VBA启用错误处理例程,也可以用来禁用错误处理例程。没有On Error
语句,发生的任何运行时错误都是致命的:显示错误消息,并且执行突然停止。
On Error { GoTo [ line | 0 | -1 ] | Resume Next } Vb
编号 | 关键字 | 描述 |
---|---|---|
1 | GoTo line | 启用在所需的行参数中指定的行开始的错误处理例程。指定的行必须与On Error 语句在相同的过程中,否则将发生编译时错误。 |
2 | GoTo 0 | 禁用当前过程中启用的错误处理程序并将其重置为Nothing 。 |
3 | GoTo -1 | 禁用当前过程中启用的异常并将其重置为Nothing 。 |
4 | Resume Next | 指定发生运行时错误时,控制权转到发生错误的语句之后的语句,并从该点继续执行。 |
例子
Public Sub OnErrorDemo() On Error GoTo ErrorHandler ' Enable error-handling routine. Dim x, y, z As Integer x = 50 y = 0 z = x / y ' Divide by ZERO Error Raises ErrorHandler: ' Error-handling routine. Select Case Err.Number ' Evaluate error number. Case 10 ' Divide by zero error MsgBox ("You attempted to divide by zero!") Case Else MsgBox "UNKNOWN ERROR - Error# " & Err.Number & " : " & Err.Description End Select Resume Next End Sub
VBA Excel对象
使用VBA进行编程时,用户将要处理的重要对象很少。下面是一些常见的对象 -
-
应用程序对象
-
工作簿对象
-
工作表对象
-
范围对象
应用程序对象
应用程序对象由以下部分组成 -
-
应用程序范围的设置和选项。
-
返回顶级对象的方法,比如
ActiveCell
,ActiveSheet
等等。
示例
'Example 1 : Set xlapp = CreateObject("Excel.Sheet") xlapp.Application.Workbooks.Open "C:\test.xls" 'Example 2 : Application.Windows("test.xls").Activate 'Example 3: Application.ActiveCell.Font.Bold = True Vb
工作簿对象
Workbook
对象是Workbooks
集合的成员,并包含当前在Microsoft Excel中打开的所有Workbook
对象。
示例
'Ex 1 : To close Workbooks Workbooks.Close 'Ex 2 : To Add an Empty Work Book Workbooks.Add 'Ex 3: To Open a Workbook Workbooks.Open FileName:="Test.xls", ReadOnly:=True 'Ex : 4 - To Activate WorkBooks Workbooks("Test.xls").Worksheets("Sheet1").Activate Vb
工作表对象
工作表对象是工作表集合的成员,并包含工作簿中的所有工作表对象。
示例
'Ex 1 : To make it Invisible Worksheets(1).Visible = False 'Ex 2 : To protect an WorkSheet Worksheets("Sheet1").Protect password:=strPassword, scenarios:=True Vb
范围对象
Range
对象表示单元格,行,列或包含一个或多个连续单元格块的单元格的选择。
'Ex 1 : To Put a value in the cell A5 Worksheets("Sheet1").Range("A5").Value = "5235" 'Ex 2 : To put a value in range of Cells Worksheets("Sheet1").Range("A1:A4").Value = 5
VBA文本文件
还可以读取Excel文件,并使用VBA将单元格的内容写入文本文件。VBA允许用户使用两种方法处理文本文件 -
-
文件系统对象(
FSO
) -
使用
Write
命令
文件系统对象(FSO)
顾名思义,FSO
对象帮助开发人员使用驱动器,文件夹和文件。 在本节中,我们将讨论如何使用FSO
。
编号 | 对象类型 | 描述 |
---|---|---|
1 | Drive |
Drive 是一个对象。 包含收集有关连接到系统的驱动器的信息的方法和属性。 |
2 | Drives |
Drives 是一个集合。 它提供了连接到系统的驱动器的物理或逻辑列表。 |
3 | File |
File 是一个对象。 它包含允许开发人员创建,删除或移动文件的方法和属性。 |
4 | Files |
Files 是一个集合。 它提供了一个文件夹中包含的所有文件的列表。 |
5 | Folder |
Folder 是一个对象。 它提供了允许开发人员创建,删除或移动文件夹的方法和属性。 |
6 | Folders |
Folders 是一个集合。 它提供了一个文件夹内所有文件夹的列表。 |
7 | TextStream |
TextStream 是一个对象。 它使开发人员能够读写文本文件。 |
Drive
Drive
是一个对象,它提供对特定磁盘驱动器或网络共享的属性的访问。 Drive
对象支持以下属性 -
-
AvailableSpace
-
DriveLetter
-
DriveType
-
FileSystem
-
FreeSpace
-
IsReady
-
Path
-
RootFolder
-
SerialNumber
-
ShareName
-
TotalSize
-
VolumeName
示例
第1步 - 在使用FSO
进行脚本编写之前,应该启用Microsoft脚本运行时。请导航到工具->引用,如以下屏幕截图所示。
第2步 - 添加“Microsoft脚本运行时间”,然后单击确定。
第3步 - 添加想要写入文本文件中的数据,这里添加一个命令按钮。
第4步 - 现在运行脚本。
Sub CommandButton1_Click() Const ForReading = 1, ForWriting = 2, ForAppending = 3 Dim FilePath As String Dim CellData As String Dim LastCol As Long Dim LastRow As Long LastCol = ActiveSheet.UsedRange.Columns.Count LastRow = ActiveSheet.UsedRange.Rows.Count ' Create a TextStream. Set fso = CreateObject("Scripting.FileSystemObject") Set stream = fso.OpenTextFile("F:\worksp\vba\Support.log", ForWriting, True) CellData = "" ' LastRow = 3 LastCol = 3 For i = 1 To LastRow For j = 1 To LastCol CellData = Trim(ActiveCell(i, j).Value) stream.WriteLine "The Value at location (" & i & "," & j & ")" & CellData Next j Next i stream.Close MsgBox ("Job Done") End Sub Vb
执行脚本时,请确保将光标放在工作表的第一个单元格中。 Support.log
文件的创建方式如下面“F:\worksp\vba”的目录,如下的截图所示。
该文件的内容,如以下屏幕截图中所示 -
The Value at location (1,1)姓名 The Value at location (1,2)性别 The Value at location (1,3)城市 The Value at location (2,1)张三 The Value at location (2,2)男 The Value at location (2,3)北京 The Value at location (3,1)李四 The Value at location (3,2)男 The Value at location (3,3)北京 The Value at location (4,1)王五 The Value at location (4,2)男 The Value at location (4,3)上海 The Value at location (5,1)李小丽 The Value at location (5,2)女 The Value at location (5,3)深圳 The Value at location (6,1)Linsa The Value at location (6,2)女 The Value at location (6,3)深圳 Txt
Write命令
与FSO不同,不需要添加任何引用,但是,我们将无法使用驱动器,文件和文件夹。也能够将流添加到文本文件。
示例
Sub CommandButton1_Click() Const ForReading = 1, ForWriting = 2, ForAppending = 3 Dim FilePath As String Dim CellData As String Dim LastCol As Long Dim LastRow As Long LastCol = ActiveSheet.UsedRange.Columns.Count LastRow = ActiveSheet.UsedRange.Rows.Count FilePath = "F:\worksp\vba\write.txt" Open FilePath For Output As #2 CellData = "" LastCol = 3 For i = 1 To LastRow For j = 1 To LastCol CellData = "The Value at location (" & i & "," & j & ")" & Trim(ActiveCell(i, j).Value) Write #2, CellData Next j Next i Close #2 MsgBox ("Job Done") End Sub Vb
执行该脚本时,将在“F:\worksp\vba”位置创建“write.txt”文件,如以下屏幕截图所示。
该文件的内容显示如以下屏幕截图 -
VBA编程图表
使用VBA,可以根据特定标准生成图表。下面通过一个例子来看看它如何实现。
第1步 - 输入要生成图形的数据。
第2步 - 创建3个按钮 - 一个生成条形图,另一个生成饼图,另一个生成柱形图。
第3步 - 开发一个宏来生成这些类型的图表。
' Procedure to Generate Pie Chart Private Sub fn_generate_pie_graph_Click() Dim cht As ChartObject For Each cht In Worksheets(1).ChartObjects cht.Chart.Type = xlPie Next cht End Sub ' Procedure to Generate Bar Graph Private Sub fn_Generate_Bar_Graph_Click() Dim cht As ChartObject For Each cht In Worksheets(1).ChartObjects cht.Chart.Type = xlBar Next cht End Sub ' Procedure to Generate Column Graph Private Sub fn_generate_column_graph_Click() Dim cht As ChartObject For Each cht In Worksheets(1).ChartObjects cht.Chart.Type = xlColumn Next cht End Sub
第4步 - 点击相应的按钮,图表被创建。 在下面的输出中,点击生成饼图按钮。
来源:oschina
链接:https://my.oschina.net/u/1398304/blog/3150925