如何写VBA 程序

一、   VBA简介

Visual Basic for Application)简单地理解可以是宏命令, 即运行在Office中的宏语句。 如运行在Powerpoint, Excel, Word中的宏语句,不过有段时间由于宏语句病毒的大肆传播,使得微软头痛不已,并影响到Mac PPT12曾一度取消对宏语句的支持,不过现在由于用户的需求,不得已在新的Office14中又添加了对宏语句的支持。

二、     常量定义

Const name [As type] = value. 常量定义时必须赋值, 且以后不能改变这个值.

1.      布尔型 (VBA2字节进行存储

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*109次方

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.      日期型 (11001月到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

       日期的存储很有意思,它们会被转换成一个从1899123012: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年月日1231日,星期六,午夜1200am. 日期型变量以一种神秘的形式来进行编号(并以这种方式来存储它们)。而这个初始值刚好对应这个数字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,传参的方式 (只对定义时有要求,需要进行进一步的研究, 是否会要求调用时也加入ByValByRef :只在定义时需要对这个参数的传入方式进行限定,在调用时,不涉及到对这个参数的限定.)

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  ‘IsVBA中的一个关健字,  可以在比较的基础上指定一个范围

                            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.

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值