阿里云服务器 建立vpn:VBA帮助

来源:百度文库 编辑:中财网 时间:2024/04/27 16:18:36
一,VBA入门知识
1,激活工作簿
2,创建新工作簿
3,打开工作簿
4,用编号引用工作表
5,用名称引用工作表
6,将文档保存为 Web 页
7,用 A1 样式的记号引用单元格和单元格区域
8,用编号引用单元格
9,引用行或列
10,用快捷记号引用单元格
11,引用命名单元格区域
12,按相对于其他单元格的方式来引用单元格
13,用 Range 对象引用单元格
14,引用工作表上的所有单元格
15,引用若干单元格区域
16,在单元格区域中循环
17,选定和激活单元格
18,处理三维区域
19,处理活动单元格
20,在工作表上使用 ActiveX 控件
21,在文档中使用 ActiveX 控件
22,创建自定义对话框
23,在窗体上使用 Microsoft Office Web 组件
24,内置对话框参数表
25,使用 Microsoft Excel 对象的事件
26,在 Visual Basic 中使用 Microsoft Excel 工作表函数
27,处理形状(图形对象)
28,在某一 Microsoft Office 应用程序中控制其他 Microsoft Office 应用程序
29,OLE 程序标识符
30,关于数字签名
31,启动 Microsoft Excel 时不运行"自动执行宏"
32,焦点
二,了解对象,属性,方法和事件
1,了解对象,属性,方法和事件
2
2,Application 对象
3,Workbook 对象
4,Workbooks 属性
5,Range 对象
6,Range 属性
7,Cells 属性
8,Caller 属性
9,Offset 属性
10,Rows 属性
11,Activate 事件
12,Activate, Deactivate 事件
13,Activate 方法
14,WorkbookActivate 事件
15,WindowActivate 事件
16,On Error 语句
17,在工作表上使用 ActiveX 控件
18,Add 方法(Scenarios 集合)
19,Scenarios 集合对象
20,Add 方法 (Validation 对象)
21,Validation 对象
22,Validation 属性
23,Open 事件
24,Open 方法
25, Click 事件
26,Close 方法
27,Change 事件
28,Value 属性
29,DblClick 事件
30,SheetBeforeRightClick 事件
31,Select 方法
32,Select 事件
33,Goto 方法
34,Worksheet 对象
35,SheetChange 事件
36,SheetActivate 事件
37,OpenLinks 方法
38,Enabled 属性
三,VBA语法
(一)Visual Basic 的命名规则
1,写 Visual Basic 语句
2,写声明语句
3
3,Dim 语句的语法
4,Activate 方法的语法
5,Set 语句
6,MsgBox 函数的语法
7,选项语句的语法
8,AddressOf 运算符
9,了解变体
10,写赋值语句
11,写可执行的语句
12,Public 语句
13,Private 语句
14,使用数组
15,使用常数
16,AppActivate 语句
17,Beep 语句
19,Date 语句
20,Error 语句
21,Exit 语句
22,GoSub...Return 语句
23,GoTo 语句
24,Input # 语句
25,Let 语句
26,Load 语句
27,Name 语句
28,On...GoSub,On...GoTo 语句
29,Open 语句
30,Rem 语句
31,Stop 语句
32,Time 语句
33,While...Wend 语句
(二)逻辑语句
1,If...Then...Else 语句
2,使用 Select Case 语句
3,使用 For...Next 语句
4,For Each...Next 语句
5, Do...Loop 语句
6, With 语句
(三)过程
1,写 Sub 过程
2,写 Function 过程
3,写 Property 过程
4
四, ActiveX 控件
1,AfterUpdate 事件
2,Click 事件
3,Click 事件,命令按钮控件,Accelerator 和 Caption 属性示例
4,DblClick 事件
5,Error 事件
6,KeyDown 和 KeyUp 事件
7,KeyPress 事件
8,KeyPress 事件示例
9,MouseDown 和 MouseUp 事件
10,MouseMove 事件
11,列表框控件
12,SpinDown 和 SpinUp 事件
13,SpinDown,SpinUp 事件和 Delay 属性示例
14,组合框控件
15,命令按钮控件
16,标签控件
17,列表框控件,DataObject 对象,MouseMove 事件和 StartDrag,SetText 方法示例
18,多页控件
19,选项按钮控件
20,文本框控件
21,切换按钮控件
22,用户窗体窗口
5
一,VBA入门知识
1,激活工作簿
用 Activate 方法激活工作簿后,该工作簿将放在活动窗口中.下述过程激活已打
开的工作簿"MyBook.xls".
Sub MakeActive()
Workbooks("MyBook.xls").Activate
End Sub
2,创建新工作簿
如果要用 Visual Basic 创建新的工作簿,应使用 Add 方法.下述过程创建了新工
作簿.Microsoft Excel 自动将该工作簿命名为"BookN",其中 N 是下一个可用的数字.
新工作簿将成为活动工作簿.
Sub AddOne()
Workbooks.Add
End Sub
创建新工作簿的较好的方法是将其赋给一个对象变量.下例中,由 Add 方法返回的
Workbook 对象赋给了对象变量 newBook.然后,又设置了 newBook 的若干属性.使用对
象变量可以很容易地控制新工作簿.
Sub AddNew()
Set newBook = Workbooks.Add
With newBook
.Title = "1995 Sales"
.Subject = "Sales"
.SaveAs filename:="95Sales.xls"
End With
End Sub
3,打开工作簿
用 Open 方法打开一个工作簿时,该工作簿将成为 Workbooks 集合的成员.下述过
程打开 C 盘上"MyFolder"文件夹内的工作簿"MyBook.xls".
Sub OpenUp()
Workbooks.Open("C:\MyFolder\MyBook.xls")
End Sub
4,用编号引用工作表
编号是赋予工作表的连续的数字,这些数字的顺序,是根据同一类型的工作表的标
签位置按由左而右的顺序确定的.下述过程使用 Worksheets 属性激活活动工作簿上的第
一张工作表.
Sub FirstOne()
Worksheets(1).Activate
End Sub
如果要处理所有类型的工作表(工作表,图表,模块表和对话框编辑表),可用 Sheets
属性.下述过程激活工作簿中的第四张工作表.
Sub FourthOne()
6
Sheets(4).Activate
End Sub
注意 移动,添加或删除工作表时,编号顺序将会改变.
5,用名称引用工作表
使用 Worksheets 属性和 Charts 属性时,可用名称标识工作表.下述语句激活活
动工作簿内的不同工作表.
Worksheets("Sheet1").Activate
Charts("Chart1").Activate
DialogSheets("Dialog1").Activate
可用 Sheets 属性返回工作表,图表,模块表或对话框编辑表;Sheets 集合包含了
所有这些表.下例激活活动工作簿内的图表"Chart1".
Sub ActivateChart()
Sheets("Chart1").Activate
End Sub
注意 嵌入到工作表上的图表是 ChartObjects 集合的成员,而那些位于单独的表上
的图表则属于 Charts 集合.
6,将文档保存为 Web 页
在 Microsoft Excel 2000 中,可以将工作簿,工作表,图表,区域,查询表,数
据透视表报表,打印区域或自动筛选区域保存到 Web 页中.也可以直接在 Excel 中编辑
HTML 文件.
将文档保存为 Web 页
将文档保存为 Web 页是一个创建并保存 HTML 文件及其支持文件的过程.要完成此
过程,可使用 SaveAs 方法,如下例所示,此示例将活动工作簿保存为文件
"C:\Reports\myfile.htm".
ActiveWorkbook.SaveAs _
Filename:="C:\Reports\myfile.htm", _
FileFormat:=xlHTML
自定义 Web 页
通过设置 DefaultWebOptions 对象和 WebOptions 对象的属性,用户可以自定义
HTML 文档的外观,内容,浏览器支持,编辑支持,图形格式,屏幕分辨率,文件组织和
编码.DefaultWebOptions 对象中包含应用程序级别的属性.而任何具有相同名称的工作
簿级别的设置(包含在 WebOptions 对象中)会覆盖这些设置.
设置完属性后,可以使用 Publish 方法将工作簿,工作表,图表,区域,查询表,
数据透视表报表,打印区域或自动筛选区域保存到 Web 页中.下例设置了一些应用程序
级别的属性,然后又设置了活动工作簿的 AllowPNG 属性,而此设置将覆盖应用程序级别
的默认设置.最后,本示例将该区域保存为"C:\Reports\1998_Q1.htm".
With Application.DefaultWebOptions
.RelyonVML = True
.AllowPNG = True
.PixelsPerInch = 96
End With
7
With ActiveWorkbook
.WebOptions.AllowPNG = False
With .PublishObjects(1)
.FileName = "C:\Reports\1998_Q1.htm"
.Publish
End With
End With
也可以直接将文件保存到 Web 服务器上.下例将一个区域保存到 Web 服务器上,
假定该 Web 页的 URL 地址为http://example.homepage.com/annualreport.htm.
With ActiveWorkbook
With .WebOptions
.RelyonVML = True
.PixelsPerInch = 96
End With
With .PublishObjects(1)
.FileName = _
"http://example.homepage.com/annualreport.htm"
.Publish
End With
End With
在 Microsoft Excel 中打开 HTML 文档
要在 Excel 中编辑 HTML 文档,请首先使用 Open 方法打开该文档.下例打开文件
"C:\Reports\1997_Q4.htm"以便进行编辑.
Workbooks.Open Filename:="C:\Reports\1997_Q4.htm"
打开文件后,就可以通过设置 DefaultWebOptions 和 WebOptions 对象的属性自定
义该 HTML 文档的外观,内容,浏览器支持,编辑支持,图象格式,屏幕分辨率,文件组
织和编码.
7,用 A1 样式的记号引用单元格和单元格区域
可在 Range 方法中以 A1 样式的记号引用单元格和单元格区域.下述 Sub 过程将
单元格区域 A15 的字体设置为加粗.
Sub FormatRange()
Workbooks("Book1").Sheets("Sheet1").Range("A15") _
.Font.Bold = True
End Sub
下表演示了用于 Range 方法的一些 A1-样式的引用.
引用 含义
Range("A1") 单元格"A1"
Range("A1:B5") 从单元格"A1"到单元格"B5"的区

8
Range("C59,G9:H16") 多块的选定区域
Range("A:A") "A"列
Range("1:1") 第一行
Range("A:C") 从"A"列到"C"列的区域
Range("1:5") 从第一行到第五行的区域
Range("1:1,3:3,8:8") 第 1,3 和 8 行
Range("A:A,C:C,F:F") "A"列,"C"列和"F"列
8,用编号引用单元格
可用 Cells 属性及行号和列标引用单个单元格.该属性返回代表单个单元格的
Range 对象.下例中,Cells(6,1) 返回工作表"Sheet1"上的单元格"A6",然后将
Value 属性设置为 10.
Sub EnterValue()
Worksheets("Sheet1").Cells(6, 1).Value = 10
End Sub
因为可用变量代入单元格索引值,所以 Cells 属性非常适于在单元格区域中循环,
如下例所示.
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1").Cells(counter, 3).Value = counter
Next counter
End Sub
注意 如果要同时对某一区域内的所有单元格修改属性或应用方法,可用 Range 属
性.有关的详细内容,请参阅"用 A1 样式的记号引用单元格和单元格区域".
9,引用行或列
可用 Rows 属性或 Columns 属性处理整行或整列.这两个属性返回代表单元格区域
的 Range 对象.下例中,用 Rows(1) 返回工作表"Sheet1"上的第一行,然后将该行的
Font 对象的 Bold 属性设置为 True.
Sub RowBold()
Worksheets("Sheet1").Rows(1).Font.Bold = True
End Sub
下表演示了使用 Rows 属性和 Columns 属性的一些行和列的引用.
引用 含义
Rows(1) 第一行
Rows 工作表上所有的行
9
Columns(1) 第一列
Columns("A") 第一列
Columns 工作表上所有的列
如果要同时处理若干行或列,可先创建一个对象变量,然后用 Union 方法把对 Rows
属性或 Columns 属性的多个调用组合起来.下例将活动工作簿中第一张工作表上的第一
行,第三行和第五行的字体设置为加粗.
Sub SeveralRows()
Worksheets("Sheet1").Activate
Dim myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
10,用快捷记号引用单元格
可用方括号将 A1 样式的引用或命名区域的名称括起来,作为 Range 属性的快捷方
式.这样就不必键入"Range"和引号,如下述各例所示.
Sub ClearRange()
Worksheets("Sheet1").[A1:B5].ClearContents
End Sub
Sub SetValue()
[MyRange].Value = 30
End Sub
11,引用命名单元格区域
用名称比用 A1 样式的记号更容易标识单元格区域.如果要命名选定的单元格区域,
单击公式栏左端的名称框,键入名称,然后按 ENTER 键.
引用命名单元格区域
下例引用了工作簿"MyBook.xls"中的单元格区域"MyRange".
Sub FormatRange()
Range("MyBook.xls!MyRange").Font.Italic = True
End Sub
下例在工作簿"Report.xls"中引用了特定于工作表的单元格区域
"Sheet1!Sales".
Sub FormatSales()
Range("[Report.xls]Sheet1!Sales").BorderAround weight:=xlthin
End Sub
如果要选定命名的单元格区域,可用 GoTo 方法,该方法将激活指定区域所在的工
作簿和工作表,然后选定该区域.
Sub ClearRange()
Application.Goto Reference:="MyBook.xls!MyRange"
Selection.ClearContents
10
End Sub
下例显示了在活动工作簿中对上述同一过程的写法.
Sub ClearRange()
Application.Goto Reference:="MyRange"
Selection.ClearContents
End Sub
在命名区域中的单元格上循环
下例用 For Each...Next 循环语句在命名区域中的每一个单元格上循环.如果该区
域中的任一单元格的值超过 limit 的值,就将该单元格的颜色改为黄色.
Sub ApplyColor()
Const limit As Integer = 25
For Each c In Range("MyRange")
If c.Value > limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
12,按相对于其他单元格的方式来引用单元格
处理位于相对于其他单元格的某一位置单元格的常用方法是使用 Offset 属性.下
例中,将位于活动工作表上活动单元格下一行和右边三列的单元格的内容设置为双下划
线.
Sub Underline()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
注意 可用 Offset 属性而不用绝对引用方式来记录宏.指向"工具"菜单内的"录
制宏"子菜单,然后单击"使用相对引用"命令即可.
如果要在单元格区域中循环,可在循环中将 Cells 属性和变量共用.下例用从 5 到
100 的值以 5 为步长填充第三列的前 20 个单元格.变量 counter 用作 Cells 属性的
行号.
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1").Cells(counter, 3).Value = counter * 5
Next counter
End Sub
13,用 Range 对象引用单元格
将对象变量设置为 Range 对象,即可用变量名方便地操纵该单元格区域.
下述过程创建了对象变量 myRange,然后将活动工作簿中工作表"Sheet1"上的单
元格区域"A15"赋予该变量.随后的语句用该变量代替该区域对象,以修改该区域的
属性.
Sub Random()
11
Dim myRange As Range
Set myRange = Worksheets("Sheet1").Range("A1:D5")
myRange.Formula = "=RAND()"
myRange.Font.Bold = True
End Sub
14,引用工作表上的所有单元格
如果对工作表应用 Cells 属性时不指定索引,该属性将返回代表工作表上所有单元
格的 Range 对象.下述 Sub 过程清除活动工作簿中工作表"Sheet1"上的所有单元格的
内容.
Sub ClearSheet()
Worksheets("Sheet1").Cells.ClearContents
End Sub
15,引用若干单元格区域
使用适当的方法可以很容易地同时引用若干单元格区域.可用 Range 和 Union 方
法引用任意组合的单元格区域;用 Areas 属性可引用工作表上选定的一组单元格区域.
使用 Range 属性
使用 Range 属性时,在两个或多个引用之间加上逗号,就可以引用多重区域.下例
清除了工作表"Sheet1"上三个单元格区域的内容.
Sub ClearRanges()
Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18"). _
ClearContents
End Sub
命名区域使得用 Range 属性处理多重区域更为容易.下例可在三个命名区域处于同
一工作表时运行.
Sub ClearNamed()
Range("MyRange, YourRange, HisRange").ClearContents
End Sub
使用 Union 方法
用 Union 方法可将多个单元格区域组合到一个 Range 对象中.下例创建了名为
myMultipleRange 的 Range 对象,并将其定义为单元格区域"A1:B2"和"C3:D4"的组
合,然后将该组合区域的字体设置为加粗.
Sub MultipleRange()
Dim r1, r2, myMultipleRange As Range
Set r1 = Sheets("Sheet1").Range("A1:B2")
Set r2 = Sheets("Sheet1").Range("C3:D4")
Set myMultipleRange = Union(r1, r2)
myMultipleRange.Font.Bold = True
End Sub
使用 Areas 属性
可用 Areas 属性引用选定的单个单元格区域或多块的选定区域集合.下述过程计算
选定区域内的块数目,如果选定区域中有多个块,就显示警告消息.
12
Sub FindMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "Cannot do this to a multiple selection."
End If
End Sub
16,在单元格区域中循环
使用 Visual Basic 时,经常需要对某一区域内的每个单元格运行同一段语句.为
达到这一目的,可将循环语句和标识每个单元格的一个或多个方法组合使用,每循环一次,
就对一个单元格执行一次操作.
在单元格区域中循环的一种方法是使用 For...Next 循环语句和 Cells 属性.使用
Cells 属性时,可用循环计数器(或其他变量或表达式)作为单元格编号.下例中,变量
counter 代替了行号.此过程将在单元格区域"C1:C20"中循环,将所有绝对值小于 0.01
的数字都设置为 0(零).
Sub RoundToZero1()
For counter = 1 To 20
Set curCell = Worksheets("Sheet1").Cells(counter, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next counter
End Sub
在单元格区域中循环的另一种简便方法是使用 For Each...Next 循环语句和由
Range 方法返回的单元格集合.在每一次循环过程中,Visual Basic 都为下一次循环所
用的单元格自动设置一个对象变量.下述过程在单元格区域"A1:D10"中循环,将所有绝
对值小于 0.01 的数字都设置为 0(零).
Sub RoundToZero2()
For Each c In Worksheets("Sheet1").Range("A1:D10").Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
如果不知道要循环的单元格区域的确切边界,可用 CurrentRegion 属性返回活动单
元格周围的区域.例如,下述过程在工作表上运行时,将在活动单元格周围的区域内循环,
将所有绝对值小于 0.01 的数字都设置为 0(零).
Sub RoundToZero3()
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value) 1 Then
MsgBox "You cannot carry out this command " & _
"on multi-area selections"
End If
End Sub
10,Rows 属性
Application 对象:返回一个 Range 对象,此对象代表当前工作表的所有行.如果
当前文档不是工作表, Rows 属性无效.只读.
Range 对象:返回一个 Range 对象,此对象代表指定区域中的所有行.只读.
Worksheet 对象: 返回一个 Range 对象,此对象代表指定工作表中的所有行.只
读.
有关返回一个集合中单个成员的详细内容,请参阅返回集合中的对象.
说明
在不用对象识别符的情况下使用此属性等价于 ActiveSheet.Rows.
当应用于多选区域的Range对象时,该属性只返回该范围中第一个区域的行.例如,
如果 Range 对象有两个 areas — A1:B2 和 C3:D4 — Selection.Rows.Count 返回 2
而不是 4. 要在一个可能包含多选区域的范围时,利用Areas.Count来判断该范围是否
包含多个选择区域.如果是,则象第 3 个示例中所示,在该范围中的每个区域循环.
Rows 属性示例
本示例删除 Sheet1 的第三行.
Worksheets("Sheet1").Rows(3).Delete
47
本示例检查工作表一当前区域中的行,如果某行的第一个单元格值与前一行的第一
个单元格的值相等,则删除此行.
For Each rw In Worksheets(1).Cells(1, 1).CurrentRegion.Rows
this = rw.Cells(1, 1).Value
If this = last Then rw.Delete
last = this
Next
本示例显示 Sheet1 选定区域的行数.如果是多重选定区域,本示例将对每一个子
区域进行循环.
Worksheets("Sheet1").Activate
areaCount = Selection.Areas.Count
If areaCount <= 1 Then
MsgBox "The selection contains " & _
Selection.Rows.Count & " rows."
Else
i = 1
For Each a In Selection.Areas
MsgBox "Area " & i & " of the selection contains " & _
a.Rows.Count & " rows."
i = i + 1
Next a
End If
11,Activate 事件
激活一个工作簿,工作表,图表或嵌入式图表时产生此事件.
语法
Private Sub object_Activate()
object Chart,Workbook,或者 Worksheet.有关使用 Chart 对象的事件的详细内
容,请参阅嵌入式图表事件的用法.
说明
切换两个显示同一工作簿的窗口时,将产生 WindowActivate 事件,但不产生工作
簿的 Activate 事件.
新建窗口时不产生本事件.
Activate 事件示例
本示例当激活工作表时对 A1:A10 区域进行排序.
Private Sub Worksheet_Activate()
Range("a1:a10").Sort Key1:=Range("a1"), Order:=xlAscending
End Sub
Activate 方法示例
本示例激活工作表"Sheet1".
Worksheets("Sheet1").Activate
本示例选定工作表"Sheet1"中的单元格区域"A1:C3",并激活单元格"B2".
48
Worksheets("Sheet1").Activate
Range("A1:C3").Select
Range("B2").Activate
本示例激活工作簿 Book4.xls.如果工作簿 Book4.xls 有若干窗口,本示例激活第
一个,即 Book4.xls:1.
Workbooks("BOOK4.XLS").Activate
12,Activate, Deactivate 事件
在对象变成活动窗口的时候就会发生 Activate 事件.而当对象不再是活动窗口时,
则会发生 Deactivate 事件.
语法
Private Sub object_Activate()
Private Sub object_Deactivate()
object 代表一个对象表达式,其值为"应用于"列表中的对象.
说明
对象可使用代码中的 Show 方法变成活动的.
只有在对象是可见的时候才会发生 Activate 事件.除非使用 Show 方法,否则用
Load 加载的 UserForm是不可见的.
只有在应用程序中移动焦点时才会发生 Activate 及 Deactivate 事件.而将焦点
移出或移动到另一个应用程序中的对象并不会触发此事件.
在卸载对象时,并不会发生 Deactivate 事件.
13,Activate 方法
激活对象,如下表所示.
对象 说明
Chart,ChartObject 使该图表成为活动图表.
Worksheet 使该工作表成为活动工作表.等同于单击工作表的选项卡.
OLEObject 激活对象.
Pane 激活窗格.如果该窗格不在活动窗口,则该窗格所属的窗口也
将激活.不能激活冻结的窗格.
Range 激活单个单元格,该单元格必须处于当前选定区域内.可用
Select 方法选定单元格区域.
Window 将窗口提到 Z-次序的最前面.这样不会引起可能附加在工作
簿上的 Auto_Activate 或 Auto_Deactivate 宏的运行(可用
RunAutoMacros 方法运行这些宏).
Workbook 激活与该工作簿相关的第一个窗口.这样不会引起可能附加在
工作簿上的 Auto_Activate 或 Auto_Deactivate 宏的运行(可用
RunAutoMacros 方法运行这些宏).
语法
expression.Activate
expression必选.该表达式返回"应用于"列表中的对象.
14,WorkbookActivate 事件
49
当激活任一工作簿时产生此事件.
语法
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
app 在类模块中带有事件声明的 Application 类型对象.有关详细内容,请参阅
Application 对象事件的用法.
Wb 激活的工作簿.
WorkbookActivate 事件示例
本示例当激活一个工作簿时对所有打开的窗口进行排列.
Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
Application.Windows.Arrange xlArrangeStyleTiled
End Sub
工作簿的窗口激活时,将产生本事件.
语法
Private Sub object_WindowActivate(ByVal Wb As Excel.Workbook, ByVal Wn As
Excel.Window)
object Application 对象或 Workbook 对象.有关 Application 对象事件用法的
详细内容,请参阅 Application 对象事件的用法.
Wb 仅用于 Application 对象.显示在活动窗口中的工作簿.
Wn 激活的窗口.
15,WindowActivate 事件示例
本示例使工作簿窗口激活时最大化.
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
Wn.WindowState = xlMaximized
End Sub
16,On Error 语句
启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错
误处理程序.
语法
On Error GoTo line
On Error Resume Next
On Error GoTo 0
On Error 语句的语法可以具有以下任何一种形式:
语句 描述
On Error
GoTo line
启动错误处理程序,且该例程从必要的 line 参数中指定的 line
开始.line 参数可以是任何行标签或行号.如果发生一个运行时错误,
则控件会跳到 line,激活错误处理程序.指定的 line 必须在一个过程
中,这个过程与 On Error 语句相同; 否则会发生编译时间错误.
On Error
Resume Next
说明当一个运行时错误发生时,控件转到紧接着发生错误的语句
之后的语句,并在此继续运行.访问对象时要使用这种形式而不使用 On
Error GoTo.
On Error 禁止当前过程中任何已启动的错误处理程序.
50
GoTo 0
说明
如果不使用 On Error 语句,则任何运行时错误都是致命的;也就是说,结果会导
致显示错误信息并中止运行.
一个"允许的"错误处理程序是由 On Error 语句打开的一个处理程序;一个"活
动的"错误处理程序是处理错误的过程中允许的错误处理程序.如果在错误处理程序处于
活动状态时(在发生错误和执行 Resume,Exit Sub,Exit Function 或 Exit Property 语
句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误.控件返
回调用的过程.如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理
该错误.如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,
这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止.如果没有找
到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的.
错误处理程序每次将控件返回调用过程时,该过程就成为当前过程.在任何过程中,一旦
错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运行.
注意 一个错误处理程序不是 Sub 过程或 Function 过程.它是一段用行标签或行
号标记的代码.
错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因.在其它
任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先
测试或存储 Err 对象中相关的属性值.Err 对象中的属性值只反映最近发生的错误.
Err.Description 中包含有与 Err.Number 相关联的错误信息.
On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行,或是
从紧随最近一次调用含有 On Error Resume Next 语句的过程的语句继续运行.这个语句
可以置运行时错误于不顾,使程序得以继续执行.可以将错误处理程序放置在错误发生的
地方,而不必将控件传输到过程中的其它位置.在调用另一个过程时,On Error Resume Next
语句成为非活动的,所以,如果希望在例程中进行嵌入错误处理,则应在每一个调用的例
程中执行 On Error Resume Next 语句.
注意 当处理在访问其它对象期间产生的错误时,与其使用 On Error GoTo 指令,
不如使用 On Error Resume Next.每次和对象打交道,在不知道用代码访问哪个对象时,
检查一下 Err 都会打消这种疑虑.可以确定是哪个对象产生错误(Err.Source 中指定的
对象),也可以确定是哪个对象将错误代码放在 Err.Number 中.
On Error GoTo 0 停止在当前过程中处理错误.即使过程中包含编号为 0 的行,它
也不把行 0 指定为处理错误的代码的起点.如果没有 On Error GoTo 0 语句,在退出过
程时,错误处理程序会自动关闭.
在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,
在紧靠着错误处理程序的前面写入 Exit Sub,Exit Function 或 Exit Property 语句.
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
51
. . .
Resume Next
End Sub
此处,错误处理程序代码在 Exit Sub 语句之后,而在 End Sub 语句之前,从而与
过程中的流程分开.错误处理程序代码可以在程序中的任何地方写入.
当对象作为文件运行时,对象中未捕获的错误都被返回控制应用程序.在开发环境
中,如果设置了正确选项,未捕获的错误只返回控制应用程序.请参考主应用程序的文档
的有关描述,从而得知,在调试时应该设置哪些选项,如何设置这些选项以及主机能否建
立类.
如果建立一个访问其它对象的对象,则应该着手处理从那些对象返回的未处理错误.
如果无法处理这种错误,请将 Err.Number 中的错误代码当作自己的一个错误,然后将错
误回传给对象的调用者.应该将错误代码添加到 vbObjectError 常数上来指定这个错误.
举例来说,如果错误代码为 1052,则使用如下方法指定错误:
Err.Number = vbObjectError + 1052
注意 调用动态链接库 (DLL) 或 Macintosh 代码源 期间产生的系统错误不会产生
例外情况,也不会被 Visual Basic 的错误捕获操作所捕获.当调用 DLL 函数时,应该
(根据 API 的详细说明)检查每一个返回值以确定是成功还是失败,如果失败,则检查
Err 对象的 LastDLLError 属性中的值 在Macintosh 中,LastDLLError总是返回0.
On Error 语句示例
本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在.本示例
中,试图删除一已经打开的文件从而生成的错误码为 55.这个错误将由示例中的错误处
理程序码来处理,处理完后,控制会回到发生错误的语句处.On Error GoTo 0 语句关闭
错误陷阱.然后 On Error Resume Next 语句用来改变错误陷阱,以便发觉下一个语句产
生的错误的范围.请注意示例中使用 Err.Clear 在错误处理完后,清除 Err 对象的属性.
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler' 打开错误处理程序.
Open "TESTFILE" For Output As #1' 打开输出文件.
Kill "TESTFILE"' 试图删除已打开的文件.
On Error Goto 0' 关闭错误陷阱.
On Error Resume Next' 改变错误陷阱.
ObjectRef = GetObject("MyWord.Basic")' 试图启动不存在
' 的对象
'检查可能发生的 Automation 错误.
If Err.Number = 440 Or Err.Number = 432 Then
' 告诉用户出了什么事.然后清除 Err 对象.
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear' 清除 Err 对象字段.
End If
Exit Sub' 退出程序,以避免进入错误处理程序.
ErrorHandler:' 错误处理程序.
52
Select Case Err.Number' 检查错误代号.
Case 55' 发生"文件已打开"的错误.
Close #1' 关闭已打开的文件.
Case Else
' 处理其他错误状态 . . .
End Select
Resume' 将控制返回到产生错误的语句.
End Sub
17,在工作表上使用 ActiveX 控件
本帮助主题包括了有关在工作表或图表上使用 ActiveX 控件的特定信息.有关添加
和处理控件的一般信息,请参阅在文档中使用 ActiveX 控件和创建自定义对话框.
在工作表上处理控件时,必须记住以下几点.
除 ActiveX 控件的标准属性之外,在 Microsoft Excel 中还可使用
ActiveX 控件的下列属性:BottomRightCell,LinkedCell,ListFillRange,
Placement,PrintObject,TopLeftCell 和 ZOrder.
这些属性可用 ActiveX 控件的名称来返回或设置.下例滚动工作簿窗口,
使 CommandButton1 位于窗口的左上角.
Set t = Sheet1.CommandButton1.TopLeftCell
With ActiveWindow
.ScrollRow = t.Row
.ScrollColumn = t.Column
End With
当 ActiveX 控件处于激活状态时,将禁用某些 Microsoft Excel
Visual Basic 方法和属性.例如,当某一控件激活时,就不能使用 Sort 方法,
故下述按钮单击事件处理过程中的代码将失败(因为用户单击按钮后,该按钮就
处于激活状态).
Private Sub CommandButton1.Click
Range("a1:a10").Sort Key1:=Range("a1")
End Sub
可通过先激活工作表上的其他元素的方法来绕过这种问题.例如,下列代码可对单
元格区域排序:
Private Sub CommandButton1.Click
Range("a1").Activate
Range("a1:a10").Sort Key1:=Range("a1")
CommandButton1.Activate
End Sub
当用户通过双击鼠标来编辑内嵌在其他应用程序的文档中的
Microsoft Excel 工作簿时,该工作簿上的控件将不会正常工作.如果用户是通
过用右键单击工作簿,然后选中快捷菜单上的"打开"命令来编辑工作簿的话,
工作簿上的控件就能正常工作了.
用 Microsoft Excel 5.0/95 工作簿文件格式保存 Microsoft Excel 工
53
作簿时,将丢失 ActiveX 控件信息.
在工作表上 ActiveX 控件的事件处理过程中,Me 关键字所指向的是工
作表,而非控件.
1) 用 Visual Basic 添加控件
在 Microsoft Excel 中,用 OLEObjects 集合中的 OLEObject 对象代表 ActiveX
控件(所有的 OLEObject 对象也包含在 Shapes 集合中).如果要用编程的方式向工作
表添加 ActiveX 控件,可用 OLEObjects 集合的 Add 方法.下例向第一张工作表添加命
令按钮.
Worksheets(1).OLEObjects.Add "Forms.CommandButton.1", _
Left:=10, Top:=10, Height:=20, Width:=100
2) 通过 Visual Basic 使用控件属性
绝大多数情况下,可在 Visual Basic 代码中用名称引用 ActiveX 控件.下例修改
了控件"CommandButton1"的标题.
Sheet1.CommandButton1.Caption = "Run"
请注意,当在控件所在的工作表的类模块之外使用控件的名称时,必须用工作表的
名称限定该控件的名称.
如果要修改在 Visual Basic 代码中所用的控件的名称,可先选定该控件,然后在
"属性"窗口中设置控件的"(名称)"属性.
因为 ActiveX 控件也可用 OLEObjects 集合中的 OLEObject 对象代表,所以也可
用该集合中的对象来设置控件的属性.下例设置了控件"CommandButton1"的左边位置.
Worksheets(1).OLEObjects("CommandButton1").Left = 10
那些不属于 OLEObject 对象的属性的控件属性,可通过由 Object 属性返回的实际
控件对象来设置.下例设置了控件"CommandButton1"的标题.
Worksheets(1).OLEObjects("CommandButton1"). _
Object.Caption = "run me"
因为所有的 OLE 对象也是 Shapes 集合的成员,所以也可用该集合设置若干控件的
属性.下例对齐第一张工作表上的所有控件的左边框.
For Each s In Worksheets(1).Shapes
If s.Type = msoOLEControlObject Then s.Left = 10
Next
3) 使用 Shapes 和 OLEObjects 集合的控件名称
工作表上的 ActiveX 控件具有两个名称:其一是包含该控件的形状的名称,当查看
工作表时,可在"Name"框中看到此名称;其二是控件的代码名称,在"属性"窗口的
"(名称)"框右边的单元格中可看到此名称.第一次向工作表中添加控件时,形状名称
和代码名称是相同的.但是,如果更改其中之一(形状名称或代码名称),另一个名称并
不会自动随之更改.
对于控件的事件过程,其名称中所使用的是控件的代码名称.但是,当从工作表的
Shapes 或 OLEObjects 集合中返回控件时,必须使用形状名称(而不是代码名称),以
便按名称引用控件.例如,假设向工作表中添加了一个复选框,其默认形状名称和默认代
码名称都是"CheckBox1".如果此后在"属性"窗口的"(名称)"旁键入了
"chkFinished",从而将控件的代码名称更改为"chkFinished",则在事件过程名称中
54
必须使用 chkFinished,而仍然应使用 CheckBox1 从 Shapes 或 OLEObject 集合中返回
控件,如下例所示.
Private Sub chkFinished_Click()
ActiveSheet.OLEObjects("CheckBox1").Object.Value = 1
End Sub
18,Add 方法(Scenarios 集合)
新建方案并将其添加到当前工作表可用的方案列表中.返回 Scenario 对象.
语法
expression.Add(Name, ChangingCells, Values, Comment, Locked, Hidden)
expression必选.该表达式返回 Scenarios 对象.
NameString 类型,必选.方案名.
ChangingCellsVariant 类型,必选.指向方案的可变单元格的 Range 对象.
ValuesVariant 类型,可选.包含 ChangingCells 中指定的单元格的方案值的数组.
如果省略本参数,就假定方案值是 ChangingCells 单元格中的当前值.
CommentVariant 类型,可选.指定方案的注释文字的字符串.添加新方案时,作者
的名字和日期自动添加在注释文字的开始部分.
LockedVariant 类型,可选.若指定为 True,则锁定方案以防修改.默认值为 True.
HiddenVariant 类型,可选.若指定为 True,则隐藏方案.默认值为 False.
说明
方案名称必须是唯一的;如果试图用已经在使用的名称创建方案,Microsoft Excel
会产生错误.
Add 方法(Scenarios 集合)示例
本示例向工作表 Sheet1 添加新方案.
Worksheets("Sheet1").Scenarios.Add Name:="Best Case", _
ChangingCells:=Worksheets("Sheet1").Range("A1:A4"), _
Values:=Array(23, 5, 6, 21), _
Comment:="Most favorable outcome."
19,Scenarios 集合对象
Worksheets(Worksheet)
Scenarios(Scenario)
指定工作表中所有 Scenario 对象的集合.方案是一组被命名和保存的输入值(称
为可变单元格).
Scenarios 集合对象用法
可用 Scenarios 方法返回 Scenarios 集合.下例为工作表"Options"中的方案创
建摘要,并用单元格区域"J10:J20"作为结果单元格.
Worksheets("options").Scenarios.CreateSummary _
resultCells:=Worksheets("options").Range("j10,j20")
可用 Add 方法创建新方案并将其添加到集合中.下例向工作表"Options"添加新
方案"Typical".该方案有两个可变单元格"A2"和"A12",值分别为 55 和 60.
Worksheets("options").Scenarios.Add name:="Typical", _
changingCells:=Worksheets("options").Range("A2,A12"), _
55
values:=Array("55", "60")
可用 Scenarios(index)(其中 index 为方案名称或编号)返回单个 Scenario 对
象.下例显示工作表"Options"中的方案"Typical".
Worksheets("options").Scenarios("typical").Show
20,Add 方法 (Validation 对象)
在指定区域内添加数据有效性检验.
语法
expression.Add(Type, AlertStyle, Operator, Formula1, Formula2)
expression 必选.该表达式返回 Validation 对象.
Type Long 类型,必选.有效性检验类型.可为下列 XlDVType 常量之一:
xlValidateCustom,xlValidateDate,xlValidateDecimal,xlValidateInputOnly,
xlValidateList,xlValidateTextLength,xlValidateTime 或 xlValidateWholeNumber.
AlertStyle Variant 类型,可选.有效性检验警告样式.可为下列 XlDVAlertStyle
常量之一:xlValidAlertInformation,xlValidAlertStop 或 xlValidAlertWarning.
OperatorVariant 类型,可选.有效数据操作符.可为下列
XlFormatConditionOperator 常量之一:xlBetween,xlEqual,xlGreater,
xlGreaterEqual,xlLess,xlLessEqual,xlNotBetween 或者 xlNotEqual.
Formula1 Variant 类型,可选.有效数据方程式的第一部分.
Formula2 Variant 类型,可选.当 Operator 参数是 xlBetween 或 xlNotBetween
时,有效数据方程式的第二部分(否则本参数将忽略).
说明
Add 方法所要求的参数依有效性检验的类型而定,如下表所示.
有效性检验类型 参数
xlValidateCustom Formula1 必选,忽略 Formula2.Formula1 必须为一表达
式,数据项有效时该表达式取值为 True,而数据项无效时取值为
False.
xlInputOnly 能使用 AlertStyle,Formula1 或 Formula2 参数.
xlValidateList Formula1 必选,忽略 Formula2.Formula1 必须为一以逗
号分隔的取值列表,或指向此列表的工作表.
xlValidateWholeNumber
,xlValidateDate,
xlValidateDecimal,
xlValidateTextLength 或
xlValidateTime
必须指定 Formula1 或 Formula2 之一,或两者均指定.
Add 方法(Validation 对象)示例
本示例向单元格"E5"添加数据有效性检验.
With Range("e5").Validation
.Add Type:=xlValidateWholeNumber, _
AlertStyle:= xlValidAlertStop, _
Operator:=xlBetween, Formula1:="5", Formula2:="10"
56
.InputTitle = "Integers"
.ErrorTitle = "Integers"
.InputMessage = "Enter an integer from five to ten"
.ErrorMessage = "You must enter a number from five to ten"
End With
21,Validation 对象
Renge
Validation
代表工作表区域的数据有效性规则.
使用 Validation 对象
使用 Validation 属性可返回 Validation 对象.下例改变单元格 E5 的数据有效
性规则.
Range("e5").Validation _
.Modify xlValidateList, xlValidAlertStop, "=$A$1A$10"
使用 Add 方法可向区域中添加数据有效性规则并创建一个新的 Validation 对象.
下例给单元格 E5 添加数据有效性规则.
With Range("e5").Validation
.Add Type:=xlValidateWholeNumber, _
AlertStyle:=xlValidAlertInformation, _
Minimum:="5", Maximum:="10"
.InputTitle = "Integers"
.ErrorTitle = "Integers"
.InputMessage = "Enter an integer from five to ten"
.ErrorMessage = "You must enter a number from five to ten"
End With
22,Validation 属性
返回 Validation 对象,该对象代表指定区域内的数据有效性检验.只读.
Validation 属性示例
本示例设置单元格"E5"允许空值.
Range("e5").Validation.IgnoreBlank = True
23,Open 事件
打开工作簿时,将产生本事件.
语法
Private Sub Workbook_Open()
Open 事件示例
本示例使每次打开工作簿时,都最大化 Microsoft Excel 窗口.
Private Sub Workbook_Open()
Application.WindowState = xlMaximized
End Sub
24,Open 方法
57
打开一个工作簿.
语法
expression.Open(FileName, UpdateLinks, ReadOnly, Format, Password,
WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable,
Notify, Converter, AddToMRU)
expression必选.该表达式返回一个 Workbooks 对象或 RecentFile 对象.
FileNameString 类型,必选.要打开的工作簿文件名.
UpdateLinksVariant 类型,可选.指定文件中的链接的更新方式.如果省略本参数,
则提示用户选择链接的更新方式.否则,该参数的取值应为下表的某个值.
取值 意义
0 不更新任何引用.
1 更新外部引用,但不更新远程引用.
2 更新外部引用,但不更新外部引用.
3 更新所有远程引用和外部引用.
如果 Microsoft Excel 正在打开以 WKS,WK1 或 WK3 格式存储的文件并且
UpdateLinks 参数设为 2,则 Microsoft Excel 根据与该文件关联的图形创建图表.如
果该参数设为 0,则不创建任何图表.
ReadOnlyVariant 类型,可选.如果为 True 则以只读模式打开工作簿.
FormatVariant 类型,可选.如果 Microsoft Excel 正在打开一个文本文件,则该
参数用于指定分隔字符,如下表所示.如果省略本参数,则使用当前的分隔字符.
取值 分隔字符
1 制表符
2 逗号
3 空格
4 分号
5 没有分隔符
6 自定义字符(参阅 Delimiter 参数)
PasswordVariant 类型,可选.该字符串为用于打开一个受保护工作簿的密码.如
果省略该参数并且指定工作簿已设置密码,则提示用户输入密码.
WriteResPasswordVariant 类型,可选.该字符串为一个写保护工作簿的写入权密
码.如果省略该参数并且指定工作簿已设置密码,则提示用户输入密码.
IgnoreReadOnlyRecommendedVariant 类型,可选.如果为 True 则设置 Microsoft
Excel 不显示建议只读消息(如果该工作簿以"建议只读"选项保存).
OriginVariant 类型,可选.如果该文件为文本文件,则该参数用于指示该文件的
来源于何种操作系统(以便对代码页和回车/换行(CR/LF)进行正确映射).可为下列
XlPlatform 常量之一: xlMacintosh,xlWindows 或 xlMSDOS.如果省略本参数,则使
用当前操作系统.
58
DelimiterVariant 类型,可选.如果该文件为文本文件并且 Format 参数设为 6,
则此参数用于指定用作分隔符的字符.例如,可使用 Chr(9) 代表制表符,使用","代
表逗号,使用";"代表分号或者使用自定义字符.如果该参数为字符串,则只使用该字
符串的第一个字符.
EditableVariant 类型,可选.如果该文件为 Microsoft Excel 4.0 加载宏,则该
参数为 True 时可在可见窗口中打开该加载宏.如果该参数设为 False 或者省略该参数,
则该加载宏以隐藏方式打开,并且不能设为可见.本选项不能应用于由 Microsoft Excel
5.0 或更高版本的 Microsoft Excel 创建的加载宏.如果该文件是 Excel 模板,则参数
为 True 时,会打开指定模板进行编辑.参数为 False 时,可根据指定模板打开新的工
作簿.默认值为 False.
NotifyVariant 类型,可选.如果该文件不能以可读写模式打开,则若该参数设为
True 可将该文件添加到文件通知列表.Microsoft Excel 将以只读模式打开该文件并轮
询文件通知列表,当文件通知列表中的该文件可用时则通知用户.如果该参数设为 False,
或者省略该参数,则不请求任何通知,并且不能打开任何不可用的文件.
ConverterVariant 类型,可选.打开文件时试用的第一个文件转换器的索引号.首
先使用的是指定的文件转换器;如果该转换器不能识别此文件,则试用所有的转换器.转
换器索引号由 FileConverters 方法所返回的转换器行号组成.
AddToMruVariant 类型,可选.如果为 True 则将该工作簿添加到最近使用文件列
表中.默认值为 False.
说明
如果正在打开的工作簿包含 Auto_Open 宏,则若在 Visual Basic 中打开该工作簿
这些宏将不执行.如果要执行 Auto_Open 宏,必须使用 RunAutoMacros 方法.
Open 方法示例
本示例打开 Analysis.xls 工作簿,然后执行 Auto_Open 宏.
Workbooks.Open "ANALYSIS.XLS"
ActiveWorkbook.RunAutoMacros xlAutoOpen
25, Click 事件
在下面两种情况下,发生该事件:
用鼠标单击控件.
用户最终在几种可能的值中为控件选择一个值.
语法
对于多页和 TabStrip
Private Sub object_Click( index As Long)
对于所有的其他控件
Private Sub object_Click( )
Click 事件的语法包含以下成分:
成分 描述
object 必需.一个有效的对象.
index 必需.与该事件相关联的多页或 TabStrip 中的页或标签的索引.
说明
59
在导致 Click 事件发生的两种情况中,第一种情况应用于命令按钮,框架,图像,
标签,滚动条和数值调节钮控件,而第二种情况用于复选框,组合框,列表框,多页,
TabStrip 和切换按钮控件.当选项按钮控件的值变为 True 时,也会导致 Click 事件发
生.
以下是初始化 Click 事件的操作的几个示例:
单击窗体的空白区或窗体上的无效控件(除了列表框).
单击命令按钮控件.如果命令按钮尚不具有焦点,则 Enter 事件发生
在 Click 事件之前.
当命令按钮控件具有焦点时按 Spacebar 键.
单击一控件.
在窗体上按 Enter 键,该窗体上的一个命令按钮的 Default 属性设为
True,同时焦点没有位于其他的命令按钮上.
在一个窗体上按 Esc 键,该窗体上有一个命令按钮的 Cancel 属性设
为 True,同时焦点没有位于其他的命令按钮上.
按一个控件的加速键.
当单击控件而引发 Click 事件时,所发生的一系列事件有:
1. MouseDown
2. MouseUp
3. Click
对于某些控件,当 Value 属性改变时发生 Click 事件.但是,最好使用 Change 事
件来检测一个属性的新值.下面是由于给控件赋新值而初始化 Click 的操作的示例:
单击多页或 TabStrip 中的一个不同页面或标签.这些控件的 Value
属性反映了当前的页或标签.单击当前页或标签不改变控件的值,因而也就不初
始化 Click 事件.
单击复选框或切换按钮控件,当这些控件之一具有焦点时按 Spacebar
键,按这些控件中的一个的加速键,或者用代码改变该控件的值.
将选项按钮值改为 True.将某组中的一个选项按钮值设为 True,则该
群组内的其余按钮的值会自动设置为 False.只针对值变为 True 的那个按钮发
生 Click 事件.
选择一个组合框控件或者列表框控件的值,使其完全与该控件下拉列表
中的某项匹配.例如,若列表未经排序,则在编辑区所键入字符的第一个匹配对
象可能不是列表中唯一的匹配,所以选择这样的值并不初始化 Click 事件.在一
个经排序的列表中,可用完全匹配方式来确保所选择的值是用户键入的文本的唯
一匹配值.
若 Value 设置为 Null,则不会初始化 Click 事件.
注意单击可改变控件的值,因而它能初始化 Click 事件.但用右键单击不会改变控
件的值,所以它不会初始化 Click 事件.
Click 事件,命令按钮控件,Accelerator 和 Caption 属性示例
每当用户用鼠标或加速键来单击按钮时,该示例都将改变一次命令按钮的
Accelerator 和 Caption 属性.Click 事件包含改变 Accelerator 和 Caption 属性的
代码.
60
若要使用该示例,请将代码粘贴到包含名为 CommandButton1 的命令按钮的窗体的
声明变量部分.
Private Sub UserForm_Initialize()
CommandButton1.Accelerator= "C"
'将加速键设置为 COMMAND + C
End Sub
Private Sub CommandButton1_Click ()
If CommandButton1.Caption = "OK" Then
'检查题注,然后更改它.
CommandButton1.Caption = "Clicked"
CommandButton1.Accelerator= "C"
'将加速键设置为 COMMAND + C
Else
CommandButton1.Caption = "OK"
CommandButton1.Accelerator= "O"
'将加速键设置为 COMMAND + O
End If
End Sub
26,Close 方法
关闭指定对象.对于 Workbooks 集合使用语法 1;对于 Window 对象和 Workbook
对象则使用语法 2.
语法 1
expression.Close
语法 2
expression.Close(SaveChanges, FileName, RouteWorkbook)
expression 必选,该表达式返回"应用于"列表中的某个对象.
SaveChangesVariant 类型,可选.如果工作簿没有改变则忽略此参数;如果工作簿
发生了改变并且在另外的窗口中也打开了该工作簿,则仍然忽略此参数;如果工作簿发生
了改变并且没有在另外的窗口中打开,则此参数将指定是否在工作簿中保存所发生的更
改.取值与操作如下表所示:
取值 操作
True 将改变保存到工作簿.如果该工作簿尚未命名,则使用 FileName
所指定的名称.如果省略 FileName 参数,则要求用户输入文件名.
False 不将改变保存到此文件.
省略 显示一个对话框,要求用户决定是否保存所作的更改.
FileName Variant 类型,可选.以此文件名保存所作的更改.
RouteWorkbook Variant 类型,可选.如果指定工作簿不需要传送给下一个收件人
(没有传送名单或已经传送),则忽略该参数.否则, Microsoft Excel 将按照下表所
示处理传送.
取值 意义
61
True 将工作簿传送给下一个收信人.
False 将工作簿传送给下一个收信人.
省略 显示一个对话框,要求用户决定是否传送此工作簿.
说明
从 Visual Basic 关闭工作簿并不运行该工作簿中的任何自动关闭宏.而使用
RunAutoMacros 方法可运行自动关闭宏.
Close 方法示例
本示例关闭 Book1.xls,并放弃所有对此工作簿的更改.
Workbooks("BOOK1.XLS").Close SaveChanges:=False
本示例关闭所有打开的工作簿.如果某个打开的工作簿有改变,Microsoft Excel 将
显示询问是否保存更改的对话框和相应提示.
Workbooks.Close
27,Change 事件
当 Value 属性改变时该事件发生.
语法
Private Sub object_Change( )
Change 事件的语法包含以下成分:
成分 描述
object 必需.一个有效的对象.
设置
当 Value 属性的设置改变时 Change 事件发生,无论属性改变是执行代码还是用户
在界面上操作的结果,此事件都发生.
以下是改变 Value 属性的操作的几个例子:
单击复选框,选项按钮或切换按钮.
输入或选择组合框,列表框或文本框的新文本值.
在 TabStrip 上选择一个不同的标签.
移动滚动条中的滚动块.
单击数值调节钮的向上箭头或向下箭头.
在多页中选择不同的页.
说明
Change 事件过程可以使显示在诸多控件上的数据同步或一致.例如,可用滚动条的
Change 事件过程的来更新显示滚动条对应值的文本框的内容.也可用 Change 事件过程
来实现在一个工作区内显示数据和公式,而在另一个工作区内显示其结果.
注意 在有些情况下,当 Value 属性改变时,Click 事件也可能发生.然而对于检
测一个属性的新值而言,使用 Change 事件是首选的技术.
MatchFound 和 MatchRequired 属性以及 Change 事件,复选框控件示例
下例用 MatchFound 和 MatchRequired 属性来演示组合框的附加的字符匹配.匹配
校验发生于 Change 事件中.
62
在这个例子中,用户指定组合框的文本部分是否必须与组合框中的列表项之一匹配.
用户可以利用复选框来指定是否要求匹配,然后在组合框中键入条件,指定列表中的一项.
若要使用该示例,请将示例代码复制到某窗体的声明变量部分.请确保该窗体包含:
名为 ComboBox1 的组合框.
名为 CheckBox1 的复选框.
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
ComboBox1.MatchRequired = True
MsgBox "To move the focus from the " _
& "ComboBox, you must match an entry in " _
& "the list or press ESC."
Else
ComboBox1.MatchRequired = False
MsgBox " To move the focus from the " _
& "ComboBox, just tab to or click " _
& "another control. Matching is optional."
End If
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.MatchRequired = True Then
'MSForms 自动处理这种情况
Else
If ComboBox1.MatchFound = True Then
MsgBox "Match Found; matching optional."
Else
MsgBox "Match not Found; matching " _
& "optional."
End If
End If
End Sub
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 9
ComboBox1.AddItem "Choice " & i
Next i
ComboBox1.AddItem "Chocoholic"
CheckBox1.Caption = "MatchRequired"
CheckBox1.Value = True
End Sub
28,Value 属性
63
Value 属性的意义取决于其应用的对象,如下表所示.
对象 取值
应用程序 总是返回"Microsoft Excel".只读.
边界 Borders.LineStyle 的同义词.
名称 一个包含公式的字符串,该名称为此公式的引用.在宏语言
中使用 A1 样式引用的字符串,并以等号开头.只读.
参数 参数值.详细信息,请参阅 Parameter 对象.
PivotField 数据透视表报表中指定字段的名称.
PivotItem 数据透视表字段中指定数据项的名称.
PivotTable 数据透视表报表的名称.
Range 指定单元格的值.如果单元格为空,则 Value 返回 Empty
值(使用 IsEmpty 函数可测试这种情况).如果 Range 对象包含
不止一个单元格,就会返回一个值的数组(使用 IsArray 函数可
测试这种情况).
Style 指定样式的名称
Validation 如果符合所有的有效性规则则为 True(也就是说,该区域
包含合法数据).
下表显示了 Value 属性及其相关属性的示例值,假设存在唯一名称为
"[Europe].[France].[Paris]"的 OLAP 数据源,以及具有数据项"aris"的非 OLAP
数据源.
属性 值(OLAP 数据源) 值(非 OLAP 数据
源)
Caption Paris Paris
Name [Europe].[France].[Paris] ( 只
读)
Paris
SourceName [Europe].[France].[Paris] ( 只
读)
(与 SQL 属性值
相同,只读)
Value [Europe].[France].[Paris] ( 只
读)
Paris
当在 PivotItems 集合中指定一个索引时,可使用下表所示的语法.
语法(OLAP 数据源) 语法(非 OLAP 数据源)
expression.PivotItems("[Europe].[France]
.[Paris]")
expression.PivotItems("aris")
在使用 Item 属性引用集合中的特定成员时,可使用下面的文本索引名称.
名称(OLAP 数据源) 名称(非 OLAP 数据源)
[Europe].[France].[Paris] Paris
64
Value 属性示例
本示例将"Sheet1"中 A1 单元格的值设为 3.14159.
Worksheets("Sheet1").Range("A1").Value = 3.14159
本示例对"Sheet1"中 A110 单元格进行循环.如果这些单元格中的某个值小于
0.001,则将其值替换为 0(零).
For Each c in Worksheets("Sheet1").Range("A110")
If c.Value < .001 Then
c.Value = 0
End If
Next c
29,DblClick 事件
当用户指向一个对象并双击鼠标时,发生 DblClick 事件.
语法
对于多页和 TabStrip
Private Sub object_DblClick( index As Long, ByVal Cancel As
MSForms.ReturnBoolean)
对于其他事件
Private Sub object_DblClick( ByVal Cancel As MSForms.ReturnBoolean)
DblClick 事件的语法有以下几个成分:
成分 描述
object 必需.一个有效的对象.
index 必需.在 Pages 或 Tabs 集合里的 Page 或 Tab 对象的位置.
Cancel 必需.事件状态.False 表示由控件处理该事件(这是默认方式).
True 表示由应用程序处理该事件.
说明
要使该事件发生,这两次击键必须发生在由系统的双击速度的设置所限定的时间范
围之内.
对于支持 Click 的控件,DblClick 事件前发生的一系列事件有:
1. MouseDown
2. MouseUp
3. Click
4. DblClick
如果一个控件(例如文本框)不支持 Click 事件,则忽略上述事件序列中的 Click
事件.
如果双击时 Cancel 的返回值为 True,则控件将忽略第二次单击.如果第二次单击
与第一次单击的作用相反,这是非常有用的,比如双击一个切换按钮.Cancel 参数允许
窗体忽略第二次单击,因此无论是单击还是双击按钮都有同样的作用.
DblClick 事件,CanPaste 属性,Paset 和 Copy 方法示例
下例使用 CanPaste 属性和 Past 方法,将组合框从剪贴板粘贴到多页控件的一页
中.该示例还使用 SetFocus 和 Copy 方法把控件从窗体复制到剪贴板.
65
用户单击 CommandButton1 可把组合框复制到剪贴板.用户双击(使用 DblClick 事
件)CommandButton1 可把组合框粘贴到多页控件上.
若要使用该示例,请将示例代码复制到某窗体的声明变量部分.确保该窗体包含:
名为 TextBox1 的文本框.
名为 ComboBox1 的组合框.
名为 MultiPage1 的多页控件.
名为 CommandButton1 的命令按钮.
注意 该示例还包括一个子程序,用以说明把文本粘贴到控件.
Private Sub UserForm_Initialize()
ComboBox1.AddItem "It's a beautiful day!"
CommandButton1.Caption = "Copy ComboBox to " _
& "Clipboard"
CommandButton1.AutoSize = True
End Sub
Private Sub MultiPage1_DblClick(ByVal Index As Long, _
ByVal Cancel As MSForms.ReturnBoolean)
If MultiPage1.Pages(MultiPage1.Value).CanPaste = _
True
Then
MultiPage1.Pages(MultiPage1.Value).Paste
Else
TextBox1.Text = "Can't Paste"
End If
End Sub
Private Sub CommandButton1_Click()
UserForm1.ComboBox1.SetFocus
UserForm1.Copy
End Sub
'将文本粘贴到控件的代码
'rivate Sub ComboBox1_DblClick(ByVal Cancel As _
MSForms.ReturnBoolean)
' If ComboBox1.CanPaste = True Then
'ComboBox1.Paste
'Else
'TextBox1.Text = "Can't Paste"
'End If
'End Sub
30,SheetBeforeRightClick 事件
当右击任一工作表时产生此事件,此事件先于默认的右击操作.
语法
66
Private Sub object_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target
As Range, ByVal Cancel As Boolean)
object Application 对象或 Workbook 对象.有关对 Application 对象使用事件
的详细内容,请参阅 Application 对象事件的用法.
Sh 代表该工作表的 Worksheet 对象.
Target 当右击事件发生时最靠近鼠标指针的单元格.
Cancel 当事件产生时为 False.如果该事件过程将本参数设为 True,则该过程执
行结束之后将不执行默认的右击操作.
说明
右击图表不产生本事件.
SheetBeforeRightClick 事件示例
本示例对 SheetBeforeRightClick 事件响应进行设置,关闭默认的右击操作.其他
示例可参阅 BeforeRightClick 事件示例.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, ByVal Cancel As Boolean)
Cancel = True
End Sub
31,Select 方法
选定对象.
语法
expression.Select(Replace)
expression 必选.该表达式返回一个"应用于"列表中的某个对象.
Replace Variant 类型,可选(仅用于工作表).如果为 True 则用指定对象替代
当前选定区域.如果为 False 则对当前选定区域进行延伸,以包括任何以前选定的对象
和指定对象.
说明
要选定一个单元格或一个单元格区域,可使用 Select 方法.要将单个单元格激活
为活动单元格,可使用 Activate 方法.
Select 方法示例
本示例选定"Sheet1"中的 A1:B3 单元格.
Worksheets("Sheet1").Activate
Range("A1:B3").Select
32,Select 事件
选定图表元素时,将产生本事件.
语法
Private Sub object_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal
Arg2 As Long)
object Chart 对象,或在类模块中与事件一起定义的 Chart 类型的对象.有关的
详细内容,请参阅嵌入式图表事件的用法.
ElementID,Arg1,Arg2 所选定的图表元素.有关这些参数的详细内容,请参阅
BeforeDoubleClick 事件.
67
Select 事件示例
如果用户选定了图表标题,本示例将显示消息框.
Private Sub Chart_Select(ByVal ElementID As Long, _
ByVal Arg1 As Long, ByVal Arg2 As Long)
If ElementId = xlChartTitle Then
MsgBox "please don't change the chart title"
End If
End Sub
33,Goto 方法
选定任意工作簿中的任意区域或任意 Visual Basic 过程,并且如果该工作簿未处
于活动状态,就激活该工作簿.
语法
expression.Goto(Reference, Scroll)
expression必选.该表达式返回 Application 对象.
ReferenceVariant 类型,可选.指定目标.可为 Range 对象,包含 R1C1-样式记
号的单元格引用的字符串或包含 Visual Basic 过程名的字符串.如果省略本参数,目标
将是最近一次用 Goto 方法选定的区域.
ScrollVariant 类型,可选.若指定为 True,则滚动窗口直至目标区域的左上角单
元格出现在窗口的左上角.若指定为 False,则不滚动窗口.默认值为 False.
说明
该方法在下列方面不同于 Select 方法:
如果指定的区域不在位于最前面屏幕的工作表中,Microsoft Excel 将
在选定该区域之前切换至该工作表.(如果对不在屏幕的最前面的工作表中的区域
使用 Select 方法,则选定该区域时并不激活该工作表).
该方法具有让用户滚动目的窗口的 Scroll 属性.
当使用 Goto 方法时,前一次选定区域(Goto 方法运行前)被增加到
以前选定区域的数组中(详细内容,请参阅 PreviousSelections 属性).可使用
该功能快速跳过多至四个选定区域.
Select 方法具有 Replace 参数;Goto 方法没有.
Goto 方法示例
本示例选定工作表"Sheet1"中的单元格"A154",并滚动工作表以显示该单元格.
Application.Goto Reference:=Worksheets("Sheet1").Range("A154"), _
scroll:=True
34,Worksheet 对象
Workbooks(workbook)
Worksheets(worksheet)
多个对象
代表一个工作表.Worksheet 对象是 Worksheets 集合的成员. Worksheets 集合
包含工作簿中所有的 Worksheet 对象.
使用 Worksheet 对象
68
本部分将说明下列返回 Worksheet 对象的属性和方法:
Worksheets 属性
ActiveSheet 属性
Worksheets 属性
可用 Worksheets(index) (其中 index 为工作表索引号或名称)返回单个
Worksheet 对象.下例隐藏活动工作簿中的第一张工作表.
Worksheets(1).Visible = False
工作表索引号表明该工作表在工作簿的选项卡栏中的位置.Worksheets(1) 为工作
簿中第一个(最左边的)工作表,而 Worksheets(Worksheets.Count) 为最后一个.所有
工作表均包括在索引号序列中,即便是隐藏工作表也是如此.
工作表的名称显示在工作表的选项卡上.使用 Name 属性可设置或返回工作表的名
称.下例保护"Sheet1"上的"scenarios".
Worksheets("sheet1").Protect password:="drowssap", scenarios:=True
Worksheet 对象也是 Sheets 集合的成员.Sheets 集合包含工作簿中所有的表(包
括图表和工作表).
ActiveSheet 属性
当工作表处于活动状态时,可用 ActiveSheet 属性引用之.下例使用 Activate 方
法激活工作表"Sheet1",将页打印方向设置为横向,然后打印该工作表.
Worksheets("sheet1").Activate
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut
35,SheetChange 事件
当用户更改工作表中的单元格或者外部链接引起单元格的更改时产生此事件.
语法
Private Sub object_SheetChange(ByVal Sh As Object, ByVal Source As Range)
object Application 对象或 Workbook 对象.有关对 Application 对象使用事件
的详细内容,请参阅 Application 对象事件的用法.
Sh 代表工作表的 Worksheet 对象.
Source 发生更改的区域.
说明
图表发生的更改不触发本事件.
SheetChange 事件示例
本示例当任一工作表发生更改时运行本示例.
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Source As Range)
' runs when a sheet is changed
End Sub
36,SheetActivate 事件
当激活任何一张表时产生此事件.
语法
69
Private Sub object_SheetActivate(ByVal Sh As Object)
object Application 或 Workbook.
Sh 激活的表.可为一个 Chart 对象或 Worksheet 对象.
SheetActivate 事件示例
本示例显示每一激活表的名称.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
37,OpenLinks 方法
打开链接的支持文档.
语法
expression.OpenLinks(Name, ReadOnly, Type)
expression 必选.该表达式返回 Workbook 对象.
Name String 类型,必选.Microsoft Excel 链接或 DDE/OLE 链接的名称,就像
LinkSources 方法返回的一样.
ReadOnly Variant 类型,可选.如果指定 True,就以只读方式打开文档.默认值
为 False.
Type 可选.链接类型.可为下列 XlLink 常量:xlExcelLinks,xlOLELinks(也处
理 DDE 链接),xlPublishers 或 xlSubscribers.
OpenLinks 方法示例
本示例打开活动工作簿中的第一个 OLE 链接.
linkArray = ActiveWorkbook.LinkSources(xlOLELinks)
ActiveWorkbook.OpenLinks linkArray(1)
本示例打开活动工作簿的所有 Microsoft Excel 支持文档.
ActiveWorkbook.OpenLinks _
name:=ActiveWorkbook.LinkSources(xlExcelLinks)
38,Enabled 属性
指定一个控件能否接受焦点和响应用户产生的事件.
语法
object.Enabled [= Boolean]
Enabled 属性的语法包含以下成分:
成分 描述
object 必需.有效对象.
Boolean 可选.判断该对象能否响应用户产生的事件.
设置
Boolean 的设置值有:
值 描述
70
True 该控件可接受焦点并响应用户产生的事件,而且能通过代码进行
访问(默认值).
False 用户不能使用鼠标,击键,加速键或热键处理该控件.通常仍可
通过编码访问该控件.
说明
用 Enabled 属性可使控件有效或无效.无效的控件显示为浅灰色,有效控件的外观
则与此不同.而且,如果控件中显示位图,则当控件变灰时位图也随之变灰.如果图像控
件的 Enabled 属性为 False,那么即使该控件外观没有变灰,仍不能初始化事件.
Enabled 和 Locked 属性结合起来能实现如下作用:
如果 Enabled 和 Locked 都为 True,那么该控件在窗体中可以接受焦
点并且能正常显示(非浅灰色).用户可以复制控件中的数据,但不能编辑它.
如果 Enabled 为 True,而 Locked 为 False,那么该控件在窗体中可
以接受焦点并且能正常显示.用户可复制和编辑该控件中的数据.
如果 Enabled 为 False 而 Locked 为 True,那么该控件在窗体中不
能接收焦点并且是浅灰色的.用户既不能复制也不能编辑控件中的数据.
如果 Enabled 和 Locked 都为 False,那么该控件在窗体中不能接收
焦点并且是浅灰色的.用户既不能复制也不能编辑控件中的数据.
可以把 Enabled 和 TabStop 属性的设置值结合起来,以防止用户用 Tab 键选中命
令按钮,但仍允许用户单击该按钮.将 TabStop 设置为 False,意味着该命令按钮将不
在 Tab 键顺序中出现.但是,如果 Enabled 的属性为 True,只要 TakeFocusOnClick 的
设置是 True,用户仍可以单击该命令按钮.
当用户跳格进入有效的多页控件或 TabStrip 时,控件中的第一页或第一个标签将
接收这个焦点.如果多页控件的第一页或 TabStrip 的第一个标签无效,则控件中第一个
有效的页或标签接收这个焦点.如果多页控件的所有页或 TabStrip 标签都是无效的,那
么该控件也是无效的,将不能接收这个焦点.
如果框架是无效的,则它包含的全部控件都是无效的.
单击一个无效的列表框不能初始化 Click 事件.
Enabled,EnterFieldBehavior,SelLength,SelStart,SelText 属性示例
下例跟踪与选择相关的属性(SelLength,SelStart 和 SelText 属性).当用户用
键盘移动插入点以及扩展选定时,这些属性发生变化.该示例还使用了 Enabled 和
EnterFieldBehavior 属性.
若要使用该示例,请将示例代码复制到某窗体的声明变量部分.请确保该窗体包含:
名为 TextBox1 的一个大的文本框.
名为 TextBox2 到 TextBox4 的在一列中的三个文本框控件.
Private Sub TextBox1_KeyUp(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal Shift As Integer)
TextBox2.Text = TextBox1.SelStart
TextBox3.Text = TextBox1.SelLength
TextBox4.Text = TextBox1.SelText
71
End Sub
Private Sub UserForm_Initialize()
TextBox1.MultiLine = True
TextBox1.EnterFieldBehavior = _
fmEnterFieldBehaviorRecallSelection
TextBox1.Text = "Type your text here. Use " _
& "CTRL+ENTER to start a new line."
End Sub
三,VBA语法
(一)Visual Basic 的命名规则
当在 Visual Basic 的模块中为过程,常数,变量以及参数命名时,可以使用下列
的规则:
第一个字符必须使用英文字母.
不能在名称中使用空格,句点(.),惊叹号(!),或 @,&,$,# 等字
符.
名称的长度不可以超过 255 个字符.
通常,使用的名称不能与 Visual Basic 本身的 Function 过程,语句
以及方法的名称相同.必须退出使用与程序语言的关键字相同的名称.若所使用
的内在语言函数,语句或方法与所指定的名称相冲突,则必须显示地识别它.常
规会将内建函数,语句或方法的名称之前加上关联的类型库的名称.例如,如果
有一个名为 Left 的变量,则只能用 VBA.Left 来调用 Left 函数.
不能在范围的相同层次中使用重复的名称.例如,不能在同一过程中声
明两个命名为 age 的变量.然而,可以在同一模块中声明一个私有的命名为 age
的变量和过程的级别的命名为 age 的变量.
注意 Visual Basic 不区分大小写,但它会在名称被声明的语句处保留大写.
了解 Visual Basic 语法
Visual Basic 帮助主题中有关方法,语句或是Function 过程的语法,展示了正确
使用语句,方法或是函数所需要的元素.在这个主题中的示例,解释了如何去解释最常见
的语法元素.
Activate 方法的语法
object.Activate
在 Activate 方法语法中,斜体字 object 是一个所提供信息的占位符,在此例中
的代码会返回一个对象.在键入粗体字时必须完全象上面的例子一样.例如,下面的过程
会在活动的文档中激活第二个窗口.
Sub MakeActive()
Windows(2).Activate
End Sub
MsgBox 函数的语法
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
72
在 MsgBox 函数的语法中,粗体的斜体字是此函数的命名参数.方括号所包含的参
数是选择性的.(在 Visual Basic 码中不用键入方括号).在 MsgBox 函数中,唯一必
须提供的参数(prompt)是做为提示的文本.
在代码中可以利用位置或名称来指定函数与方法的参数.若利用位置来指定参数,
则必须根据语法中的顺序,利用逗号来分隔每一个参数,例如:
MsgBox "Your answer is correct!",0,"Answer Box"
若以名称来指定参数,则须使用参数名称或跟着冒号与等号(:=),最后再加上参
数值.可以任何的顺序来指定命名参数,例如:
MsgBox Title:="Answer Box", Prompt:="Your answer is correct!"
函数以及某些方法的语法会利用圆括号将参数封闭起来.这些函数和方法会返回值,
所以必须用圆括号将参数封闭起来,才可以赋值给变量.如果忽略返回值或是没有传递所
有的参数,则可以不用圆括号.方法若不返回值,则不用将参数用圆括号封闭起来.上述
准则不管是使用命名参数或位置参数都适用.
在下面的示例中,MsgBox 函数的返回值是一个号码,它被存储在变量 myVar 中,
以用来指示选择的按钮.因为需要用到返回值,所以调用时必须使用圆括号.而另一个消
息框则是用来显示变量的值.
Sub Question()
myVar = MsgBox(Prompt:="I enjoy my job.", _
Title:="Answer Box", Buttons:="4")
MsgBox myVar
End Sub
选项语句的语法
Option Compare {Binary | Text | Database}
在 Option Compare 语句的语法中,大括号和垂直线指示三项中的强制性选择.(在
Visual Basic 的语句中不用键入大括号).例如,下列的语句指出在模块中,字符串的
比较是根据文本的排序顺序而不区分大小写.
Option Compare Text
Dim 语句的语法
Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As
type]] . . .
在 Dim 语句的语法中,Dim 是必备的关键字.而唯一必备的元素是 varname(变量
名).例如,下列的语句创建三个变量:myVar,nextVar 和 thirdVar.它们会自动被声
明成 Variant 变量.
Dim myVar, nextVar, thirdVar
下面的示例声明了一个为 String 的变量.它包含了数据类型,如此可以节省内存
并且帮助从代码中找出错误.
Dim myAnswer As String
若在一个语句中声明好几个变量,则必须包含每一个变量的数据类型.变量在声明
时若少了数据类型,则会自动的声明成 Variant .
Dim x As Integer, y As Integer, z As Integer
73
在下列的语句中,x 与 y 都被指定成 Variant 数据类型,只有 z 被指定成 String
数据类型.
Dim x, y, z As Integer
如果声明一个数组变量,则必须包含圆括号,但下标则是可选的.下列的语句中定
义了一个动态数组 myArray.
Dim myArray()
1,写 Visual Basic 语句
Visual Basic 中的语句是一个完整的命令.它可以包含关键字,运算符,变量,常
数,以及表达式.每一个语句都属于下列三种分类之一:
声明语句,它会为变量,常数,或程序取名称,并且指定一个数据类型.
赋值语句,它会指定一个值或表达式给变量或常数.
可执行语句,它会初始化动作.它可以执行一个方法或是函数,并且可
以循环或从代码块中分支执行.可执行的语句通常包含数学的或条件的运算符.
将语句连续地写在数行上
通常是将一个语句写在同一行中,但也可以利用一个续行符将语句连续到下一行中.
下面的示例中,可执行语句 MsgBox 被接续的写在三行中:
Sub DemoBox()'该过程声明一个字符串变量,
'指定它值为 Claudia,然后显示一个
'连接的消息.
Dim myVar As String
myVar = "John"
MsgBox Prompt:="Hello " & myVar, _
Title:="Greeting Box", _
Buttons:=vbExclamation
End Sub
添加注释
注释可以为读代码的人解释过程或是特别的命令.Visual Basic 在运行过程时,会
忽略掉注释.注释行可由省略符号(')或 Rem 接着一个空格做为开始,并且可以加在过
程的任何地方.为了在语句的同一行中添加注释,必须在语句后面插入一个省略符号,然
后加上注释文本.按照缺省规定,注释会以绿色文本显示.
检查语法错误
如果在键入一行代码后按下 ENTER 键,此行代码以红色文本显示(同时可能也显示
一个错误信息),则必须找出语句中的错误并更正它.
2,写声明语句
可以使用声明语句去命名和定义过程,变量,数组以及常数.当声明一个过程,变
量或常数时,也同时定义了它的范围,而此范围是取决于声明位置以及用什么关键字来声
明它.
下面的示例包含三个声明:
Sub ApplyFormat()
Const limit As Integer = 33
Dim myCell As Range
74
'更多的语句
End Sub
Sub 语句(与 End Sub 语句相匹配)声明一个过程命名为 ApplyFormat.当
ApplyFormat 过程被调用或运行时,所有包含于 Sub 与 End Sub 中的语句都被执行.
写 Sub 过程
Const 语句声明常数 limit,指定 Integer 数据类型,其值 33.
声明常数
Dim 语句声明变量 myCell.它是一个属于 Microsoft Excel Range 对象的数据类
型.可以将变量声明成任何的对象,而此对象显露于正使用的应用程序中.Dim 语句是属
于用来声明变量的语句类型之一.其它用来声明的关键字有 ReDim,Static,Public,
Private 以及 Const.
声明变量
3,Dim 语句的语法
Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As
type]] . . .
在 Dim 语句的语法中,Dim 是必备的关键字.而唯一必备的元素是 varname(变量
名).例如,下列的语句创建三个变量:myVar,nextVar 和 thirdVar.它们会自动被声
明成 Variant 变量.
Dim myVar, nextVar, thirdVar
下面的示例声明了一个为 String 的变量.它包含了数据类型,如此可以节省内存
并且帮助从代码中找出错误.
Dim myAnswer As String
若在一个语句中声明好几个变量,则必须包含每一个变量的数据类型.变量在声明
时若少了数据类型,则会自动的声明成 Variant .
Dim x As Integer, y As Integer, z As Integer
在下列的语句中,x 与 y 都被指定成 Variant 数据类型,只有 z 被指定成 String
数据类型.
Dim x, y, z As Integer
如果声明一个数组变量,则必须包含圆括号,但下标则是可选的.下列的语句中定
义了一个动态数组 myArray.
Dim myArray()
4,Activate 方法的语法
object.Activate
在 Activate 方法语法中,斜体字 object 是一个所提供信息的占位符,在此例中
的代码会返回一个对象.在键入粗体字时必须完全象上面的例子一样.例如,下面的过程
会在活动的文档中激活第二个窗口.
Sub MakeActive()
Windows(2).Activate
End Sub
5,Set 语句
将对象引用赋给变量或属性.
75
语法
Set objectvar = {[New] objectexpression | Nothing}
Set 语句的语法包含下面部分:
部分 描述
objectvar 必需的.变量或属性的名称,遵循标准变量命名约定.
New 可选的.通常在声明时使用 New,以便可以隐式创建对象.
如果 New 与 Set 一起使用,则将创建该类的一个新实例.如
果 objectvar 包含了一个对象引用,则在赋新值时释放该引
用.不能使用 New 关键字来创建任何内部数据类型的新实例,
也不能创建从属对象.
objectexpression必需的.由对象名,所声明的相同对象类型的其它变量,
或者返回相同对象类型的函数或方法所组成的表达式.
Nothing 可选的.断绝 objectvar 与任何指定对象的关联.若没
有其它变量指向 objectvar 原来所引用的对象,将其赋为
Nothing 会释放该对象所关联的所有系统及内存资源.
说明
为确保合法,objectvar 必须是与所赋对象相一致的对象类型.
Dim,Private,Public,ReDim以及 Static 语句都只声明了引用对象的变量.在
用 Set 语句将变量赋为特定对象之前,该变量并没有引用任何实际的对象.
下面的示例说明了如何使用 Dim 来声明 Form1 类型的数组.Form1 实际上还没有
实例.然后使用 Set 将新创建的 Form1 的实例的引用赋给 myChildForms 变量.在 MDI
应用程序中可以使用这些代码来创建子窗体.
Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1
通常,当使用 Set 将一个对象引用赋给变量时,并不是为该变量创建该对象的一份
副本,而是创建该对象的一个引用.可以有多个对象变量引用同一个对象.因为这些变量
只是该对象的引用,而不是对象的副本,因此对该对象的任何改动都会反应到所有引用该
对象的变量.不过,如果在 Set 语句中使用 New 关键字,那么实际上就会新建一个该对
象的实例.
Set 语句示例1
本示例在当前工作簿中新建一张工作表,然后设置该工作表的名称.
Set newSheet = Worksheets.Add
newSheet.Name = "1995 Budget"
本示例新建一张工作表,并在其中插入当前工作簿所有名称的列表,同时包括名称
各自所对应单元格区域的 A1-样式引用.
Set newSheet = ActiveWorkbook.Worksheets.Add
i = 1
76
For Each nm In ActiveWorkbook.Names
newSheet.Cells(i, 1).Value = nm.NameLocal
newSheet.Cells(i, 2).Value = "'" & nm.RefersToLocal
i = i + 1
Next
Set 语句示例2
该示例使用 Set 语句将对象引用赋给变量.假定 YourObject 指向一个具有 Text
属性的合法对象.
Dim YourObject, MyObject, MyStr
Set MyObject = YourObject'对象引用赋值.
'MyObject 和 YourObject 引用同一个对象.
YourObject.Text = "Hello World"'初始化属性.
MyStr = MyObject.Text'返回 "Hello World".
'脱离关联.MyObject 不再引用 YourObject.
Set MyObject = Nothing'释放该对象.
6,MsgBox 函数的语法
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
在 MsgBox 函数的语法中,粗体的斜体字是此函数的命名参数.方括号所包含的参
数是选择性的.(在 Visual Basic 码中不用键入方括号).在 MsgBox 函数中,唯一必
须提供的参数(prompt)是做为提示的文本.
在代码中可以利用位置或名称来指定函数与方法的参数.若利用位置来指定参数,
则必须根据语法中的顺序,利用逗号来分隔每一个参数,例如:
MsgBox "Your answer is correct!",0,"Answer Box"
若以名称来指定参数,则须使用参数名称或跟着冒号与等号(:=),最后再加上参
数值.可以任何的顺序来指定命名参数,例如:
MsgBox Title:="Answer Box", Prompt:="Your answer is correct!"
函数以及某些方法的语法会利用圆括号将参数封闭起来.这些函数和方法会返回值,
所以必须用圆括号将参数封闭起来,才可以赋值给变量.如果忽略返回值或是没有传递所
有的参数,则可以不用圆括号.方法若不返回值,则不用将参数用圆括号封闭起来.上述
准则不管是使用命名参数或位置参数都适用.
在下面的示例中,MsgBox 函数的返回值是一个号码,它被存储在变量 myVar 中,
以用来指示选择的按钮.因为需要用到返回值,所以调用时必须使用圆括号.而另一个消
息框则是用来显示变量的值.
Sub Question()
myVar = MsgBox(Prompt:="I enjoy my job.", _
Title:="Answer Box", Buttons:="4")
MsgBox myVar
End Sub
7,选项语句的语法
Option Compare {Binary | Text | Database}
77
在 Option Compare 语句的语法中,大括号和垂直线指示三项中的强制性选择.(在
Visual Basic 的语句中不用键入大括号).例如,下列的语句指出在模块中,字符串的
比较是根据文本的排序顺序而不区分大小写.
Option Compare Text
8,AddressOf 运算符
一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在
参数表对应位置中需要一个函数指针.
语法
AddressOf procedurename
必需的 procedurename 指定要传递的地址是哪一个过程的地址.这个过程必须是发
出调用命令的工程中的一个标准模块模块里的一个过程.
说明
当一个过程的名称出现在一个参数列表中时,通常该过程已经被计算,并且该过程
返回值的地址也会被传递.AddressOf 允许该过程的地址被传递给动态链接库 (DLL) 中
的一个 Windows API 函数,而不是传递该过程的返回值.API 函数然后就可以使用这个
地址来调用相应的 Basic 过程,这个过程就是我们所知道的回调.AddressOf 运算符只
出现在对 API 过程的调用中.
尽管可以使用 AddressOf 运算符在 Basic 过程之间传递过程指针,却不能通过这
样的一个指针从 Basic 内部调用一个函数.这就是说,例如,一个使用 Basic 编写的类
不能使用这样的一个指针来回调自己的控制器.当使用 AddressOf 运算符在 Basic 内的
过程之间传递一个过程的指针时,被调用过程的参数类型必须定义为 As Long.
警告 如果不能完全理解函数回调的概念,则使用 AddressOf 运算符可能会导致意
想不到的结果.必须理解回调的 Basic 部份是如何工作的,以及接受所传递的函数地址
的 DLL 的代码是如何工作的.调试这样的交互操作是非常困难的,因为该程序和开发环
境运行在相同的进程中.在某些情况下,系统的调试也许是不可能的.
注意 可以使用 Microsoft Visual C++ (或者类似的工具)编译的 DLLs 来创建自
己的回调函数原型.要使用 AddressOf 运算符来工作,您的原型必需使用 __stdcall 调
用约定.缺省的调用约定 (__cdecl) 不能与 AddressOf 运算符一起工作.
因为一个回调的调用程序不在用户自己的程序中,所以很重要的一点是要保证回调
过程中的错误不被回传到调用者.可以通过把 On Error Resume Next 语句放置于回调过
程的起始处来达到这个要求.
AddressOf 运算符示例
下面的示例创建一个带有一个列表框的窗体,该列表框包含您的系统中的字体的按
字母顺序排序的列表.
要运行该示例,请创建一个带有一个列表框的窗体.窗体部分的代码如下:
Option Explicit
Private Sub Form_Load()
Module1.FillListWithFonts List1
End Sub
把下面的代码放置到一个模块中.EnumFontFamilies 函数定义中的第三个参数是一
个长整形,它代表一个过程.该参数必须包含这个过程的地址,而不是这个过程的返回值.
78
在对 EnumFontFamilies 的调用中,第三个参数需要 AddressOf 运算符来返回
EnumFontFamProc 过程的地址,该过程是当调用 Windows API 函数,即 EnumFontFamilies
时提供的回调过程的名称.当把 AddressOf EnumFontFamProc 传递给 EnumFontFamilies
时, Windows 就会为系统中的每一个字体库调用一次 EnumFontFamProc.传递给
EnumFontFamilies 的最后一个参数指定用来显示信息的列表框.
'字体枚举类型
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Type NEWTEXTMETRIC
tmHeight As Long
tmAscent As Long
tmDescent As Long
tmInternalLeading As Long
tmExternalLeading As Long
tmAveCharWidth As Long
tmMaxCharWidth As Long
tmWeight As Long
tmOverhang As Long
tmDigitizedAspectX As Long
tmDigitizedAspectY As Long
tmFirstChar As Byte
tmLastChar As Byte
tmDefaultChar As Byte
tmBreakChar As Byte
tmItalic As Byte
79
tmUnderlined As Byte
tmStruckOut As Byte
tmPitchAndFamily As Byte
tmCharSet As Byte
ntmFlags As Long
ntmSizeEM As Long
ntmCellHeight As Long
ntmAveWidth As Long
End Type
' ntmFlags 段标志
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&
'tmPitchAndFamily 标志
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4
Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0
'EnumFonts 掩码
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4
Declare Function EnumFontFamilies Lib "gdi32" Alias _
"EnumFontFamiliesA" _
(ByVal hDC As Long, ByVal lpszFamily As String, _
ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
ByVal hDC As Long) As Long
Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _
ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
EnumFontFamProc = 1
End Function
Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
80
LB.Clear
hDC = GetDC(LB.hWnd)
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
ReleaseDC LB.hWnd, hDC
End Sub
9,了解变体
当声明常数,变量或参数时,若无指定数据类型则会自动的指定成 Variant 数据类
型.声明成 Variant 数据类型的变量包含有字符串,日期,时间,Boolean或数值,并且
它们自动包含的值会转换.数值型 Variant 值需要 16 字节的内存(此点只有在大型的
过程或复杂的模块才较具意义),并且在访问时会比任何显示地定义的数据类型来得慢.
很少使用 Variant 数据类型来表示常数字符串 Variant 值需要 22 字节的内存.
下面的语句创建一个 Variant 变量:
Dim myVar
Dim yourVar As Variant
theVar = "This is some text."
最后的语句中并没有显示地声明变量 theVar,但是会声明隐含性的或自动性的变
量.所谓隐含性的声明变量就是指定成 Variant 数据类型.
提示 如果指定了变量或参数的数据类型,但却使用了错误的数据类型,如此则会发
生数据类型错误.不管使用隐含性的变量(Variant 数据类型)或是显示地声明所有的变
量并指定数据类型,都要避免数据类型错误.一般较喜欢用后者.
10,写赋值语句
赋值语句指定一个值或表达式给变量或常数.赋值语句通常会包含一个等号(=).
下面示例,指定 InputBox 函数的返回值给变量 yourName.
Sub Question()
Dim yourName As String
yourName = InputBox("What is your name ")
MsgBox "Your name is " & yourName
End Sub
Let 语句是可选的,而通常为省略.例如,上述的赋值语句可以写成:
Let yourName = InputBox("What is your name ")
Set 语句可被用来指定一个对象给已声明成对象的变量.而 Set 关键字是必备的.
下面示例中,Set 语句指定 Sheet1 上的一个范围给对象变量 myCell:
Sub ApplyFormat()
Dim myCell As Range
Set myCell = Worksheets("Sheet1").Range("A1")
With myCell.Font
.Bold = True
.Italic = True
End With
End Sub
81
设置属性值的语句也是一个赋值语句.下面的示例,将设置对于活动单元格 Font 对
象的 Bold 属性:
ActiveCell.Font.Bold = True
11,写可执行的语句
一个可执行的语句初始化动作.它可以执行一个方法或者函数,并且可以循环或从
代码块中分支执行.可执行的的语句通常包含数学的或条件运算符.
下面的示例使用 For Each...Next 语句来重复名称为 MyRange 范围内的每个单元