一,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 更新所有远程引用和外部引用.
设置 当 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 属性
在使用 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) 多个对象
三,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 范围内的每个单元