一、 VBA简介
(Visual Basic for Application)简单地理解可以是宏命令, 即运行在Office中的宏语句。 如运行在Powerpoint, Excel, Word中的宏语句,不过有段时间由于宏语句病毒的大肆传播,使得微软头痛不已,并影响到Mac PPT12曾一度取消对宏语句的支持,不过现在由于用户的需求,不得已在新的Office14中又添加了对宏语句的支持。
二、 常量定义
Const name [As type] = value. 常量定义时必须赋值, 且以后不能改变这个值.
1. 布尔型 (VBA用2字节进行存储)
Const IsBoy As Boolean = True
2. 整型 (2字节)
Const DaysOfYear as Integer = 365
3. 长整型 (4字节)
Const ChinesePeopleNumber = 21342321
4. 单精度型
Const EarthRadiusMiles As Single = 3963.344432
Const EarchRadiusMM As Single = 6.789E9, 即6.789*10的9次方
5. 双精度型
Const Pi As Double = 3.141592653589789
Const Planck as Double = 6.6255E-27, 即6.6255*10的负27次方
6. 货币型
Const LoanLimit as Currency = 999999.99
7. 日期型 (1100年1月到31,9999年十二月)。
当你在一个const 语句中说明日期型常量时,VBA要求用英磅符号"#"去把它的值包围起来。 你可用数字MM/DD/YYYY(月/日/年) 描述或详细拼写月份。 例如,#6/10/1994#和#6/10/94# 和#June10,1994#都是可以接受的有效描述日期。 VBA将在你完成输入后把这个记录转换成第一种完全数字形式。 日期型变量中如果没有设定其时间时,默认的时间为12:am.
Const Millennium As Date = #1/1/2000#
Const DueDate As Date = #11/22/1993 17:30#
Const BackToSchool As Date = #September 3,1994 8:15 AM#
所有的日期型都会转换成MM/DD/YYYY HH:MM:SS AM/PM
日期的存储很有意思,它们会被转换成一个从1899年12月30日12:00AM(新纪元的起点)算起的天数及这一天的分数来表示, 在此之前的时间用负数表示, 而转换后的数字0则代表新纪元本身
8. 字符串型 最多65535个字符
Const Welcome As String = "Hello Word!"
Const Location As String = "Beijing, China"
9. 可变型, 可变型要比常量占用更大的内存空间,估计是采取类似于C语言使用的相同的指针, 所以尽量少用
Const NotSure As Variant = "123.4"
Const Maybe As Variant = True
三、 全局常量和局部常量
Public Const EveryWhere = “World” ‘可以在不同的模块间使用这一变量
Private Const JustThisModeUse = “Neighborhood” ‘使用Private关键字与不使用等效.
命名规则, 默认没有使用关健字为Private型。
1. 必须以字母开头,大小写均可. (VBA不区分大小写)
2. 不能在名称中使用空格, 句号, 百分号,叹号, @,!,%,.,&, $, #
四、 变量定义
1.用法:Dim name [As type]
e.g.
a. 局部变量
Dim PassDue as Boolean
Dim LoanTerm As Integer
Dim Cost as Currency.
Dim NationCount as Double.
Dim BirthDay as Date.
Dim Name as String ‘(这是一个可变长度字符串型变量)
Dim TenCharMax as String * 10 ‘(这是一个固定长度的字符串变量,固定长度为10个字符)
Dim SomeButton As Object ‘(定义一个对象)
Dim MilesPerHour as Integer ‘效果和Private MilesPerHour As Integer完全相同,也即是说用Dim定义的变量其为模块级变量,即局部变量,
b. 全局变量
如果要定义全局型变量,则用
Public MilesPerHour As String.
2.变量的默认值
Boolean , 默认值为False
数值型的变量(整型,长整型,单精度型,双精度型和货币型)初值为0
可变字符串, 默认长度为0, 用的是Empty(空)来为初始值
固定字符串, 长度为初始长度,内容为包含初始长度数目的空白或空格。
日期型变量, 默认值为1899年月日12月31日,星期六,午夜12:00am. 日期型变量以一种神秘的形式来进行编号(并以这种方式来存储它们)。而这个初始值刚好对应这个数字0。
对象型变量, 初始值为Nothing。
五、 数组
Dim MothTotal(12) as Currency ‘定义12个变量
使用时或者赋值用MothTotal(0) =123.40, MothTotal(1) = 322.20
六、 子程序和函数
(一) 子程序
1.定义
Sub AlertBox(Msg As String, Icon as Integer)
MsgBox Msg, Icon
End Sub
子程序有两种调用方式
a. AlertBox “Hello Word”, vbExclamation
b. AlertBox Icon:=vbQuestion, Msg:=”Goodbye” ‘按名称进行调用,且与顺序无关
显然,第二种方式更易于清晰的调用。
在调用时,如果用一个任选的参数被省略掉则用如下方式, 此处假设省略第二个参数
MultiArgument ArgOne, ,ArgThree, ‘注意第二个参数处有两个逗号进行分隔
2,传参的方式 (只对定义时有要求,需要进行进一步的研究, 是否会要求调用时也加入ByVal或ByRef, 答:只在定义时需要对这个参数的传入方式进行限定,在调用时,不涉及到对这个参数的限定.)
a, 传值调用 定义时用Sub AlertBox(ByVal Msg As string, Icon as Integer), 此处Msg采用的是传值调用,而Icon用的是传参调用,为默认的调用方式
b, 传参调用默(默认的传参方式) Sub AlertBox(ByRef Msg As String, Icon as Integer), 此处Msg采用的是传参调用, 而Icon也为传参调用
3, Static使用
a. Static 置于一个Sub语句之前, 会使这个过程中所有的局部变量(在过程中定义的局部变量)均为Static类型
例:
Static Sub KeepEmAll()
Dim Counter As Intege ‘为Static类型
Dim HalfCount As Single ‘为Static类型
Counter = Counter +1
HalfCount = Counter /2
End Sub
b. 局部的Static
例:
Sub KeepJustOne()
Static BeenHere As Boolean ‘为Static类型
Dim StartOver As Integer ‘不为Static类型
BeenHere = True
End Sub
3. 作用域
a. 全局过程, 默认的均为全局过程, 即该过程可在该文件的任何地方被其它任何过程或者模块调用。
b. 局部过程,作用域限制在一个级别中过程称为局部过程。Private Sub Sheriff()
(二) 函数
定义,简单地说,函数就是用来设计能返回某些信息给调用者,虽然子程序也可以用来返回信息,但是函数则是专门用来返回信息的。
Function Half(Num As Single) As Single ‘同样定义时也有ByRef(默认方式)和ByVal方式, 同时在定义变量时也可以使用Static来定义全部或部分变量为Static类型
Half = Num /2
End Function
函数的定义和调用
例:
Sub GetHalf()
Dim Answer As Single
Answer = Half(10)
End Sub
Function Half(Num As Single) As Single
Half = Num /2
End Function
简言之:对一个函数的调用等到同于对该函数的返回值的调用。
作用域:
函数默认的作用域范围与子程序是相同的,即文件级(可被一个文件中的作用一个模块调用)
(三) 子程序和函数的调用区别
Result = MsgBox(“Hello Word”, vbExclamation) 函数调用方式
MsgBox “Hello Word”, vbExclamation 子程序调用方式
验证:
一个子程序是否可以被当成一个函数被调用, 答案:不可以, 因为被函数调用时,一定会要求获取其返回值. 而子程序是没有返回值的.
一个函数是否可以被当成一个子程序被调用, 答案:不可以,因为函数调用时,一定要使用其返回值,而子程序是不需要这个返回值的. 会编译不通过.
程序设计
1. 判断
a) If /Then
例:
Sub Howdy(Welcome as Boolean)
If Welcome Then MsgBox “You’re Welcome!”
End Sub
逻辑运算符
Or(或), And(与),Xor(异或), Not(非), Equ(Equivalence,即都为真或都为假,相同的意思), Imp(Implication蕴含,除非A为真B是假,否则”A Imp B”总是真)
b) 变种
If condition Then
Statements
End if
C)If x Then
Statements1
Else
Statements2
End if
d)变种
If x then Exit Sub ‘该用法,可以直接退出整个子程序或是函数,属于临时中断功能。
分支
Select Case Score
Case 0 to 59
LetterGrade = “F”
Case 60 to 69
LetterGrade = “D”
Case Is >= 70 ‘Is是VBA中的一个关健字, 可以在比较的基础上指定一个范围
LetterGrade = “A”
Case Else
LetterGrade = “?”
End Select
Case中可以用Case 1, 3, 65等离散点来判断,还可以组合Case 1,3,30 to 56, 12)
2. 循环
2.1
While condition
Statements
Wend
2.2
Do While condition
Statements
Loop
2.3
Do
Statements
Loop While condition
2.4
Do Until condition
Statements
Loop
均可以使用Exit Do或者相应的语句来退出循环
For /Next
e.g. 1.
For X =0 To 11
Statements
Next
e.g.2.
Sub UpdateMonth()
Dim X As Integer
For X = 0 To 11
YearTot = YearTot + MothTot(X)
Next
End Sub
DoEvents用法
Sub NotHog()
Dim X As Long
Dim Y As Double
For X =2 To 10000
Y = X*243.234
DoEvents
Next
End Sub
DoEvents是用来使系统中各任务的优先级进行调度,可使当前的系统不会全部资源hang在这个地方。
七、 内部过程
1. Input函数,使用时查MSDN
e.g.
Sub Echo()
Dim Who As String
Who = InputBox(“What’ your name”)
If (Who =” ”) Then
MsgBox “Canceled”
Else
MsgBox “OK” + Who + “!”
End If
End Sub
2. 延续行,用下划线做为延续行。
3. 转换显示类型函数Format,是用来进行把数字型变量转换成字符串型变量的函数.还可以按照想要的格式进行转换成串.
e.g. Format (1234, “General Number”)
转换类型有”General Number” ,“Currency”,”Fixed”,”Standard”,具体可以查MSDN.
4. 转换所属类型, CBool,CDate,CCur,CInt,CLng,CSng,CStr,CVar.具体使用需要查MSDN
名称 | 接收类型 | 转换成类型 |
CBool | 仅为数字 | 布尔型 |
CDate | 数字或字符串型 | 日期型 |
CCur | 数字或字符串型 | 货币型 |
CDbl | 数字或字符串型 | 双精度型 |
CInt | 数字或字符串型 | 整型 |
CLng | 数字或字符串型 | 长整型 |
CSng | 数字或字符串型 | 单精度型 |
CStr | 数字或字符串型 | 字符串型 |
CVar | 数字或字符串型 | 可变型 |
e.g.
Dim Born As Date
Dim Birth As String
Birth = InputBox(“When were you born?”, “Number of Days Old”,”MM/YY/DD”,10,-5)
Born = CDate(Birth)
MsgBox “You were born on:” +Chr(13)+ Format(Born, “Long Date”) ‘此处用到了Chr(13)来显示一个分行。
对象
Dim MyObject As Object
Set MyObject = ActiveSheet.Cells(1,3) ‘此处把这个对象赋给当前Excel的当前Sheet中的1行第3个表格, Set操作符只作用于对象.
MyObject.Ovlue=5 ‘此处把这个表格中的元素赋值为5
访问聚合里的所有对象的方法 For/Each
For Each X In Assignment ‘此处用到For Each语句,指在Assignment中的所有对象
X.Cost = 10
Next
5. 让程序发声
Beep ‘这个不能接收参数,因为它是一个子程序而不是一个函数,并且不能返回任何值.
6. 使用状态栏
Application.StatusBar = “此消息将显示在状态栏中” ‘注:这里的Application要根据当前的程序而定,具体可以通过查看对象浏览器来查看.(快捷键是F2)
八、 对话框
Application.GetOpenFilename(…)打开文件对话框
Application.GetSaveAsFilename(…)存储文件对话框
Dim FOpen As Object
Set FOpen = application.Dialogs(XLDialogOpen)
FOpen.Show
具体使用到哪个对话框需要查询MSDN.