目录
- 1概述
- ▪VB 与VBA
- ▪区别
- 2数据类型
- ▪基本数据类型
- ▪自定义的数据类型
- ▪数组
- 3常量
- ▪系统定义常量
- ▪固有常量
- ▪符号常量
- 4变量
- ▪声明
- ▪赋值
- 5运算符
- ▪算术运算符
- ▪连接运算符
- ▪比较运算符
- ▪逻辑运算符
- 6语法结构
- ▪if 语句
- ▪Select Case 语句
- ▪Do...Loop 语句
- ▪For...Next语句
- ▪For Each … Next语句
- ▪跳出本次循环的continue语句
- ▪With语句
- ▪On Error语句
- ▪具有控制作用的函数
- 7其他语句
- ▪注释语句
- ▪语句的连写与续行
- 8过程与函数
- 9常用内置函数
- 10用途
>概述
Visual Basic for Applications(简称VBA)是新一代标准宏语言,是基于Visual Basic for Windows 发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有
面向对象的程序设计概念和方法。而VBA 提供了面向对象的程序设计方法,提供了相当完整的
程序设计语言。VBA 易于学习掌握,可以使用宏记录器记录用户的各种操作并将其转换为VBA 程序代码。这样用户可以容易地将日常工作转换为VBA 程序代码,使工作自动化。
VBA是基于
Visual basic发展而来的,与VB具有相似的
语言结构。从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的。两者的
开发环境也几乎相同。但是,VB是独立的
开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译、链接系统。VBA却没有自己独立的工作环境,它必须依附于某一个主应用程序,VBA专门用于
Office的各应用程序中,如Word、 Excel、 Access等。在
Access中,可以通过VBA编写模块来满足特定的需要。
VBA提供了
面向对象的程序设计方法,提供了相当完整的
程序设计语言。它的编写是以子过程和函数为单位,在 Access中以模块形式出现。
Office取得巨大成功的一个重要原因就是VBA,使用VBA可以完成很多事情,基于Excel、Word的VBA小程序不计其数。Office中的应用程序可以共享VBA语言,如果掌握了在
Excel 2016中使用VBA的方法,那么在Word、
Power Point中使用VBA自然会变得易如反掌。掌握对VBA语言的使用,可以让复杂的工作简易化,减少不必要的重复性工作,大大提高我们的工作效率。
VBA程序员很多是业余程序员,正因为业余,解决的却是工作中需要解决的问题;所以,VBA程序大多都是只是在部门内部或个人使用的小工具。集成了VBA的其他
应用程序也很多,但真正能为程序增色的不多。
大多数人看到了VBA可以
自动化一个程序,可以扩展已有程序,但没有看到在
Office中,VBA代码可以是录制的,而不是写出来的,带来的好处是,
学习曲线变得非常缓。如果没有宏录制功能,要熟悉某个Office组件的对象模型,绝非一日之功。
以ArcGIS为例,
ArcGIS扩展必须使用ArcObject,不管是使用VBA也罢,VB也罢,还是C++也罢。但同时,ArcObject的学习不是一天两天可以搞定,对于业余程序员,要使用VBA来扩展ArcGIS,几乎没有可能;专业程序员又不屑使用VBA;而对于公司,如果要基于ArcObject来扩展ArcGIS,选择VBA意味着
源码的保护很困难。所以,ArcGIS的VBA就如同鸡肋。
>VB 与VBA
VBA 是基于Visual Basic 发展而来的,它们具有相似的语言结构。Visual Basic 是Microsoft 的主要图形界面开发工具,VBA 5.0 (亦即VBA 97)则是Visual Basic 5.0 的子集。Visual Basic 是由Basic 发展而来的
第四代语言。Visual Basic 作为一套独立的 Windows 系统开发工具,可用于开发Windows 环境下的各类应用程序,是一种可视化的、
面向对象的、采用
事件驱动方式的结构化高级
程序设计语言。它具有高效率、简单易学及功能强大的特点。VB 的程序语言简单、便捷,利用其事件驱动的编程机制,新颖易用的可视化设计工具,并使用Windows
应用程序接口(API)函数,采用动态链接库(DLL)、
动态数据交换(DDE)、对象的链接与嵌入(OLE)以及开放式数据库访问(ODBC)等技术,可以高效、快速地编制出 Windows 环境下功能强大、图形界面丰富的应用软件系统。
Visual Basic 程序很大一部分以可视(
Visual)形式实现,这意味着在设计阶段就可以看到程序运行的屏幕画面,用户可以在设计时能够方便地改动画面图像、大小、颜色等,直到满意为止。VB 的用户可以是缺乏Windows 及C 语言开发经验的专业软件人员,也可以是具有一定
Windows开发经验的专业人员,VB 的
可视化编程方法使得原来繁琐枯燥、令人生畏的Windows 应用程序设计变得轻松自如、妙趣横生。以往的Windows 应用程序开发工具在设计
图形用户界面时,都是采用编程的方法,并伴随大量的计算任务,一个大型应用程序约有90%的程序代码用来处理用户界面,而且在程序设计过程中不能看到界面显示的效果,只有在程序执行时才能观察到,如果界面效果不佳,还需要回到程序中去修改。Visual Basic 提供了新颖的可视化设计工具,巧妙地将Windows
界面设计的复杂性封装起来,程序开发人员不必再为界面设计而编写大量程序代码,仅需采用现有工具按设计者要求的布局,在屏幕上画出所需界面,并为各图形对象设置属性即可,VB 自动产生界面设计代码,这样便将事先编制好的控件可视地连接到一起,构成一个随时可调整的界面。
VBA 不但继承了VB 的开发机制,而且VBA 还具有与VB 相似的语言结构,它们的
集成开发环境IDE(Intergrated Development Environment)也几乎相同。但是,经过优化,VBA 专门用于Office 的各应用程序。VB 可运行直接来自Windows 95 或NT 桌面上的应用程序,而VBA 的项目(
Project)仅由使用VBA 的Excel、Word、 PowerPoint 等称为宿主(Host)的Office 应用程序(
Application)来调用。
>区别
1. VB是设计用于创建标准的
应用程序,而VBA是使已有的应用程序(
EXCEL等)自动化。
2. VB具有自己的开发环境,而VBA必须寄生于已有的
应用程序。
3. 要运行VB开发的
应用程序,用户不必安装VB,因为VB开发出的应用程序是
可执行文件(*.EXE),而VBA开发的程序必须依赖于它的父应用程序,例如EXCEL。
尽管存在这些不同,VBA和VB在结构上仍然十分相似。事实上,如果你已经了解了VB,会发现学习VBA非常快。相应的,学完VBA会给学习VB打下坚实的基础。而且,当学会在
EXCEL中用VBA创建解决方案后,即已具备在WORD ACCESS OUTLOOK FOXPRO POWERPOINT 中用VBA创建解决方案的大部分知识。
* VBA一个关键特征是你所学的知识在微软的一些产品中可以相互转化。
>数据类型
>基本数据类型
即Primary Type Data,下述列表的括号内为
字节数:
>自定义的数据类型
Type 自定义类型名 元素名 As 类型 … [元素名 As 类型] End Type
>数组
>常量
>系统定义常量
系统定义常量有3个:True、False和Null。
>固有常量
固有常量是编程时引用的对象库定义的常量。所有固有常量都可以在
宏或VBA代码中使用。通常,固有常量通过前两个字母来指明定义该常量。来自VB库的常量则以“vb”开头。来自
Access的常量以“ac”开头。可以使用对象浏览器来查看所有对象库中的固有常量列表。
在VBA中,常量的
数据类型有整型、长整型、
单精度型、双精度型、
字节型、
货币型、字符型、日期型和逻辑型。一个整型数据就是一个整型常量,一个长整型数据就是一个长整型常量。例如,12%、-1%是
整型常量,32768&、10000000&是长整型常量,-2.5 1、3.14是单精度实型常量,3.1415926#是双精度实型常量,China、Shanghai是字符型常量,#07/13/2001 11:45PM#是日期
常量,由符号 “ # ” 将字符括起来。
>符号常量
可以自行定义的常量即
符号常量,必须先定义,后使用。可见,需要声明的常量都是
符号常量。
基本语法格式:
[ Publicr/ Private] Const 常量名[As 类型]=表达式
如:Global Const
符号常量名称 = 常量值
语句功能:
1)“常量名”指定
符号常量的名字。符号常量名可以由字母、数字和下画线组成,但只能以字母开头,不能含有空格。
2)“表达式”指定
符号常量的值。该表达式通常由数值型、字符型、逻辑型或日期型数据以及各种
运算符组成,但在表达式中不能出现
变量和函数。
3) public用来表示这个常量的作用范围是整个
数据库的所有模块。
4) private则表示这个常量只在使用该声明常量语句的模块中起作用。
说明:
2)对数码比较长,并且在程序中多次使用的常量,通常使用
符号常量代替。运行程序时,系统自动把程序中的所有符号常量换为赋给它的值。
>变量
与
常量一样,
变量也是一块
内存空间,用于保存程序运行过程中可能变化的数据。变量的名称是用户定义的一个标识符。
在代码中需要使用该变量时,只需引用相应的
标识符即可,而不用管变量当前的值具体是什么。
>声明
与用户自定义的常量相似,变量在使用之前都需要
声明,在VBA中声明变量的语法格式有以下几种:
关键字变量1,变量2 ... 变量n AS
数据类型
在第二种语法格式中, “变量n”的
数据类型为AS关键字后定义的数据类型,而“变量1”、“变量2”、…的数据类型为变体型。
◆ 利用Dim关键字声明变量:
Dim关键字主要用来在内存中分配一块空间,并为该空间命名,是VBA中声明变量最常用的关键字。使用Dim关键字声明的变量只能在当前过程或模块中使用。
◆ 利用Private关键字声明变量:
Private关键字用于在类模块中声明一个私有变量,它只能在当前的类模块中使用。当定义变量的位置同处于类模块中时,其使用效果与使用Dim关键字定义的变量相同。
◆ 利用Public关键字声明变量:利用
Public关键字声明的变量可以在程序的任何地方调用,而与声明变量的位置无关。
◆ 利用Static关键字声明变量:
Static关键字用于声明静态变量,即变量的值在整个代码运行期间都能被保留。
>赋值
变量在使用时还需要对其进行
赋值。在VBA中对变量进行
赋值可通过 “ = ” 符号或 “ Set ” 关键字进行。通过 “ = ” 符号对变量赋值的语法格式有以下几种。
如果在定义变量时指定了变量的
数据类型,则为变量所赋的值也必须是该数据类型的值。如果变量定义为Integer类型,而在赋值时却给了变量一个
String类型的数据,则在编译运行的过程中将弹出错误弹框。
>运算符
>算术运算符
例子 | 名称 | 结果 |
|---|
-$a | 取反 | $a 的负值。 |
$a + $b | 加法 | $a 和 $b 的和。 |
$a - $b | 减法 | $a 和 $b 的差。 |
$a * $b | 乘法 | $a 和 $b 的积。 |
$a / $b | 除法 | $a 除以 $b 的商,允许小数。 |
| $a \ $b | 除法 | $a 除以 $b 的商,结果取整。 |
$a Mod $b | 取余 | $a 除以 $b 的余数 |
注意:
在执行算术运算时,
运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的
操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。
>连接运算符
连接运算符的作用是将运算符两侧的
操作数连接成一个数,其
操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。
>比较运算符
比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为
Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的
ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。
例子 | 名称 | 结果 |
|---|
$a = $b | 等于 | TRUE,如果 $a 等于 $b。 |
$a <> $b | 不等 | TRUE,如果 $a 不等于 $b。 |
$a < $b | 小于 | TRUE,如果 $a 严格小于 $b。 |
$a > $b | 大于 | TRUE,如果 $a 严格大于 $b。 |
$a <= $b | 小于等于 | TRUE,如果 $a 小于或者等于 $b。 |
$a >= $b | 大于等于 | TRUE,如果 $a 大于或者等于 $b。 |
>逻辑运算符
逻辑运算符用于对
运算符两侧的
操作数执行逻辑运算,参与逻辑运算的操作数本身可以是逻辑表达式(表达式的最终结果为True或 False),也可以是
算术表达式(表达式的最终返回值为0或非0)。
在逻辑运算中,数值0与逻辑值 False相同,表示逻辑假;非0数值与True相同,表示逻辑真。
逻辑运算符及其含义与示例如表所示。
例子 | 名称 | 结果 |
|---|
$a and $b | And(逻辑与) | TRUE,如果 $a 与 $b 都为TRUE。 |
$a or $b | Or(逻辑或) | TRUE,如果 $a 或 $b 任一为TRUE。 |
$a xor $b | Xor(逻辑异或) | TRUE,如果 $a 或 $b 同位相异。 |
Not(1>2) | Not(逻辑非) | TRUE。 |
(1>2) Eqv (1>2) | 两个操作数同为假,返回False;两个操作数同为真,返回True;两个操作数一真一假,返回False | TRUE。 |
2<>1 Imp 3<5 | 运算符左右同为真,返回True;左右同为假,返回True;左真右假,回返 False;左假右真,返回True | TRUE。 |
>语法结构
>if 语句
if 条件1 then 语句1elseif 条件2 then 语句2elseif ... ...else 语句nend if
>Select Case 语句
Select Case 表达式 Case 表达式列表1 语句1 Case 表达式列表2 语句2 ... Case 表达式列表n 语句nEnd Select
>Do...Loop 语句
Do While或Until 条件 语句块1 Exit Do 语句块2Loop
>For...Next语句
Do 语句块1 Exit Do 语句块2Loop While或Until 条件
>For Each … Next语句
For 循环控制变量=初值To 终值Step 步长 语句块 ‘Exit For语句可以跳出循环体Next
>跳出本次循环的continue语句
For 循环控制变量=初值 To 终值 Step 步长 Do '用于模拟continue 语句块 If 条件 Then Exit Do '用于模拟continue 语句块 Loop While False '用于模拟continue Next
>With语句
With 对象引用 语句块End With
>On Error语句
On Error Goto 出错处理语句的label '跳转到出错处理语句
或
On Error Resume Next '遇到错误,不管错误,继续往下执行
>具有控制作用的函数
Switch(条件式1,表达式1,[条件式2,表达式2[,...,条件式n,表达式n]])
Choose(索引式,选项1[,选项2,...[,选项n]]) '这是基于1的索引
>其他语句
>注释语句
>语句的连写与续行
如果一行包括多条语句,用冒号分割各个语句。跨多行的语句,在行末用“空格加下划线”表示续行
。
>过程与函数
Sub 过程名(参数表) 语句块 Exit Sub 语句块End Sub
Function 函数名(参数表) As Type 语句块 函数名=表达式 Exit FunctionEnd Function
调用函数/过程时,可以加括号或者不加括号。如果
调用表达式作为一行的一部分,那么必须用参数,例如函数调用的返回值赋给变量。 调用过程时, 可以使用/不使用call关键字。使用
call语句调用过程,如果无参数,则不加括号;如果有参数,必须加括号。如果调用时用括号包住单个参数,则该参数强行按值传递。需要特别注意,不用call不加括号的调用,
形参与
实参是传值(passed by value)而不是传
引用(passed by reference),这会导致一些对象的方法调用失败。例如:
Dim cn As ADODB.Connection Set cn = CurrentProject.Connection Dim rs As New ADODB.Recordset rs.Open "SELECT * FROM myTable" , cn Dim ExcelApp As New Excel.Application Dim ExcelWst As Worksheet Set ExcelWst = ExcelApp.Workbooks.Add.Worksheets(1) ExcelWst.Range("A2").CopyFromRecordset(rs) '失败,无法执行该行 ExcelWst.Range("A2").CopyFromRecordset rs '可成功执行该行
>常用内置函数
舍入函数:Fix 向0取整,Int向下取整, Round四舍五入
InStr([Start, ]<Str1>,<Str2>[, Compare])与InStrRev: 查找子串
Left,Right,Mid: 截取子字符串
Ltrim, Rtrim,Trim :删除首尾空格
Split:分割一个字符串成为一维数组
String(number, character):制定字符重复若干次
Year, Month, Day, WeekDay,Hour,Minute,
Second: 截取日期时间分量
DateDiff(<间隔类型>,<日期1>,<日期2>[,W1][,W2])日期/时间的距离函数
DateSerial(<表达式1>,<表达式2>,<表达式3>) 合成日期;DateValue(“字符串表达式”)返回日期;
Date,Time,Now,Timer: 返回日期时间
TimeSerial:由时间序列得到时间对象
Nz(表达式或字段属性值[,规定值])如果是空,则返回0或者""或者函数的第二个参数值
数学函数:Abs、Sqr、Tan、Atn(即atan)、Sin、Cos、Exp(e为基的指数)、Log自然对数
CallByName: get or set a property, or invoke a method at run time using a string name.
由基本数学函数导出的函数:Sec、Cosec、Cotangent、Cotan、Arcsin、Arccos、Arcsec、Arccosec、Arccotan、HSin、HCos、HTan、HSec、HCosec、HCotan、HArcsin、HArccos、HArctan、HArcsec、HArccosec、HArccotan、LogN
Dir:返回满足条件的所有文件、目录的名字
FileDateTime
FileLen
FreeFile Function
Input:读取文件
Seek:文件指针定位
Spc:使用Print做position output
IMEStatus:返回当前Input Method Editor (IME)
Macintosh平台:MacID、MacScript
Partition:返回字符串,表示一个数值名字落在各个range内。常用于SQL select语句
>用途
由于微软Office软件的普及,人们常见的
办公软件Office软件中的
Word、
Excel、
Access、
Powerpoint都可以利用VBA使这些软件的应用更高效率,例如:通过一段VBA代码,可以实现画面的切换;可以

VBA6
实现复杂逻辑的统计(比如从多个表中,自动生成按合同号来跟踪生产量、入库量、销售量、库存量的统计清单)等。
3.多个步骤的手工操作通过执行VBA代码可以迅速的实现;
6.利用VBA可以Excel内轻松开发出功能强大的自动化程序。