第一章  VBA语言基础 
第一节 标识符 
一.定义 
标识符是一种标识变量、常量、过程、函数、类等语言构成单位的符号,利用它可以完成对变量、常
量、过程、函数、类等的引用。   二.命名规则 
1) 字母打头,由字母、数字和下划线组成,如  A987b_23Abc 
2) 字符长度小于 40,(Excel2002以上中文版等,可以用汉字且长度可达 254个字符) 
3) 不能与 VB保留关键字重名,如 public, private, dim, goto, next, with, integer, single等 
第二节 运算符 
定义:运算符是代表 VB某种运算功能的符号。  1)赋值运算符 = 
2)数学运算符 &、 + (字符连接符 )、 +(加)、-(减)、 Mod(取余)、 \(整除)、*(乘)、/(除)、-(负号)、^(指数) 
3)逻辑运算符 Not(非)、 And(与)、 Or(或)、 Xor(异或)、 Eqv(相等)、 Imp(隐含) 
4)关系运算符 = (相同)、 <>(不等)、>(大于)、<(小于)、 >=(不小于)、 <=(不大于)、 Like、 Is 
5)位运算符 Not(逻辑非)、 And(逻辑与)、 Or(逻辑或)、 Xor(逻辑异或)、 Eqv(逻辑等)、 Imp(隐含) 
第三节 数据类型 
VBA共有12种数据类型,具体见下表,此外用户还可以根据以下类型用 Type自定义数据类型。 
数据类型   类型标识符   字节 
字符串型 String   $   字符长度 (0-65400) 
字节型 Byte   无   1 
布尔型 Boolean   无   2 
整数型 Integer   % 2    
长整数型  Long   & 4    
单精度型 Single   ! 4    
双精度型 Double   # 8    
日期型  Date   无   8 公元 100/1/1-9999/12/31 
货币型 Currency   @ 8    
小数点型 Decimal   无   14 
变体型 Variant   无   以上任意类型,可变 
对象型 Object   无   4 
 
第四节 变量与常量 
1) VBA允许使用未定义的变量,默认是变体变量。 
2)在模块通用说明部份,加入  Option Explicit 语句可以强迫用户进行变量定义。 
3)变量定义语句及变量作用域  Dim  变量  as 类型   '定义为局部变量,如  Dim     xyz as integer 
Private 变量  as 类型   '定义为私有变量,如 Private   xyz as byte 
 

Public 变量  as 类型   '定义为公有变量,如  Public   xyz as single 
Global  变量  as 类型   '定义为全局变量,如  Globlal   xyz as date 
Static变量  as 类型   '定义为静态变量,如  Static    xyz as double  一般变量作用域的原则是,那部份定义就在那部份起作用,模块中定义则在该模块那作用。   4)常量为变量的一种特例,用 Const定义,且定义时赋值,程序中不能改变值,作用域也如同变量作用域。 如下定义: Const Pi=3.1415926 as single 
第五节 数组 
数组是包含相同数据类型的一组变量的集合,对数组中的单个变量引用通过数组索引下标进行。在内 存中表现为一个连续的内存块,必须用Global或Dim语句来定义。定义规则如下:  Dim 数组名 ([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值为0。二维数组是按行列排列,如 XYZ(行,列)。 
除了以上固定数组外, VBA还有一种功能强大的动态数组,定义时无大小维数堀明;在程序中再利用
Redim语句来重新改变数组大小,原来数组内容可以通过加 preserve关键字来保留。如下例: 
Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10) 
第六节 注释和赋值语句 
1)注释语句是用来说明程序中某些语句的功能和作用; VBA中有两种方法标识为注释语句。   9  单引号  ’ ;如:’定义全局变量;可以位于别的语句之尾,也可单独一行 
 9  Rem ;如: Rem定义全局变量;只能单独一行  2)赋值语句是进行对变量或对象属性赋值的语句,采用赋值号 =,如X=123:Form1.caption=”我的窗口 ”  对对象的赋值采用: set myobject=object 或  myobject:=object 
第七节 书写规范 
1) VBA不区分标识符的字母大小写,一律认为是小写字母; 
2)一行可以书写多条语句,各语句之间以冒号  : 分开; 
3)一条语句可以多行书写,以空格加下划线 _ 来标识下行为续行; 
4)标识符最好能简洁明了,不造成歧义。 
第八节 条件语句 
1) If…Then…Else语句 
If condition Then [statements][Else elsestatements]  如1:If A>B And C<D Then A=B+2 Else A=C+2   
如2:If x>250 Then x=x-100    或者,可以使用块形式的语法:  If condition Then  [statements]  [ElseIf condition-n Then  [elseifstatements] ...  [Else  [elsestatements]]  End If 
 

如 1: 
If Number < 10 Then      Digits = 1  ElseIf Number < 100 Then      Digits = 2  Else      Digits = 3  End If 
2) Select Case…Case…End Case语句  如1:  Select Case Pid 
Case “A101” 
Price=200 
Case “A102” 
Price=300  ……  Case Else 
Price=900 
End Case 
3)Choose 函数 
choose(index, choce-1,choice-2,…,choice-n),可以用来选择自变量串列中的一个值,并将其返回, index 
必要参数,数值表达式或字段,它的运算结果是一个数值,且界于  1 和可选择的项目数之间。choice 必 要参数, Variant表达式,包含可选择项目的其中之一。如: 
GetChoice = Choose(Ind, "Speedy", "United", "Federal") 
4) Switch函数 
Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]]) 
switch函数和 Choose函数类似,但它是以两个一组的方式返回所要的值,在串列中,最先为 TRUE的值 会被返回。 expr 必要参数,要加以计算的  Variant 表达式。value 必要参数。如果相关的表达式为  True, 则返回此部分的数值或表达式,没有一个表达式为  True, Switch 会返回一个 Null值。 
第九节 循环语句 
1) For Next语句 以指定次数来重复执行一组语句  For counter = start To end [Step step]        ' step 缺省值为 1  [statements]  [Exit For]  [statements]  Next [counter]  如1:  For Words = 10 To 1 Step -1            ' 建立 10 次循环      For Chars = 0 To 9             ' 建立 10 次循环          MyString = MyString & Chars       ' 将数字添加到字符串中      Next Chars               ' Increment counter 
 

    MyString = MyString & " "         ' 添加一个空格  Next Words 
2) For Each…Next语句  主要功能是对一个数组或集合对象进行,让所有元素重复执行一次语句  For Each element In group 
Statements  [Exit for]  Statements 
Next [element]  如1:  For Each rang2 In range1 
With range2.interior 
.colorindex=6  .pattern=xlSolid 
End with 
Next 
这上面一例中用到了 With…End With 语句,目的是省去对象多次调用,加快速度;语法为:  
With object  [statements]  End With 
3)Do…loop语句 在条件为 true时,重复执行区块命令 
Do {while |until} condition         ' while 为当型循环, until为直到型循环,顾名思义,不多说啦 
Statements 
Exit do 
Statements 
Loop  或者使用下面语法  Do                ' 先 do 再判断,即不论如何先干一次再说  
Statements 
Exit do 
Statements 
Loop {while |until} condition 
第十节 其他类语句和错误语句处理 
一.其他循环语句 
结构化程序使用以上判断和循环语句已经足够,建议不要轻易使用下面的语句,虽然 VBA还支持。  1)  Goto line 该语句为跳转到line语句行 
2)  On expression gosub destinatioinlist 或者  on expression goto destinationlist 语句为根据 exprssion表达式
值来跳转到所要的行号或行标记 
3)  Gosub line…line…Return语句,  Return 返回到  Gosub line行,如下例:  Sub gosubtry() 
Dim num 
Num=inputbox(“输入一个数字,此值将会被判断循环 ”) 
If num>0 then Gosub Routine1 :Debug.print num:Exit sub 
 

Routine1: 
Num=num/5  
Return 
End sub  4) while…wend语句,只要条件为TRUE,循环就执行,这是以前 VB老语法保留下来的,如下例:   while condition               ‘while I<50  [statements]                 ‘I=I+1  wend                   ‘Wend 
二.错误语句处理 
执行阶段有时会有错误的情况发生,利用On Error语句来处理错误,启动一个错误的处理程序。语法如下:  On Error Goto Line             ‘当错误发生时,会立刻转移到line行去 
On Error Resume Next                    ‘当错误发生时,会立刻转移到发生错误的下一行去 
On Erro Goto 0             ‘当错误发生时,会立刻停止过程中任何错误处理过程 
第十一节 过程和函数 
过程是构成程序的一个模块,往往用来完成一个相对独立的功能。过程可以使程序更清晰、更具结构
性。VBA具有四种过程:Sub 过程、 Function函数、 Property属性过程和 Event事件过程。 
一.Sub过程 
Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递 (ByRef)。如下例: 
Sub password (ByVal x as integer, ByRef y as integer) 
If y=100 then y=x+y else y=x-y  x=x+100 
End sub 
Sub call_password () 
Dim x1 as integer 
Dim y1 as integer  x1=12  y1=100  Call password (x1,y1)     ‘调用过程方式:1. Call 过程名 (参数 1, 参数 2…) ; 2. 过程名 参数 1, 参数 2…  debug.print x1,y1        ‘结果是12、 112, y1按地址传递改变了值,而 x1按值传递,未改变原值 
End sub 
二. Function函数 
函数实际是实现一种映射,它通过一定的映射规则,完成运算并返回结果。参数传递也两种:按值传
递(ByVal)和按地址传递 (ByRef)。如下例: 
Function password(ByVal x as integer, byref y as integer) as boolean 
If y=100 then y=x+y else y=x-y  x=x+100  if y=150 then password=true else password=false 
End Function 
Sub call_password () 
 

Dim x1 as integer 
Dim y1 as integer  x1=12  y1=100  if password then     ‘调用函数: 1. 作为一个表达式放在=右端  ; 2. 作为参数使用  debug.print x1        
    end if  End sub 
三. Property属性过程和 Event事件过程 
这是 VB在对象功能上添加的两个过程,与对象特征密切相关,也是 VBA比较重要组成,技术比较
复杂,可以参考相关书籍。 
第十二节内部函数 
在 VBA程序语言中有许多内置函数,可以帮助程序代码设计和减少代码的编写工作。 
一.测试函数 
IsNumeric(x)           ‘是否为数字 , 返回 Boolean结果,True or False 
IsDate(x)               ‘ 是否是日期 , 返回 Boolean结果,True or False 
IsEmpty(x)           ‘是否为 Empty, 返回 Boolean结果,True or False 
 IsArray(x)  ‘指出变量是否为一个数组。 
 IsError(expression) ‘指出表达式是否为一个错误值  IsNu ll(expression) ‘指出表达式是否不包含任何有效数据  (Null)。 
 IsObject(identifier) ‘指出标识符是否表示对象变量 
二.数学函数 
Sin(X)、 Cos(X)、 Tan(X)、 Atan(x)  三角函数,单位为弧度 
Log(x) 返回x的自然对数 
Exp(x)返回 ex
Abs(x) 返回绝对值 
Int(number)、Fix(number) 都返回参数的整数部分,区别: Int 将 -8.4 转换成 -9,而  Fix 将-8.4 转换成 -8 
Sgn(number) 返回一个  Variant (Integer),指出参数的正负号 
Sqr(number) 返回一个  Double,指定参数的平方根 
VarType(varname) 返回一个  Integer,指出变量的子类型 
Rnd(x)返回 0-1之间的单精度数据,x为随机种子 
三.字符串函数 
Trim (string)  去掉 string左右两端空白 
Ltrim( string)  去掉 string左端空白 
Rtrim( string)  去掉 string右端空白 
 Len(string)  计算 string长度  Left(string, x)       取 string左段x个字符组成的字符串 
Right(string, x)       取 string右段x个字符组成的字符串 
Mid(string, start,x)     取 string从 start位开始的x个字符组成的字符串 
 Ucase(string) 转换为大写 
 

 Lcase(string) 转换为小写 
 Space(x)  返回x个空白的字符串  As c(string)  返回一个  integer,代表字符串中首字母的字符代码 
 Chr(charcode) 返回 string,其中包含有与指定的字符代码相关的字符 
四.转换函数 
CBool(expression)    转换为 Boolean型  CByte(expression)    转换为 Byte型  CCur(expression)     转换为 Currency型  CDate(expression)    转换为 Date型  CDbl(expression)     转换为Double型  CDec(expression)     转换为 Decemal型  CInt(expression)      转换为 Integer型  CLng(expression)     转换为 Long型  CSng(expression)     转换为 Single型  CStr(expression)      转换为 String型  CVar(expression)     转换为 Variant型 
Va l(string)     转换为数据型 
Str(num ber) 转换为String 
五.时间函数 
Now      返回一个  Variant (Date),根据计算机系统设置的日期和时间来指定日期和时间。 
Date     返回包含系统日期的  Variant (Date)。 
Time     返回一个指明当前系统时间的  Variant (Date)。 
Timer     返回一个  Single,代表从午夜开始到现在经过的秒数。 
TimeSerial(hour, minute, second) 返回一个  Variant (Date),包含具有具体时、分、秒的时间。 
DateDiff(interval, date1, date2[,  firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示两个指定 日期间的时间间隔数目  Second(time) 返回一个  Variant (Integer),其值为  0 到 59 之间的整数,表示一分钟之中的某个秒 
Minute(time) 返回一个  Variant (Integer),其值为  0 到 59 之间的整数,表示一小时中的某分钟 
Hour(time)   返回一个  Variant (Integer),其值为  0 到 23 之间的整数,表示一天之中的某一钟点 
Day(date)  返回一个  Variant (Integer),其值为  1 到 31 之间的整数,表示一个月中的某一日 
Month(date)  返回一个  Variant (Integer),其值为  1 到 12 之间的整数,表示一年中的某月 
Year(date)  返回 Variant (Integer),包含表示年份的整数。 
Weekday(date, [firstdayofweek]) 返回一个  Variant (Integer),包含一个整数,代表某个日期是星期几  
第二章  Excel VBA常用对象之使用 
第一节 文件的操作 
1) Excel文件 
1.1 新建与打开  一.新建  Workbooks.Add 
 

二.打开 
Workbooks.Open "路径 \" & "文件名 .xls" 
三.文件打开对话框的使用 
Application.GetOpenFilename(fileFilter:="Excel files(*.xls),*.xls,All files (*.*),*.*") 
示例 : 
flag = False  Do While Not flag                                  ' 对话框打开已有 Excel文件    fm = Application.GetOpenFilename(fileFilter:=" Excel files(*.xls),*.xls, All files (*.*),*.*") 
 If fm <> False Then      Workbooks.Open fm      Set bb = ActiveWorkbook      '把 bb变量设为当前活动工作簿对象,打开一工作簿时,该工作簿自动为当前活动工作簿      flag = True    End If  Loop 
1.2 保存与关闭  一.保存  Workbooks("文件.xls").Save 
二.另存对话框的使用 
Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls),*.xls,All files (*.*),*.*") 
示例 : 
flag = False  Do While Not flag                 ' 循环要求必须输入文件名或选择文件名    fm = Application.GetSaveAsFilename(fileFilter:=" Excel files (*.xls),*.xls,All files (*.*),*.*") 
 If fm <> False Then       activeworkbook.SaveAs fm     ' 当前活动工作簿另存       flag = True    End If  Loop 
三.关闭 
1.单个文件关闭  Workbooks("filename.xls").Close  2.所有该 Excel程序打开的文件都关闭  Workbooks.Close 
如果文件使用中改动过内容 , 那么该命令使用时会弹出提示对话框 , 询问是否保存 . 
如果要想不弹出提示对话框,可以使用第三或第四种文件关闭方法 , 或者如下示例 . 
示例 : 
 

关闭工作簿“ Book1.xls”,但不提示用户保存所作修订。“ Book1.xls”中的所有修订都不  会保存。  Application.DisplayAlerts = False   '信息警告关闭 
Workbooks("BOOK1.XLS").Close 
Application.DisplayAlerts = True    '信息警告开启 
四.关闭同时保存 
Workbooks("filename.xls").Close savechanges:=True 
五.关闭同时不保存 
Workbooks("filename.xls").Close savechanges:=False 
六 .Excel程序的关闭  Application.Quit 
说明 : 
使用本方法时,如果有未保存的工作簿处于打开状态,则  Microsoft Excel 将弹出一个对话  框,询问是否要保存所作修改。 
为防止这一情况出现,可在使用  Quit 方法前保存所有的工作簿或将 DisplayAlerts 属性设  置为  False。如果该属性为  False,则 Microsoft Excel 退出时,即使存在未保存的工作簿   退出,也不会显示对话框,而且不保存就退出。如果将一个工作簿的  Saved 属性设置为 Tr  ue,但是并没有将其保存到磁盘上,则 Microsoft Excel 在退出时不会提示保存该工作簿。 
七.工作簿的密码保护与撤销   保护工作簿使其不至被修改。  Workbooks(“工作簿名 ”).Protect (Password, Structure, Windows) 
Password   Variant 类型,可选。为一个字符串,该字符串为工作表或工作簿指定区分大小写的密码。如 果省略本参数,不用密码就可以取消对该工作表或工作簿的保护。否则,必须指定密码,通过密码来取消 对该工作表或工作簿的保护。如果忘记了密码,就无法取消对该工作表或工作簿的保护。最好在安全的地 方保存一份密码及其对应文档名的列表。  Structure   Variant 类型,可选。如果为  True,则保护工作簿结构(工作表的相对位置)。默认值为  False。 
Windows   Variant 类型,可选。如果为  True,则保护工作簿窗口。如果省略本参数,则窗口不受保护   如:Workbooks(“学生档案”).protect ”1234” 
Workbooks(“学生档案”).Unprotect (Password) 
Password   Variant 类型,可选。指定用于解除工作表或工作簿的保护的密码,此密码是区分大小写的。 如果工作表或工作簿不设密码保护则忽略本参数。如果对工作表省略此参数,而该工作表又设有密码保护, Microsoft Excel 将提示您要输入密码。如果对工作簿省略此参数,而该工作簿又设有密码保护,本方法将 失败。 
1.3 示例 
示例 :(使用了4个文件,宏程序文件操作了另外三个文件,还涉及到文件打开另存对话框) 
一. 在 test.xls文件中编写一个宏程序test,完成以下内容.打开当前目录下 test1.xls  文件,计算 sheet1工作表上单元格 a1到a10的数据剩上 (0-1)的随机数,计算结果保存在一个新 
 

建工作簿的 sheet1的 a1到a10上,且结果还要保存在一个任意打开的 Excel文件下,示例中打开  test2.xls文件, 完成后关闭Excel程序. 
test.xls 模块中  Sub test() 
 Dim i As Integer, flag As Boolean, fm 
    Dim aa, bb, cc, temp 
    Application.ScreenUpdating = False  '屏幕刷新关闭 
    Application.DisplayAlerts = False    '信息警告关闭 
     
    Workbooks.Open ThisWorkbook.Path & "\test1.xls"  '打开文件 test1.xls 
    Set aa = ActiveWorkbook.Sheets("Sheet1") 
    flag = False 
    Do While Not flag                                  ' 对话框打开已有 Excel文件 
        fm = Application.GetOpenFilename(fileFilter:="Excel files (*.xls),*.xls, _  All files (*.*),*.*")          If fm <> False Then 
            Workbooks.Open fm 
            Set bb = ActiveWorkbook 
            flag = True 
        End If 
    Loop 
         
    Workbooks.Add 
    Set cc = ActiveWorkbook 
    With cc.Sheets("Sheet1") 
        For i = 1 To 10 
            temp = aa.Cells(i, 1) * Int((10 * Rnd) + 1) ' 生成 1 到 10 之间的随机数值 
            .Cells(i, 1) = temp 
            bb.Sheets(1).Cells(i, 1) = temp 
        Next 
    End With 
     
    flag = False 
    Do While Not flag                 ' 循环要求必须输入文件名或选择文件名 
        fm = Application.GetSaveAsFile name(fileFilter:="Excel files (*.xls),*.xl _  s,All files (*.*),*.*")          If fm <> False Then 
            cc.SaveAs fm 
            flag = True 
        End If 
    Loop 
     
    bb.Save   '保存 
 Set aa = Nothing: Set bb = Nothing: Set cc = Nothing      '设置对象变量为空 
 

    Application.Quit   '关闭Excel 
    Application.ScreenUpdating = True   '屏幕刷新关闭 
    Application.DisplayAlerts = True    '信息警告开启  End Sub 
2) 文本文件  2.1 打开与新建  Open 语句  能够对文件输入/输出 (I/O)。  语法  Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 
Open 语句的语法具有以下几个部分:  部分 描輀  pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。  mode 必要。关键字,指定文件方式,有  Append、 Binary、 Input、 Output、或  Random 方 式。如果未指定方式,则以  Random 访问方式打开文件。  access 可选。关键字,说明打开的文件可以进行的操作,有  Read、Write、或  Read Write 操 作。  lock 可选。关键字,说明限定于其它进程打开的文件的操作,有  Shared、Lock Read、Lock  Write、和  Lock Read Write 操作。  filenumber 必要。一个有效的文件号,范围在  1 到 511 之间。使用  FreeFile 函数可得到下一个 可用的文件号。  reclength 可选。小于或等于  32,767(字节)的一个数。对于用随机访问方式打开的文件,该值 就是记录长度。对于顺序文件,该值就是缓冲字符数。  
说明 
对文件做任何  I/O 操作之前都必须先打开文件。 Open 语句分配一个缓冲区供文件进行 I/O 之用,
并决定缓冲区所使用的访问方式。 
[新建] 如果  pathname 指定的文件不存在,那么,在用   Append、 Binary、 Output、或  Random 方
式打开文件时,可以建立这一文件。 
如果文件已由其它进程打开,而且不允许指定的访问类型,则  Open 操作失败,而且会有错误发生。 
如果 mode 是  Binary 方式,则  Len 子句会被忽略掉。 
重要 
在  Binary、 Input 和  Random 方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。
在  Append 和  Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该 文件。
2.2 读入与写出 
2.2.1读入 
Input #filenumber, varlist  从已打开的顺序文件中读出数据并将数据指定给变量 
Get [#]filenumber, [recnumber], varname  将一个已打开的磁盘文件读入一个变量之中  2.2.2写入  Write #filenumber, [outputlist] 
 

将数据写入顺序文件,以双引号"数据"逗号,分隔数据 
Print #filenumber, [outputlist]  将格式化显示的数据写入顺序文件中 
Put [#]filenumber, [recnumber], varname  将一个变量的数据写入磁盘文件中。 
2.3关闭 
Close [filenumberlist] 关闭 Open 语句所打开的输入/输出 (I/O) 文件 
注意 : 
如果今后想用 Input # 语句读出文件的数据,就要用  Write # 语句而不用  Print # 语句将数据写入文件。 因为在使用  Write # 时,将数据域分界就可确保每个数据域的完整性,因此可用  Input # 再将数据读出来。 使用  Write # 还能确保任何地区的数据都被正确读出。 Write 与  Print # 语句不同,当要将数据写入文件 时,Write # 语句会在项目和用来标记字符串的引号之间插入逗号。Write # 语句在将 outputlist 中的最后 一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13) + Chr(10)) 
2.4其他文件函数 
LOF(filenumber)  返回一个  Long,表示用  Open 语句打开的文件的大小,该大小以字节为  单位。  EOF(filenumber)  返回一个  Integer,它包含  Boolean 值 True,表明已经到达为  Random  或顺序 Input 打开的文件的结尾。  Loc(filenumber)   返回一个  Long,在已打开的文件中指定当前读/写位置 
Seek(filenumber)  返回一个  Long,在  Open 语句打开的文件中指定当前的读/写位置 
2.5 示例 
要求: 打开一文本文件 test1.txt, 已知其内容为空格分隔 , 要求把其中每行首个数据写入Excel 宏程序文件 的表1中, 再把数据写入新建文件 test2.ini中 
Sub test() 
 Dim Fm, i As Long, j As Long, k As Long 
 Dim TT, T1 
 On Error Resume Next 
  
 Fm = Application.GetOpenFilename("Text Files (*.txt), *.txt") 
 If Fm = False Then Exit Sub              ' 取消选择文件则退出   k = FreeFile 
 Open Fm For Input As #k                  ' 以随机只读的方式打开文件 
  
 f2 = FreeFile 
 Open "c:\test2.ini" For Output As #f2        ' 以随机方式新建一个不存在的文件 
  
 j = 1 
 W ithWo rksheets("sheet1")
  
 

 Do While Not EOF(k)                      ' 循环读至文件最后一行        Line Input #k, TT                    ' 读入一行数据并将其赋予某变量 
      T1 = Split(TT)                       ' 以文本中空格来分开这个字符串并赋值给变量,请参考 split函数帮助        .Cells(j, 1) = T1(0) 
      Print #f2, T1(0) 
      j = j + 1 
 Loop
 EndW ith
  
 Close #k                                 ' 关闭文件 
 Close #f2                                ' 关闭文件 
End Sub 
3) Access文件 
使用 VBA来访问数据库,其实就是通过一定方法借助数据库引擎来访问,关键是使用什么方法来使
用引擎。目前访问 ACCESS数据库常用的有 DAO和 ADO方法,DAO就是 Database Access Object(数据库 访问对象 )的英文缩写, DAO是老式的 , 它目前还在使用的原因是向下兼容和 ADO在一些地方还没有取代 DAO的功能。 ADO是 ActiveX Data Object(数据控件对象)的英文缩写,是目前较新和功能较强的方法。 
通过 DAO或ADO可以访问多种类型的数据库,包括 Access、SQL Server、 Oracle等,也可访问应用
程序的文件,如Excel文件、文本文件及 Email和 NEWS的文件。实际上利用控件来链接数据库,其概念 大致相同,首先都需创建链接,其后用 Open方法产生各种类型的数据集对象,再对数据集对象操作来使 用数据库内容。 
3.1 DAO使用的步骤及方法  (1). 引用 DAO类型库 
从 VBE的”工具/引用”菜单中选择可引用“Microsoft DAO 3.6 Object Library”项 . 
设置DAO数据类型变量
(2). 定义 DAO对象变量 
1) Dim db As Database, Database(数据库 )变量对应于 Access数据库 . 
2) Dim rs As RecordSet, RecordSet(记录集)变量对应于 Access数据库的一个表或子表 .  多定义为全局变量,以供程序多处使用。 
(3). 打开数据库 
Set db = OpenDatabase (Thisworkbooks.path & "\数据库名礀.mdb" )   ‘用 DAO怎么样打开有密码的 ACCESS 数据库  Set dbTemp = OpenDatabase("C:\db.mdb", False, False, ";PWD=1234 5")   
(4).打开表或建立表的子表  A. 建立表的子表 
Set rs = db.OpenRecordset("select * from 表名")  
B. 打开表 
Set RS = DB.OpenRecordset("表名", dbOpenDynaset) 
Opendatabase 方法是打开数据库并返回此数据库的 database对象,其语法如下: 
 

Set database的对象变量=opendatabase ([路径及数据库名礀 ],[除外性],[只读 ])  除外性:由true和 false值所构成,当值为 true时代表仅允许唯一的使用者使用数据库。  只读:由 true和 false值所构成,为 true代表数据库仅提供读取的服务 
Openrecordset方法用来创建一个新的 recordset对象,语法为: 
Set recordset 对象变量=数据库变量.openrecordset(来源,种类 )  recordset种类有5种,分别为:表(table)、动态集(dynaset)、快照集(snapshot)、动态(dynamic)、正 向(forward-only),其中常用的时动态集(dynaset)实际上是引用一个或多个表中数据记录的集合,是功 能最强的数据记录集合类型,也是默认值。 
(5). 操作数据库记录 
对记录的操作就是使用记录集的对象方法和属性来实现,特附录常用属性和方法如下。 
记录集对象的属性和方法: 
rs.Recordcount属性 用来记录目前数据记录的数量,如判断数据库是否为空  rs.EOF 属性 是否是记录的尾  rs.BOF 属性 是否是记录的头  rs.Nomatch 属性 返回上次查找成功与否 
rs.Move n 方法 移动到第 n 条记录  rs.Movenext 方法 移动到下一条记录  rs.MovePrevious 方法 移动到上一条记录  rs.Movefirst 方法 移动到第一条记录  rs.Lastfirst 方法 移动到最后一条记录  rs.Delete 方法 删除当前记录  rs.Edit 方法 修改当前记录 (步骤为三步: 1. 用 edit方法设置为修改状态;2. 将数据分别赋到记录的各字 段; 3.用Updata方法,把记录更新到数据库中)  rs.AddNew 方法 添加记录   (添加记录分三步:1. 用AddNew方法添加一个新的空白记录;2. 将数据分别赋到记录的各字段;3.用 Updata方法,把记录更新到数据库中去)  rs.Updata 方法 更新内容到数据库中  rs.Findfirst "字段名 = ' " & “查找内容 ” & " ' "   方法 查找记录中字段与内容相配的首条记录  rs.Findnext 方法 查找下一个匹配记录  rs.FindLast 方法 查找最后一个匹配记录  rs.FindPrevious方法 查找前一个匹配记录  rs.Close 方法 关闭 记录集关闭链接 
字段集的属性方法: 
rs. Fields.Count 属性 字段数目  rs. Fields(n) 第 n+1个字段 , Fields(0) 表示第一个字段  rs. Fields.Delete(Name As String) 方法 删除字段  rs. Fields.Append (Object As Object) 方法 添加字段  rs. Fields.Refresh 方法 更新 
字段的属性方法 :  rs. Fields(n).Name 
 

rs. Fields(n).Size  rs. Fields(n).Type  rs. Fields(n).Fieldsize  rs. Fields(n).value 
示例: 打开一个数据库,建立浏览, 查询, 修改, 删除, 添加等功能。   Option Explicit 
Public totalRecs As Long, curRecNo As Long        '用于记住 总记录数 和 当前记录号 
Public DB1 As Database, RS1 As Recordset 
Private Sub UserForm_Initialize()   '窗口显示 
 Set DB1 = OpenDatabase(ThisWorkbook.Path & "\pallet.mdb") 
    Set RS1 = DB1.OpenRecordset("pallet", dbOpenDynaset) 
    If RS1.EOF And RS1.BOF Then 
        MsgBox "Database is Null." 
        cmdExit_Click 
    Else 
        RS1.MoveLast                ' 指针移动到最后记录,以便统计记录总数 
        RS1.MoveFirst 
        totalRecs = RS1.RecordCount 
        curRecNo = 1 
        SetData                     ' 设置窗口参数,按钮是否可用 
    End If  End Sub 
Private Sub cmdFirst_Click()           ' 第一条记录      RS1.MoveFirst 
    curRecNo = 1 
    SetData  End Sub 
Private Sub cmdLast_Click()           ' 最后一条记录      RS1.MoveLast 
    curRecNo = totalRecs 
    SetData  End Sub 
Private Sub cmdPrevious_Click()     '前一条记录      RS1.MovePrevious 
    curRecNo = curRecNo - 1 
    SetData  End Sub 
Private Sub cmdNext_Click()         ' 下一条记录      RS1.MoveNext 
    curRecNo = curRecNo + 1 
    SetData  End Sub 
Private Sub cmdAdd_Click()          ' 增加一条记录      Dim i As Integer 
    RS1.AddNew 
 

    For i = 1 To 5 
        RS1.Fields(i) = Me.Controls("txt" & i) 
    Next i 
    RS1.Update 
    totalRecs = totalRecs + 1 
    curRecNo = totalRecs 
    RS1.MoveLast 
    SetData  End Sub 
Private Sub cmdDelete_Click()       '删除当前记录      RS1.Delete 
    RS1.MoveNext 
    If RS1.EOF = True Then 
        RS1.MovePrevious            ' 指针到底就朝前移 
        curRecNo = totalRecs - 1 
    End If 
    totalRecs = totalRecs - 1 
    SetData  End Sub 
Private Sub cmdModify_Click()       '修改当前记录      Dim i As Integer 
    RS1.Edit 
    For i = 1 To 5 
        RS1.Fields(i) = Me.Controls("txt" & i) 
    Next i 
    RS1.Update  End Sub 
Private Sub cmdFind_Click()          ' 查找记录,与第一个文本框内容相等  
 RS1.FindFirst "palletno='" & txt1.Text & "'" 
    If RS1.NoMatch Then 
        MsgBox "Sorry, find Nothing!" 
    Else 
        curRecNo = RS1.AbsolutePosition + 1 
        SetData 
    End If  End Sub 
Private Sub cmdClear_Click()         ' 清除显示内容      Dim i As Integer 
    For i = 1 To 5 
        Me.Controls("txt" & i) = "" 
    Next i  End Sub 
Private Sub cmdExit_Click()          ' 退出窗口      RS1.Close 
    DB1.Close 
    Unload Me 
 

End Sub 
Sub SetData()                        ' 窗口数据设置      Dim i As Integer 
    txtCurRecNo.Text = curRecNo 
    cmdFirst.Enabled = curRecNo > 1 
    cmdPrevious.Enabled = curRecNo > 1 
    cmdLast.Enabled = curRecNo < totalRecs 
    cmdNext.Enabled = curRecNo < totalRecs 
    For i = 1 To 5 
        Me.Controls("txt" & i).Text = RS1.Fields(i) 
    Next  End Sub 
3.2 ADO使用的步骤及方法  (1). 引用 ADO类型库 
从 VBE的”工具/引用”菜单中选择可引用“Microsoft ActiveX Data Object 2.5 Library”项 . 
(2). 定义和生成ADO对象 
1) Dim Cnn As New ADODB.Connection     ‘数据库连接 Connection对象变量 
2) Dim Rst As New ADODB.Recordset      ‘数据库记录集对象变量 
3) Dim Fld As ADODB.Field              ‘记录字段对象变量 
(3). 打开数据库 
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & This Workbook.Path & "\CONTACT1.MDB;"  用定义生成的数据库连接对象的open方法,打开一个数据库。如果要用ADO打开一个加密码的数据库, 方法如下:  CNN.Open "provider=Microsoft.jet.OLEDB.4.0;Data Source=" &  ThisWorkbook.Path & "\CONTACT1.MDB;" &  ";Jet OLEDB:Database Password=123" 
(4).打开表或建立表的子表 
Rst.Open "SELECT 字段名[,字段名] FROM 表名",Cnn, adOpenKeyset, adLockOptimistic  用记录集对象的open方法,打开或生成一个数据库的表或子表记录。  如:Rs1.Open "Person", Cnn, adOpenKeyset, adLockOptimistic   '取得联系人表所有记录集内容 
(5). 操作数据库记录 
对记录的操作就是使用记录集的对象方法和属性来实现,属性和方法其实与 DAO的相似,这里就不多说。 看下面示例,尽快学会使用 ADO.  示例 : 打开一个数据库,建立浏览, 修改, 删除, 添加和筛选等功能。使用 ADO修改和删除记录时,最关键 一条就是主关键字段不能重复,所以我们需要建立主关键字段为自动编号类型 (Access自动编号 ),这样就 不会重复,否则出错! 
Option Explicit 
Public totalRecs As Long, curRecNo As Long        '用于记住 总记录数 和 当前记录号 
Public Cnn As ADODB.Connection                ' 定义全局数据库对象变量 
Public Rs1 As ADODB.Recordset 
 

'窗体启动程序 
Private Sub UserForm_Initialize()      Set Cnn = New ADODB.Connection                       ' 创建一个连接和打开  Cnn 连接 
    Set Rs1 = New ADODB.Recordset                         ' 创建一个记录集 
    Cnn.Open  "Provider=Microsoft.Jet.O LEDB.4.0; DataSour ce=" &ThisWorkbook .Path&  "\CONTACT1.MDB;"      Rs1.Open "Person", Cnn, adOpenKeyset, adLockOptimistic          ' 取得联系人表所有记录集内容 
    Rs1.MoveLast 
    totalRecs = Rs1.RecordCount 
    curRecNo = 1 
    Rs1.MoveFirst 
    Call dis_form                                               ' 显示数据记录到窗体  End Sub 
'****[第一条]按钮程序 ****  Private Sub CommandButton1_Click()      Rs1.MoveFirst      curRecNo = 1      Call dis_form  End Sub 
'****[上一条]按钮程序 ****  Private Sub CommandButton2_Click()      Rs1.MovePrevious      curRecNo = curRecNo - 1      Call dis_form  End Sub 
'****[下一条]按钮程序 ****  Private Sub CommandButton3_Click()      Rs1.MoveNext      curRecNo = curRecNo + 1      Call dis_form  End Sub 
'****[最后一条]按钮程序 ****  Private Sub CommandButton4_Click()      Rs1.MoveLast      curRecNo = totalRecs      Call dis_form  End Sub 
'****[删除]按钮程序 ****  Private Sub CommandButton5_Click()      Rs1.Delete      totalRecs = totalRecs - 1 
 

    Rs1.MoveNext 
    If Rs1.EOF = True Then 
        Rs1.MovePrevious 
        curRecNo = curRecNo - 1 
    End If 
    Rs1.Update            ' 更新数据记录集,这点与DAO方法不同,  DAO删除后不需更新 
    Call dis_form  End Sub 
'**** [关闭]按钮  **** 
Private Sub CommandButton6_Click()      Rs1.Close 
    Cnn.Close 
    Set Rs1 = Nothing: Set Cnn = Nothing         ' 删除对象 
    Unload Me                               ' 关闭窗体  End Sub 
'****[更新]按钮程序 ****  Private Sub CommandButton8_Click()      On Error Resume Next      Rs1.Fields(1) = TextBox1.Text      Rs1.Fields(2) = TextBox2.Text      Rs1.Fields(3) = TextBox3.Text      Rs1.Fields(4) = TextBox4.Text      Rs1.Fields(5) = TextBox5.Text      Rs1.Fields(6) = TextBox6.Text      Rs1.Fields(7) = TextBox7.Text      Rs1.Fields(8) = TextBox8.Text      Rs1.Update  End Sub  '****[查找]按钮程序 ****  Private Sub CommandButton10_Click()      Dim Rs2 As New ADODB.Recordset      Dim i As Integer  Rs2.Open "select * from person where 联系人编号  like " & TextBox1.Text, Cnn, adOpenKeyset,  adLockOptimistic        ‘SQL语言使用,查询生成新的记录集      If Rs2.EOF And Rs2.BOF Then          MsgBox "Not find!"      Else         Sheets(1).Cells.ClearContents         For i = 0 To Rs2.Fields.Count - 1          Sheets(1).Cells(1, i + 1) = Rs2.Fields(i).Name         Next         Sheets(1).Cells(2, 1).CopyFromRecordset Rs2         MsgBox "The find result is displayed in Excel."      End If 
 

    Rs2.Close 
    Set Rs2 = Nothing  End Sub 
'****[添加]按钮程序 ****  Private Sub CommandButton9_Click()      Rs1.AddNew      '添加一条记录,注意Fields(0)字段为主键且 Access自动编号,这可以保证添加内容可以重复,否则出 错      totalRecs = totalRecs + 1      Rs1.Fields(1) = TextBox1.Text      Rs1.Fields(2) = TextBox2.Text      Rs1.Fields(3) = TextBox3.Text      Rs1.Fields(4) = TextBox4.Text      Rs1.Fields(5) = TextBox5.Text      Rs1.Fields(6) = TextBox6.Text      Rs1.Fields(7) = TextBox7.Text      Rs1.Fields(8) = TextBox8.Text      Rs1.Update      curRecNo = totalRecs      Call dis_form  End Sub 
'****在窗体上显示当前记录*****  Private Sub dis_form()      TextBox1.Text = Rs1.Fields(1)      TextBox2.Text = Rs1.Fields(2)      TextBox3.Text = Rs1.Fields(3)      TextBox4.Text = Rs1.Fields(4)      TextBox5.Text = Rs1.Fields(5)      TextBox6.Text = Rs1.Fields(6)      TextBox7.Text = Rs1.Fields(7)      TextBox8.Text = Rs1.Fields(8)      CommandButton1.Enabled = curRecNo > 1      CommandButton2.Enabled = curRecNo > 1      CommandButton3.Enabled = curRecNo < totalRecs      CommandButton4.Enabled = curRecNo < totalRecs      TextBox9 = curRecNo  End Sub 
(6).数据库使用 SQL查询语言 
数据库一般都提供了关连式数据库的查询语言 SQL (Structured Query Language), 它是一种非常口语
化、既易学又易懂的语法。此语言几乎是每个数据库系统都必须提供的,用以表示关连式的操作,包含了 资料的定义 (DDL)以及资料的处理 (DML)。 
对于 SQL语言的使用,请参考别的专业教程,本文就简约介绍一下,示例中也仅用到一点SQL语言。 
(6.1)资料定义 DDL(Data Definition Language)   
 

    资料定义语言是指对资料的格式和形态下定义的语言,他是每个数据库要建立时候时首先要面对的, 举凡资料分哪些表格关系、表格内的有什么字段元主键、表格和表格之间互相参考的关系等等,都是在开 始的时候所必须规划好的。   如建表格:Create Table table_name (column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],  column2 DATATYPE [NOT NULL],...) 
(6.2)资料操作 DML(Data Manipulation Language) 
    资料定义好之后接下来的就是资料的操作。资料的操作不外乎增加资料( insert)、 查询资料( query)、 更改资料( update) 、删除资料( delete)四种模式,以下分别介绍他们的语法:  增加资料: INSERT INTO table_name (column1,column2,...) VALUES ( value1,value2, ...)  查询资料: SELECT * FROM table_name WHERE conditions  更改资料:UPDATE table_name SET column1=''xxx'' WHERE conditoins  删除资料: DELETE FROM table_name WHERE conditions 
4) 文件其它操作  4.1) 判断文件存在 
使用  Dir 函数判断 , 格式: Dir [(pathname    [, attributes] ) ]  Dir 会返回匹配 pathname 的第一个文件名。示例如下 .     strfile = Dir(ThisWorkbook.Path & "\filename.xls")      '检查文件是否存在  If strfile <> "" Then    ‘存在就打开     Workbooks.Open ThisWorkbook.Path & "\filename.xls"  Else ‘文件不存在就警告                    MsgBox "文件不存在 ", vbOKOnly, "警告"  End If 
4.2) 搜查文件 
使用 Application.FileSearch方法  示例如下 :   pp = "D:\Temp": ff = 0  With Application.FileSearch    .NewSearch    .LookIn = pp    .Filename = "prn*.tmp"  ‘查找文件 prn*.tmp  *为指代符 
 If .Execute() > 0 Then ff = .FoundFiles.Count 
End With 
MsgBox pp & " 找到  " & ff & " 个档案 !" 
4.3) 删除文件  使用  kill 方法  示例如下 : kill(“c:\mytest.txt”) 
4.4) 取得文件日期属性
使用  FileSystem object对象实现 , 示例函数如下 
Function FileDate(filespec, datetype) 
 Dim fs, f, s 
 

 Set fs = CreateObject("Scripting.FileSystemObject") 
 Set f = fs.GetFile(filespec)    Select Case datetype      Case 1: FileDate = f.DateCreated         ' 档案建立日期      Case 2: FileDate = f.DateLastAccessed    ' 存取日期      Case 3: FileDate = f.DateLastModified    '修改日期    End Select  End Function 
4.5) FileSystemObject文件系统对象的使用 
FileSystemObject (FSO,下面简礀为 FSO) 对象模型,具有大量的属性、方法和事件,使用面向对象
的“ object.method”语法,来处理文件夹和文件,可以在Office 2000 以后版本使用。 FileSystemObject 并 不是 VBA 的一部分,它是以一个 COM 组件的形式提供,可以在VB、 VBA、 VBScript 中使用。 
 FSO对象模型可以创建、改变、移动和删除文件夹,或探测特定的文件夹是否存在,若存在,还可以
找出有关文件夹的信息,如名礀、被创建或最后一次修改的日期,等等。 FSO 对象模型还使文件处理变得 很容易。可以创建文件,插入和改变数据,以及输出(读取)数据。 FSO 对象模型,支持通过  TextStream  对象来创建和操作文本文件,但不支持二进制文件的创建或操作,这可以用 VBA语句完成。 
使用 FileSystemObject 对象模型进行文件操作的步骤是:  1. 使用  CreateObject 方法来创建  FileSystemObject 对象; 
2. 在新创建的对象上使用适当的方法; 
3. 访问对象的属性。 
下面代码显示如何创建  FileSystemObject 实例:  Dim fso 
Set fso = CreateObject("Scripting.FileSystemObject")  在这个示例中, Scripting 是类型库的名字,而  FileSystemObject 则是想要创建的对象的名字。 
使用 FSO 处理文件夹的任务和方法  创建文件夹       FileSystemObject.CreateFolder  删除文件夹       Folder.Delete 或 FileSystemObject.DeleteFolder  移动文件夹       Folder.Move 或 FileSystemObject.MoveFolder  复制文件夹       Folder.Copy 或 FileSystemObject.CopyFolder  检索文件夹       Folder.Name  如果文件夹在驱动器上存在,则找出它         FileSystemObject.FolderExists  获得现有Folder 对象的实例         FileSystemObject.GetFolder  找出文件夹的父文件夹名     FileSystemObject.GetParentFolderName  找出系统文件夹的路径     FileSystemObject.GetSpecialFolder    
FSO 中写数据到文本文件的方法 
向打开的文本文件写数据,不用后续一个新行字符   Write 
向打开的文本文件写数据,后续一个新行字符  WriteLine 
向打开的文本文件写一个或多个空白行  WriteBlankLines 
FSO 中读取文本文件的方法 
 

从文件读取指定数量的字符      Read 
读取一整行(一直到但不包括新行字符)      ReadLine 
读取文本文件的整个内容   ReadAll 
FSO 中移动、复制和删除文件的方法  移动文件  File.Move 或 FileSystemObject.MoveFile  复制文件  File.Copy 或 FileSystemObject.CopyFile  删除文件 File.Delete 或 FileSystemObject.DeleteFile 
使用 FSO 处理文件、文件夹比使用 VBA 语句的方法具有更易操作的特点, FSO 除了不能处理二进制文 件,其文件和文件夹处理的方法也更完备,更直观和易于使用。 
第二节 工作表操作 
在文件操作一节已经讲了 Excel工作簿文件的打开、新建、保存和关闭了,这里再讲文件下的表格操作。            1) 新建与删除  新建工作表、图表或宏表。新建的工作表将成为活动工作表。  Sheets.Add (Before, After, Count, Type)  说明: 
Before   Variant 类型,可选。指定工作表对象,新建的工作表将置于此工作表之前。 
After   Variant 类型,可选。指定工作表对象,新建的工作表将置于此工作表之后。 
Count   Variant 类型,可选。要新建的工作表的数目。默认值为  1。 
Type   Variant 类型,可选。指定工作表类型。可为以下  XlSheetType 常量之一: xlWorksheet、 xlChart、 xlExcel4MacroSheet 或 xlExcel4IntlMacroSheet。默认值为  xlWorksheet。  如果 Before 和  After 两者均省略,则新建的工作表将插入到活动工作表之前。  示例: Sheets.Add after:=Sheets(Sheets.Count)   该语句可以在最后一个工作表后增加一个新表 
删除工作表 
Sheets(“工作表名 ”).Delete  示例:在工作表末新建一个和删除倒数第二个表。  
Sub MySht() 
    Application.DisplayAlerts = False   '关闭删除确认对话框 
    Sheets.Add after:=Sheets(Sheets.Count) 
    Sheets(Sheets.Count - 1).Delete 
    Application.DisplayAlerts = True    '开启确认对话框  End Sub 
2) 隐藏与显示 
使用工作表的 visible属性来设置工作表是否隐藏或显示  隐藏  Sheets ("sheet2").Visible = False  显示  Sheets ("sheet2").Visible =True 
3)保护与撤销 
保护工作表使其不至被修改。 
Sheets(“工作表名 ”).Protect (Password)  
撤销工作表保护使其被修改。 
 

Sheets(“工作表名 ”).Unprotect (Password)  
Password   Variant 类型,可选。为一个字符串,该字符串为工作表或工作簿指定区分大小写的密码。如 果省略本参数,不用密码就可以取消对该工作表或工作簿的保护。否则,必须指定密码,通过密码来取消 对该工作表或工作簿的保护。 
示例: Sheets(“sheet1”).Protect “123456”  Sheets(“sheet1”).Unprotect “123456” 
如果要对工作进行详细保护设置,可参考Excel VBA参考,这里仅讲简单的参数设置。 
第三节 单元格和区域操作 
Excel数据的计算归根到底还是对表的单元进行的,所以单元格和区域操作非常重要的,这一节就详
细介绍这方面的内容。 
一、如何引用单元格和区域   
1)用 Range属性引用单元格和单元格区域  使用  Range 属性来引用  A1 引用样式中的单元格或单元格区域及进行属性更改和赋值。如例句:  Sheets("Sheet1").Range("A1:D5").Font.Bold = True   
Sheets("Sheet1").Range("A1:D5").Value = 10000 
Range 对象既可表单个单元格,也可表单元格区域。下面说明 Range 对象最常用方法。 
引用                    含义    Range("A1")            单元格  A1  
Range("A1:B5")         从单元格  A1 到单元格 B5 的区域   
Range("C5:D9,G9:H16")  多块选定区域   
Range("A:A")           A 列  
Range("1:1")            第一行  
Range("1:5")            从第一行到第五行的区域  
Range("1:1,3:3,8:8")      第  1、 3 和  8 行  
Range("A:C")           从  A 列到 C 列的区域   
Range("A:A,C:C,F:F")    A 、 C 和  F 列  
Range("单元格区域名礀 ")   命名的单元格区域   
2)用 Cells属性引用单元格 
可用 Cells 属性通过行列编号来引用单个单元格。下例中 Cells(6,1) 返回 Sheet1 上的单元格 A6,然后将  Value 属性设置为 10。如:Worksheets("Sheet1").Cells(6, 1).Value = 10  因为可用变量替代行列编号,所以 Cells 属性非常适合单元格区域中循环且速度很快。如下例所示:   Sub CC ()      Dim Counter As Integer      For Counter = 1 To 20          Worksheets("Sheet1").Cells(Counter, 3).Value = Counter      Next Counter  End Sub 
3)用 Rows或Columns属性引用行列 
可用 Rows 属性或 Columns 属性来处理整行或整列。下例中,用 Rows(1) 返回 Sheet1 上的第一行,然
 

后将单元格区域的 Font 对象的  Bold 属性设置为 True。如:Worksheets("Sheet1").Rows(1).Font.Bold = True 
下表举例说明了使用  Rows 和  Columns 属性的一些行和列的引用。  引用               含义    Rows(1)           第一行  
Rows             工作表上所有的行  
Columns(1)        第一列  
Columns("A")      第一列  
Columns          工作表上所有的列  
4)用 Union方法合并区域后引用 
若要同时处理若干行或列及区域,请创建一个对象变量并使用  Union 方法,将对多个区域组合起来。下 例将活动工作簿中第一张工作表上的第一行、第三行和第五行的字体设置为加粗。  Sub SeveralRows()      Worksheets("Sheet1").Activate      Dim myUnion As Range      Set myUnion = Union( Rows(1), Rows(3), Rows(5))      myUnion.Font.Bold = True  End Sub 
5)用括号 [ ]引用单元格和区域 
可用方括号将 A1 引用样式或命名区域括起来,作为  Range 属性的快捷方式。这样就不必键入单词 “ Range”或使用引号,如下例所示:Worksheets("Sheet1").[A1:B5].ClearContents  [MyRange].Value = 30 
6) 用 Offset相对其他单元格来引用单元格  
处理相对于另一个单元格的某一单元格的常用方法是使用   Offset 属性。下例中,将位于活动工作表上活 动单元格下一行和右边三列的单元格的内容设置为双下划线格式。  如:ActiveCell.Offset(1, 3).Font.Underline = xlDouble 
7) 用 Selection 属性引用活动区域 
Select 方法激活工作表和工作表上的对象;而  Selection 属性返回代表活动工作簿中活动工作表上的当前 选定区域的对象。在成功使用  Selection 属性之前,必须先激活工作簿,并激活或选定工作表,然后用  Select  方法选定单元格区域(或其他对象)。 
宏录制器经常创建使用  Select 方法和 Selection 属性的宏。下輀  Sub 过程是用宏录制器创建的,该过程 演示了  Select 方法和 Selection 属性在一起使用的方法。 
Sub Macro1() 
    Sheets("Sheet1").Select 
    Range("A1").Select 
    ActiveCell.FormulaR1C1 = "Name" 
    Range("B1").Select 
    ActiveCell.FormulaR1C1 = "Address" 
    Range("A1:B1").Select 
    Selection.Font.Bold = True 
 

End Sub 
8)区域中循环引用单元格方法 
使用 VBA时,经常需要对某一单元格区域内的每个单元格运行同一段语句。为达到这一目的,可组
合循环语句和一个或多个方法来标识每个单元格,一次针对一个单元格,并执行该操作。  
8.1) For...Next 循环语句与  Cells 属性配合使用 
使用  Cells 属性时,可用循环计数器(或其他变量或表达式)来替代单元格索引编号。下例中变量  
counter 代替行号。此过程在单元格区域  C1:C20 中循环,将绝对值小于 0.01的单元都置为  0。 
Sub RoundToZero1()      For Counter = 1 To 20 
       If Abs(Cells(counter,3).value) < 0.01 Then Cells(counter,3) = 0 
    Next  End Sub 
8.2) For Each...Next 循环语句和 Range 属性配合使用  示例如下:  Sub RoundToZero2()      For Each c In Worksheet s("Sheet1").Range("A1:D10").Cells          If Abs(c.Value) < 0.01 Then c.Value = 0      Next  End Sub 
二、如何处理单元格和区域    1 处理三维区域    如果要处理若干工作表上相同位置的单元格区域,可用   Array 函数选定两张或多张工作表。下例设置三 维单元格区域的边框格式。  Sub FormatSheets()      Sheets (Array("Sheet2",  "Sheet3", "Sheet5")).Select      Range("A1:H1").Select      Selection.Borders(xlBottom).LineStyle = xlDouble  End Sub 
2 处理活动单元格   
ActiveCell 属性返回代表活动单元格的  Range 对象。可对活动单元格应用  Range 对象的任何属性和方 法,如下例所示。 
Sub SetValue() 
    Worksheets("Sheet1").Activate 
    ActiveCell.Value = 35  End Sub  注意    只有活动单元格所在的工作表处于活动状态时,才能处理该活动单元格。  
3 选择活动单元格周围的单元格 
CurrentRegion 属性返回由空白行和空白列所包围的单元格区域。下例中,选定区域扩充到与活动单元格
 

相邻的包含数据的单元格中,然后用“货币”样式设置该区域的格式。   Sub Region()      Worksheets("Sheet1").Activate      ActiveCell.CurrentRegion.Select      Selection.Style = "Currency"  End Sub 
4 单元格和区域赋值 
用赋值号 = 赋值,如给 A1赋值为 10:Range(A1).Value=10 (由于 Value是默认属性,所以可以直接省略 )  区域赋值,如 Range(A1:D5)=10 
5 单元格和区域赋予公式进行计算 
把公式字符串赋予给单元格或区域的 Formula属性,如下例 : 注意一点是公式字符串中要有开头的等号=。  Sub EnterFormula()      Worksheets("Sheet1").Range("D6").Formula = "=SUM(D2:D5)"  End Sub 
三、单元格和区域的定位 
1) 使用单元格的 End属性来定位边界  如:  数据区域的最下行的确定:  Sheets(1).cells( 65536,1).End(xlup).Row  数据区域的最右列的确定:  Sheets(1).cells(1,1).End(xltoright).Column  选定包含单元格“ B4”的区域在  B 列中顶端的单元格: Range("B4").End(xlUp).Select  选定包含单元格“ B4”的区域在第  4 行中最右端的单元格: Range("B4").End(xlToRight).Select  将选定区域从单元格“ B4”延伸至第四行最后一个包含数据的单元格 :   Range("B4", Range("B4").End (xlToRight)).Select 
2) 善用已用区域UsedRange对象来获得区域范围  如:需要获得先前表格已用区域的最右下角单元格位置  Sub Loc () 
temp = [a1] :[a1] = 1                     ‘ 使用 A1单元格,保证已用区域从 A1开始    irow = ActiveSheet.UsedRange.Rows.Count    ‘右下单元格行  icol = ActiveSheet.UsedRange.Columns.Count  ‘右下单元格列  [a1] = temp                               ‘ 还原 A1的值  Cells(irow, icol).Select                      ‘ 选中右下角单元格 
End sub 
四、单元格和区域的保护与锁定  
1)工作表选择改变事件过程中保护,如下:不许可用户选择及改动保护单元格区域,示例中保护 B1:B10  Private Sub Worksheet_SelectionChange(ByVal Target As Range)      Dim rng As Range      Set rng = Range("b1:b10")      If Intersect(Target, rng) Is Nothing Then Exit Sub    ‘ 选择单元不在保护区内就退出       MsgBox "不可以选取单元格!" & Target.Address  ‘选择单元在保护区内就改变选择       ActiveSheet.Range("a1").Select  End Sub 
 

2)通过行列的隐藏来保护 
本示例隐藏工作表“ Sheet1”的第5行和C列  Sub SetHide() 
With Worksheets("Sheet1")             ‘ 使用With …End With语句块,提高效率  .Unprotect                           ‘ 撤销保护,如果原先未保护则不需该句  .Rows(5).Hidden = True                ‘ 隐藏第5行  .Columns("C").Hidden = True           ‘ 隐藏C列  .Protect                             ‘ 启动保护,如果原先未保护则不需该句  End with 
End Sub 
3)通过锁定区域来保护,可限定未锁定区域内输入   Sub SetLock()      ActiveSheet.Unprotect      Cells.Locked = True                  ‘ 锁定全表 
   Range("a1:b10").Locked =false        ‘ 解锁区域 A1:B10,限定该区域为可输入区 
    ActiveSheet.Protect  End Sub 
第四节 图表的操作 
Excel让人喜爱的原因就是它有强大得计算功能和数图相关联的数据作图功能。本节就介绍下 VBA代 码作图方面内容。通过代码作重复的图,可以大大提高效率,比如我的作品 GeoPlot(www.geoplot.net)。 Excel图的代码绘制,最好是学习录制的宏来分析 VBA代码的作用,最后优化而成通用程序块。 
一.新建及类型 
1)设置一个对象等于新增图表对象就建立好了一个新图 
1.1) 新图赋值给对象变量 
Set mychart = Sheets(1).ChartObjects.Add (ChrLeft, ChrTop, ChrWidth, ChrHeight) 
说明:增加一个嵌入图表,其左上角的位置坐标为( ChrLeft, ChrTop),长宽为 ChrWidth×ChrHeight, 单位为磅。1磅为 1/72 英寸和 0.035 厘米,字体大小通常用磅数量度。  1.2) 直接增加一个图对象到图对象集Charts 
 Charts.A dd
2)图的类型可以更改 Chart对象的属性 ChartType来实现 
2.1)图表对象变量的使用 
mychart.Chart.ChartType = xlXYScatterLines              ' 散点图折线类型 
2.2)未设置对象变量的图 
它的类型更改需要在增加它后,连续操作让它处于激活状态( ActiveChart),这样可通过当前活动
图ActiveChart来使用。如:ActiveChart.ChartType = xlPie    ‘饼图 
3)图表有两大类,一是嵌入工作表上的图,另一类是作为新工作表图,其设置如下: 
3.1)嵌入工作表上的图 
ActiveChart.Location Where:=xlLocationAsObject, Name:= "Sheet1" 或如1.1生成新图时就定义为
生成嵌入图ChartObjects.Add 
 

3.2)新工作表图 
ActiveChart.Location Where:=xlLocationAsNewSheet 或用图表对象变量属性更改  mychart.location 
where:= xlLocationAsNewSheet 
二.设置图表的数据 
一般是使用 Excel表格上数据,所以可以通过设置 Chart图表对象的数据来源属性来获得作图需要的
数据。如:ActiveChart.SetSource Date Source:=Sheets("Sheet1").Range("A1:B6"), PlotBy:= xlColumns  这里的 PlotBy:= xlColumns表示按列绘制数据;也可以按行绘制,其参数为PlotBy:= xlRows。 
另外一种数据设置是对图的横、纵坐标数据分别赋值。如: 
        mychart.chart.SeriesCollection.NewSeries                     ‘ 增加一个系列数据 
        mychart.chart.SeriesCollection(1).XValues = Array(45, 100)       ‘ 横坐标数据组或单元对象 
        mychart.chart.SeriesCollection(1).Values = Array(50, 180)        ‘ 纵坐标数据组或单元对象


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/risslin/archive/2009/12/31/5111401.aspx