Excel+VBA帮助

 目录 一、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、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、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 过程 四、 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、用户窗体窗口 清风读月 一、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() Sh

eets(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 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:\Re

ports\1997_Q4.htm”以便进行编辑。 Workbooks.Open Filename:="C:\Reports\1997_Q4.htm" 打开文件后,就可以通过设置 DefaultWebOptions 和 WebOptions 对象的属性自定义该 HTML 文档的外观、内容、浏览 器支持、编辑支持、图象格式、屏幕分辨率、文件组织和编码。 7、用 A1 样式的记号引用单元格和单元格区域 可在 Range 方法中以 A1 样式的记号引用单元格和单元格区 域。下述 Sub 过程将单元格区域 A1:D5 的字体设置为加粗。 Sub FormatRange() Workbooks("Book1").Sheets("Sheet1").Range("A1:D5") _ .Font.Bold = True End Sub 下表演示了用于 Range 方法的一些 A1-样式的引用。 引用 Range("A1") Range("A1:B5") 含义 单元格“A1” 从 单 元 格 “A1” 到 单 元 格 清风读月 “B5”的区域 Range("C5:D9,G9:H16") Range("A:A") Range("1:1") Range("A:C") Range("1:5") Range("1:1,3:3,8:8") Range("A:A,C:C,F: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 多块的选定区域 “A”列 第一行 从“A”列到“C”列的区域 从第一行到第五行的区域 第 1、3 和 8 行 “A”列、“C”列和“F”列 清风读月 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 行 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 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”上的单元格区域“A1:D5”赋予该变量。随后的语句用该变 量代替该区域

对象,以修改该区域的属性。 Sub Random() 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 属性引用选定的单个单元格区域或多块的选定区 域集合。下述过程计算选定区域内的块数目,如果选定区域中有多个 块,就显示警告消息。 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 Su

b 在单元格区域中循环的另一种简便方法是使用 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) < 0.01 Then c.Value = 0 Next End Sub 17、选定和激活单元格 使用 Microsoft Excel 时,通常要先选定单元格或单元格区域, 然后执行某一操作,如设置单元格的格式,或在单元格中输入数值。 但在 Visual Basic 中,在修改单元格之前,通常不必先选定它们。 清风读月 例如,如果要用 Visual Basic 在单元格“D6”中输入公式,就不 需要先选定单元格“D6”,而只需返回该 Range 对象,然后将该对象 的 Formula 属性设置为所需的公式,如下例所示。 Sub EnterFormula() Worksheets("Sheet1").Range("D6").Formula = "=SUM(D2:D5)" End Sub 如果要查阅使用其他方法不选定单元格就控制它们的示例,请 参阅“如何引用单元格和区域”。 使用 Select 方法和 Selection 属性 Select 方法激活工作表和工作表上的对象;而 Selection 属性 返回代表活动工作簿中活动工作表上的当前选定区域的对象。 在使用 Selection 属性之前,必须先激活工作簿,用 Select 方法激活或选定 工作表,然后再选定单元格区域(或其他对象)。 宏记录器经常创建使用 Select 方法和 Selection 属性的宏。 下 述 Sub 过程是用宏记录器创建的,该过程演示了如何共用 Select 方法和 Selection 属性。 Sub Macro1() Sheets("Sheet1").Select Range("A1").Select ActiveCell.FormulaR1C1 = "Name" Range("B1").Select ActiveCell.FormulaR1C1 = "Address" 清风读月 Range("A1:B1").Select Selection.Font.Bold = True End Sub 下例完成同样的功能,但不用激活或选定工作表或单元格。 Sub Labels() With Worksheets("Sheet1") .Range("A1") = "Name" .Range("B1") = "Address" .Range("A1:B1").Font.Bold = True End With End Sub 选定活动工作表上的单元格 如果用 Select 方法选定单元格,就应注意 Select 方法仅用于 活动工作表。从模块中运行 Sub 过程时,必须先在该过程中激活工 作表,然后才能用 Select 方法选定单元格区域,否则该方法将失败。 例如,下述过程在活动

工作簿中将工作表“Sheet1”中的一行复制到工 作表“Sheet2”上。 Sub CopyRow() Worksheets("Sheet1").Rows(1).Copy Worksheets("Sheet2").Select Worksheets("Sheet2").Rows(1).Select Worksheets("Sheet2").Paste 清风读月 End Sub 激活选定区域内的单元格 可用 Activate 方法激活选定区域内的单元格。 即便选定了单元 格区域, 也只能有一个活动单元格。 下述过程选定了一个单元格区域, 然后激活该区域内的一个单元格,但并不改变选定区域。 Sub MakeActive() Worksheets("Sheet1").Activate Range("A1:D4").Select Range("B2").Activate End Sub 18、处理三维区域 如果要处理若干工作表上同一位置的单元格区域,可用 Array 函数同时选定两张或多张工作表。 下例设置三维单元格区域的边框格 式。 Sub FormatSheets() Sheets(Array("Sheet2", "Sheet3", "Sheet5")).Select Range("A1:H1").Select Selection.Borders(xlBottom).LineStyle = xlDouble End Sub 下例应用 FillAcrossSheets 方法,在活动工作簿中,将工作表 “Sheet2”上单元格区域的格式和数据复制到该工作簿中所有工作表上 的相应区域中。 清风读月 Sub FillAll() Worksheets("Sheet2").Range("A1:H1") _ .Borders(xlBottom).LineStyle = xlDouble Worksheets.FillAcrossSheets (Worksheets("Sheet2") _ .Range("A1:H1")) End Sub 19、处理活动单元格 ActiveCell 属性返回代表活动单元格的 Range 对象。可对活 动单元格应用 Range 对象的任意属性和方法,如下例所示。 Sub SetValue() Worksheets("Sheet1").Activate ActiveCell.Value = 35 End Sub 注意 只有活动单元格所在的工作表处于活动状态时, 才能处理 该活动单元格。 移动活动单元格 可用 Activate 方法设置活动单元格。 例如, 下述过程使单元格 “B5”成为活动单元格,然后将其字体设置为加粗。 Sub SetActive() Worksheets("Sheet1").Activate Worksheets("Sheet1").Range("B5").Activate ActiveCell.Font.Bold = True 清风读月 End Sub 注意 如果要选定单元格区域,可用 Select 方法。如果要使单 个单元格成为活动单元格,则要用 Activate 方法。 可用 Offset 属性来移动活动单元格。下述过程在选定区域内 的活动单元格中插入文字,然后将活动单元格右移一列,但并不改变 选定区域。 Sub MoveActive() Worksheets("Sheet1").Activate Range("A1:D10").Select ActiveCell.Value = "Monthly Totals" ActiveCell.Offset(0, 1).Activate End Sub 选择活动单元格周围的单元格 CurrentRegion 属性返回由空白行和空白列所包围的单元格区 域。下例中,选定区域扩充到与活动单元格相邻的包含数据的所有单 元格,然后用“货币”样式设置扩充后的区域的格式。 Sub Region() Worksheets("Sheet1").Activate ActiveCell.CurrentRegion.Select Selection.Style = "Currency" End Sub 20、在工作表上使用 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 工作簿时,将丢失 ActiveX 控件信息。 在工作表上 ActiveX 控件的事件处理过程中,Me 关 键字所指向的是工作表,而非控件。 用 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 通过 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 使用 Shapes 和 OLEObjects 集合的控件名称 工作表上的 ActiveX 控件具有两个名称: 其一是包含该控件的 形状的名称,当查看工作表时,可在“Name”框中看到此名称;其二 是控件的代码名称,在“属性”窗口的“(名称)”框右边的单元格中可 看到此名称。第一次向工作表中添加控件时,形状名称和代码名称是 相同的。但是,如果更改其中之一(形状名称或代码名称),另一个 名称并不会自动随之更改。 对于控件的事件过程,其名称中所使用的是控件的代码名称。 但是,当从工作表的 Shapes 或 OLEObjects 集合中返回控件时, 必须使用形状名称 (而不是代码名称) 以便按名称引用控件。 , 例如, 假设向工作表中添加了一个复选框, 其默认形状名称和默认代码名称 都是“CheckBox1”。如果此后在“属性”窗口的“(名称)”旁键入了 “chkFinished”,从而将控件的代码名称更改为“chkFinished”,则在事 件过程名称中必须使用 chkFinished,而仍然应使用 CheckBox1 从 Shapes 或 OLEObject 集合中返回控件,如下例所示。 Private Sub chkFinished_Click() 清风读月 ActiveSheet.OLEObjects("CheckBox1").Object.Value = 1 End Sub 21、在文档中使用 ActiveX 控件 就如同可向自定义对话框中添加 ActiveX 控件一样, 也可向文 档直接添加控件,从而可以为用户提供直接同宏打交道的的手段,而 使用户不必被对话框所干扰。可用下列过程向文档添加 ActiveX 控 件。有关在 Microsoft Excel 中使用 ActiveX 控件的特定信息,请参 阅在工作表上使用 ActiveX 控件。 1)向文档中添加控件 显示“控件工具箱”,单击要添加的控件,然后单击文档。 2)置控件的属性 在设计模式下, 用右键单击该控件, 然后单击快捷菜单内 的“属性”命令以显示属性窗口。 3)始化控件 可在某一过程中初始化控件。 4)编写事件过程 所有的控件都有一系列的预定义事件。 例如, 当用户单击 命

令按钮时,该命令按钮就引发一个 Click 事件。可以编写事 件发生时所运行的事件处理过程。 5)码运行时使用控件的值 有些属性可在运行时进行设置。 22、创建自定义对话框 清风读月 可用下述过程创建自定义对话框。 1)创建用户窗体 在 Visual Basic 编辑器中,单击“插入”菜单内的“添加用 户窗体”命令。 2)向用户窗体中添加控件 在“工具箱”中找到要添加的控件,并将其拖到窗体中。 3)设置控件的属性 在设计模式下, 用右键单击该控件, 然后单击快捷菜单内 的“属性”命令以显示属性窗口。 4)初始化控件 可在窗体显示之前的某一过程中初始化控件, 或者在窗体 的 Initialize 事件中添加初始化代码。 5)编写事件过程 所有的控件都有一系列的预定义事件。 例如, 当用户单击 命令按钮时,该命令按钮就引发一个 Click 事件。可以编写事 件发生时所运行的事件处理过程。 6)显示对话框 可用 Show 方法显示用户窗体。 7)代码运行时使用控件的值 有些属性可在运行时进行设置。用户对对话框所作的修 改,在对话框关闭后将丢失。 23、在窗体上使用 Microsoft Office Web 组件 清风读月 在 Visual Basic 或 Visual Basic for Applications 中,可以向用 户窗体中添加 Microsoft Office Web 组件, 其方法与向用户窗体中添 加任何其他 ActiveX 控件相同。注意,虽然在设计窗体时可以使用 “属性工具箱”,但却不能在运行时从模式窗体或对话框中的 Microsoft Office Web 组件中显示“属性工具箱”。对于在非 Visual Basic 或 Visual Basic for Applications 以外的其他设计环境中所创建 的模式窗体,此情况同样适用。 可以使用 ShowModal 属性将窗体设置为无模式。 24、内置对话框参数表 对话框常量 xlDialogActivate xlDialogActiveCellFont 参数表 window_text, pane_num font, font_style, size, strikethrough, superscript, subscript, outline, shadow, underline, color, normal, char_count xlDialogAddChartAutofor mat xlDialogAddinManager operation_num, addinname_text, copy_logical name_text, desc_text background, start_char, 清风读月 xlDialogAlignment horiz_align, wrap, vert_align, orientation, add_indent xlDialogApplyNames name_array, use_rowcol, omit_col, ignore, omit_row, order_num, append_last xlDialogApplyStyle xlDialogAppMove xlDialogAppSize xlDialogArrangeAll style_text x_num, y_num x_num, y_num arrange_num, sync_horiz, sync_vert xlDialogAssignToObject xlDialogAssignToTool xlDialogAttachText macro_ref bar_id, position, macro_ref attach_to_num, point_num xlDialogAttachToolbars xlDialogAutoCorrect correct_initial_caps, capitalize_days xlDialogAxes x_primary, y_primary, series_num, active_doc, 清风读月 x_secondary, y_secondary xlDialogAxes x_primary, z_pr

imary xlDialogBorder shade, outline, left, right, top, bottom, outline_color, left_color, y_primary, right_color, top_color, bottom_color xlDialogCalculation type_num, max_change, iter, update, max_num, precision, date_1904, calc_save, save_values, alt_exp, alt_form xlDialogCellProtection xlDialogChangeLink locked, hidden old_text, type_of_link xlDialogChartAddData ref, rowcol, titles, categories, replace, series xlDialogChartLocation xlDialogChartOptionsData Labels xlDialogChartOptionsData new_text, 清风读月 Table xlDialogChartSourceData xlDialogChartTrend type, backcast, ord_per, intercept, forecast, equation, r_squared, name xlDialogChartType xlDialogChartWizard long, type_num, ref, plot_by, gallery_num, categories, ser_titles, legend, title, x_title, y_title, z_title, number_cats, number_titles xlDialogCheckboxProperti es xlDialogClear xlDialogColorPalette xlDialogColumnWidth value, link, accel_text, accel2_text, 3d_shading type_num file_text width_num, reference, standard, type_num, standard_num xlDialogCombination xlDialogConditionalForma tting type_num 清风读月 xlDialogConsolidate source_refs, function_num, top_row, left_col, create_links xlDialogCopyChart xlDialogCopyPicture size_num appearance_num, type_num xlDialogCreateNames xlDialogCreatePublisher top, left, bottom, right file_text, formats xlDialogCustomizeToolbar xlDialogCustomViews xlDialogDataDelete xlDialogDataLabel show_option, show_key xlDialogDataSeries rowcol, type_num, date_num, step_value, stop_value, trend xlDialogDataValidation xlDialogDefineName name_text, refers_to, auto_text, category appearance, size, size_num, macro_type, shortcut_text, hidden, 清风读月 category, local xlDialogDefineStyle style_text, number, font, alignment, border, pattern, protection xlDialogDefineStyle style_text, additional_def_args, …… xlDialogDeleteFormat xlDialogDeleteName xlDialogDemote xlDialogDisplay format_text name_text row_col formulas, gridlines, headings, zeros, color_num, reserved, outline, page_breaks, object_num xlDialogDisplay cell, formula, value, format, protection, names, precedents, attribute_num, dependents, note xlDialogEditboxProperties validation_num, multiline_logical, password_logical xlDialogEditColor color_num, green_value, blue_value red_value, vscroll_logical, 清风读月 xlDialogEditDelete xlDialogEditionOptions shift_num edition_type, edition_name, reference, option, appearance, size, formats xlDialogEditSeries series_num, name_ref, x_ref, y_ref, z_ref, plot_order xlDialogErrorbarX xlDialogErrorbarY xlDialogExternalDataProp erties xlDialogExtract xlDialogFileDelete xlDialogFileSharing xlDialogFillGroup xlDialogFillWorkgroup xlDialogFilter xlDialogFilterAdvanced operation, list_ref, criteria_ref, copy_ref, unique type_num type_num unique file_text include, type, amount, minus include, type, amount, minus 清风读月 xlDialogFindFil

e xlDialogFont xlDialogFontProperties name_text, size_num font, font_style, size, strikethrough, superscript, subscript, outline, shadow, underline, color, normal, char_count xlDialogFormatAuto format_num, number, font, background, start_char, alignment, border, pattern, width xlDialogFormatChart angle, layer_num, view, overlap, gap_depth, doughnut_size, drop, hilo, up_down, gap_width, chart_depth, axis_num, series_line, labels, vary xlDialogFormatCharttype apply_to, dimension, type_num xlDialogFormatFont color, backgd, apply, group_num, name_text, size_num, bold, italic, underline, strike, outline, shadow, object_id, start_num, char_num 清风读月 xlDialogFormatFont name_text, size_num, bold, italic, underline, strike, color, outline, shadow xlDialogFormatFont name_text, size_num, bold, italic, underline, strike, color, outline, shadow, object_id_text, start_num, char_num xlDialogFormatLegend xlDialogFormatMain position_num type_num, view, overlap, gap_width, vary, drop, hilo, angle, gap_depth, chart_depth, up_down, series_line, labels, doughnut_size xlDialogFormatMove xlDialogFormatMove xlDialogFormatMove xlDialogFormatNumber xlDialogFormatOverlay x_offset, y_offset, reference x_pos, y_pos explosion_num format_text type_num, view, overlap, gap_width, vary, drop, hilo, angle, series_dist, series_num, up_down, 清风读月 series_line, labels, doughnut_size xlDialogFormatSize xlDialogFormatSize xlDialogFormatText width, height x_off, y_off, reference x_align, y_align, orient_num, auto_text, auto_size, show_key, show_value, add_indent xlDialogFormulaFind text, in_num, at_num, by_num, dir_num, match_case, match_byte xlDialogFormulaGoto xlDialogFormulaReplace reference, corner find_text, replace_text, look_at, look_by, match_byte xlDialogFunctionWizard xlDialogGallery3dArea xlDialogGallery3dBar xlDialogGallery3dColumn xlDialogGallery3dLine xlDialogGallery3dPie type_num type_num type_num type_num type_num active_cell, match_case, 清风读月 xlDialogGallery3dSurface xlDialogGalleryArea xlDialogGalleryBar xlDialogGalleryColumn xlDialogGalleryCustom xlDialogGalleryDoughnut xlDialogGalleryLine xlDialogGalleryPie xlDialogGalleryRadar xlDialogGalleryScatter xlDialogGoalSeek type_num type_num, delete_overlay type_num, delete_overlay type_num, delete_overlay name_text type_num, delete_overlay type_num, delete_overlay type_num, delete_overlay type_num, delete_overlay type_num, delete_overlay target_cell, variable_cell target_value, xlDialogGridlines x_major, x_minor, y_major, y_minor, z_major, z_minor, 2D_effect xlDialogImportTextFile xlDialogInsert xlDialogInsertHyperlink shift_num 清风读月 xlDialogInsertNameLabel xlDialogInsertObject object_class, link_logical, file_name, display_icon_logical, icon_file, icon_number, icon_label xlDialogInsertPicture xlDialogInsertTitle file_name, filter_number cha

rt, y_primary, x_primary, y_secondary, x_secondary xlDialogLabelProperties accel_text, 3d_shading xlDialogListboxProperties range, link, drop_size, accel2_text, multi_select, 3d_shading xlDialogMacroOptions macro_name, description, menu_on, menu_text, shortcut_on, shortcut_key, function_category, status_bar_text, help_id, help_file xlDialogMailEditMailer to_recipients, cc_recipients, bcc_recipients, subject, enclosures, which_address xlDialogMailLogon name_text, password_text, 清风读月 download_logical xlDialogMailNextLetter xlDialogMainChart type_num, stack, 100, vary, overlap, drop, hilo, overlap%, cluster, angle xlDialogMainChartType xlDialogMenuEditor xlDialogMove xlDialogNew x_pos, y_pos, window_text type_num, add_logical xlDialogNewWebQuery xlDialogNote add_text, cell_ref, start_char, num_chars xlDialogObjectProperties xlDialogObjectProtection xlDialogOpen placement_type, print_object locked, lock_text file_text, read_only, write_res_pwd, format, update_links, prot_pwd, ignore_rorec, xy_series, type_num 清风读月 file_origin, add_logical, custom_delimit, editable, file_access, notify_logical, converter xlDialogOpenLinks document_text1, document_text2, type_of_link xlDialogOpenMail xlDialogOpenText subject, comments file_name, start_row, file_type, file_origin, text_qualifier, ……, read_only, consecutive_delim, tab, semicolon, comma, field_info xlDialogOptionsCalculatio n type_num, max_change, iter, update, max_num, precision, space, other, other_char, date_1904, calc_save, save_values xlDialogOptionsChart display_blanks, size_with_window xlDialogOptionsEdit incell_edit, drag_drop, alert, entermove, copy_objects, fixed, decimals, update_links, plot_visible, 清风读月 move_direction, animations xlDialogOptionsGeneral R1C1_mode, sum_info, old_menus, font_size, alternate_location, enable_under xlDialogOptionsListsAdd xlDialogOptionsListsAdd xlDialogOptionsME string_array tips, autocomplete, dde_on, recent_files, font_name, user_info, default_location, sheet_num, import_ref, by_row def_rtl_sheet, show_ctrl_char, gui_lang crsr_mvmt, xlDialogOptionsTransition menu_key, menu_key_action, nav_keys, trans_eval, trans_entry xlDialogOptionsView formula, status, notes, show_info, object_num, page_breaks, formulas, gridlines, color_num, headers, outline, zeros, hor_scroll, vert_scroll, sheet_tabs xlDialogOutline auto_styles, row_dir, col_dir, 清风读月 create_apply xlDialogOverlay type_num, stack, 100, vary, overlap, drop, hilo, overlap%, cluster, angle, series_num, auto xlDialogOverlayChartType xlDialogPageSetup type_num head, foot, left, right, top, bot, hdng, grid, h_cntr, v_cntr, orient, paper_size, scale, pg_num, pg_order, bw_cells, quality, head_margin, foot_margin, notes, draft xlDialogPageSetup size, head, foot, left, right, top, bot, h_cntr, v_cntr, orient, paper_size, scale, pg_num, bw_c

hart, quality, head_margin, foot_margin, draft xlDialogPageSetup head, foot, left, right, top, bot, orient, paper_size, scale, quality, head_margin, foot_margin, pg_num xlDialogParse xlDialogPasteNames parse_text, destination_ref 清风读月 xlDialogPasteSpecial paste_num, skip_blanks, transpose operation_num, xlDialogPasteSpecial rowcol, replace, series titles, categories, xlDialogPasteSpecial xlDialogPasteSpecial paste_num format_text, pastelink_logical, display_icon_logical, icon_number, icon_label icon_file, xlDialogPatterns xlDialogPatterns apattern, afore, aback, newui lauto, lstyle, lcolor, lwt, hwidth, hlength, htype xlDialogPatterns bauto, bstyle, bcolor, bwt, shadow, aauto, apattern, afore, aback, rounded, newui xlDialogPatterns bauto, bstyle, bcolor, bwt, shadow, aauto, apattern, afore, aback, invert, apply, newfill xlDialogPatterns lauto, lstyle, lcolor, lwt, tmajor, tminor, tlabel 清风读月 xlDialogPatterns lauto, lstyle, lcolor, lwt, apply, smooth xlDialogPatterns lauto, lstyle, lcolor, lwt, mauto, mstyle, mfore, mback, apply, smooth xlDialogPatterns xlDialogPhonetic xlDialogPivotCalculatedFi eld type, picture_units, apply xlDialogPivotCalculatedIte m xlDialogPivotClientServer Set xlDialogPivotFieldGroup xlDialogPivotFieldProperti es start, end, by, periods name, new_name, formats xlDialogPivotFieldUngrou p pivot_field_name, orientation, function, 清风读月 xlDialogPivotShowPages xlDialogPivotSolveOrder xlDialogPivotTableOptions xlDialogPivotTableWizard name, page_field type, source, destination, name, row_grand, col_grand, save_data, auto_page, apply_auto_format, reserved xlDialogPlacement xlDialogPrint placement_type range_num, from, to, copies, draft, preview, print_what, color, feed, quality, y_resolution, selection, printer_text, print_to_file, collate xlDialogPrinterSetup xlDialogPrintPreview xlDialogPromote xlDialogProperties rowcol title, subject, author, keywords, comments xlDialogProtectDocument contents, windows, password, objects, scenarios printer_text 清风读月 xlDialogProtectSharing xlDialogPublishAsWebPag e xlDialogPushbuttonPropert ies default_logical, cancel_logical, dismiss_logical, accel_text, accel_text2 xlDialogReplaceFont font_num, size_num, name_text, help_logical, bold, italic, underline, strike, color, outline, shadow xlDialogRoutingSlip recipients, subject, message, route_num, status_logical xlDialogRowHeight height_num, standard_height, type_num xlDialogRun xlDialogSaveAs reference, step document_text, type_num, reference, return_logical, prot_pwd, backup, write_res_pwd, read_only_rec xlDialogSaveCopyAs document_text 清风读月 xlDialogSaveNewObject xlDialogSaveWorkbook document_text, type_num, prot_pwd, backup, write_res_pwd, read_only_rec xlDialogSaveWorkspace xlDialogScale name_t

ext cross, cat_labels, cat_marks, between, max, reverse xlDialogScale min_num, max_num, major, minor, cross, logarithmic, reverse, max xlDialogScale cat_labels, cat_marks, reverse, between xlDialogScale series_labels, reverse xlDialogScale min_num, max_num, major, minor, cross, logarithmic, reverse, min xlDialogScenarioAdd scen_name, value_array, series_marks, changing_ref, scen_comment, locked, 清风读月 hidden xlDialogScenarioCells xlDialogScenarioEdit changing_ref scen_name, value_array, new_scenname, changing_ref, scen_comment, locked, hidden xlDialogScenarioMerge xlDialogScenarioSummary xlDialogScrollbarPropertie s xlDialogSelectSpecial xlDialogSendMail source_file result_ref, report_type value, min, max, inc, page, link, 3d_shading type_num, value_type, levels recipients, return_receipt xlDialogSeriesAxes xlDialogSeriesOptions xlDialogSeriesOrder chart_num, new_series_num xlDialogSeriesShape xlDialogSeriesX x_ref old_series_num, axis_num subject, 清风读月 xlDialogSeriesY xlDialogSetBackgroundPic ture xlDialogSetPrintTitles name_ref, y_ref titles_for_cols_ref, titles_for_rows_ref xlDialogSetUpdateStatus xlDialogShowDetail link_text, status, type_of_link rowcol, rowcol_num, expand, show_field xlDialogShowToolbar bar_id, visible, dock, x_pos, y_pos, width, protect, tool_tips, large_buttons, color_buttons xlDialogSize xlDialogSort width, height, window_text orientation, key1, order1, key2, order2, key3, order3, header, custom, case xlDialogSort orientation, key1, order1, type, custom xlDialogSortSpecial sort_by, method, key1, order1, key2, order2, key3, order3, header, 清风读月 order, case xlDialogSplit xlDialogStandardFont col_split, row_split name_text, size_num, bold, italic, underline, strike, color, outline, shadow xlDialogStandardWidth xlDialogStyle xlDialogSubscribeTo xlDialogSubtotalCreate total, standard_num bold, italic file_text, format_num at_change_in, replace, function_num, pagebreaks, summary_below xlDialogSummaryInfo title, subject, author, keywords, comments xlDialogTable xlDialogTabOrder xlDialogTextToColumns destination_ref, data_type, row_ref, column_ref text_delim, consecutive_delim, tab, semicolon, comma, space, other, other_char, field_info 清风读月 xlDialogUnhide xlDialogUpdateLink xlDialogVbaInsertFile xlDialogVbaMakeAddIn xlDialogVbaProcedureDefi nition xlDialogView3d window_text link_text, type_of_link filename_text elevation, perspective, rotation, axes, height%, autoscale xlDialogWebOptionsEncod ing xlDialogWebOptionsFiles xlDialogWebOptionsFonts xlDialogWebOptionsGener al xlDialogWebOptionsPictur es xlDialogWindowMove xlDialogWindowSize x_pos, y_pos, window_text width, height, window_text 清风读月 xlDialogWorkbookAdd name_array, position_num dest_book, xlDialogWorkbookCopy name_array, position_num dest_book, xlDialogWorkbookInsert xlDialog

WorkbookMove type_num name_array, position_num dest_book, xlDialogWorkbookName xlDialogWorkbookNew xlDialogWorkbookOptions oldname_text, newname_text sheet_name, new_name bound_logical, xlDialogWorkbookProtect xlDialogWorkbookTabSplit xlDialogWorkbookUnhide xlDialogWorkgroup xlDialogWorkspace structure, windows, password ratio_num sheet_text name_array fixed, decimals, r1c1, scroll, status, formula, menu_key, remote, entermove, underlines, tools, notes, 清风读月 nav_keys, menu_key_action, drag_drop, show_info xlDialogZoom magnification 25、使用 Microsoft Excel 对象的事件 可在 Microsoft Excel 中编写工作表级、图表级、查询表级、工 作簿级或应用程序级的事件处理过程。例如,Activate 事件发生在工 作表级,而 SheetActivate 事件既可发生在工作簿级,也可发生在应 用程序级。 工作簿的 SheetActivate 事件发生在激活该工作簿中的任 一工作表时, 而应用程序级的 SheetActivate 事件发生在任一打开的 工作簿中的任一工作表被激活时。 工作表、图表工作表和工作簿事件处理过程对任意打开的工作 表或工作簿都有效。如果要为嵌入式图表、查询表或 Application 对 象编写事件处理过程, 则必须在类模块中用 WithEvents 关键字创建 新的对象。 可用 EnableEvents 属性激活或禁用事件。 例如, 使用 Save 方 法保存工作表时,将引发 BeforeSave 事件。可在调用 Save 方法之 前将 EnableEvents 属性设置为 False,以防止该事件的引发。 Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True 26、在 Visual Basic 中使用 Microsoft Excel 工作表函数 清风读月 在 Visual Basic 语句中可以使用大多数 Microsoft Excel 工作 表函数。有关可以使用的工作表函数列表,请参阅 “Visual Basic 可 使用的工作表函数列表”。 注意一些工作表函数在 Visual Basic 中是不实用的。例如: Concatenate 就不需要。因为在 Visual Basic 中可以用 & 运算符来 连接多重文本值。 从 Visual Basic 中调用工作表函数 在 Visual Basic 中,Microsoft Excel 可以通过 WorksheetFunction 对象来使用工作表函数。 以下 Sub 过程使用 Min 工作表函数来决定在一个单元格范 围中的最小值。首先,变量 myRange 被声称为 Range 对象,然后 被加在“Sheet1”的“A1:C10”范围内。另一个变量,answer 被指定为将 Min 函数应用到 myRange 的结果。最后,answer 的值就被显示在 信息框中。 Sub UseFunction() Dim myRange As Range Set myRange = Worksheets("Sheet1").Range("A1:C10") answer = Application.WorksheetFunction.Min(myRange) MsgBox answer End Sub 如果您使用的工作表函数需要一个引用范围作为参数,则必须 指定 Range 对象,例如: 您可以用 Match 工作表函数搜索单元格 清风读月

的范围。可以在工作表单元格中键入公式,如 “=MATCH(9,A1:A10,0)”。但是,您可以在 Visual Basic 过程中指定 Range 对象以获得相同结果。 Sub FindFirst() myVar = Application.WorksheetFunction _ .Match(9, Worksheets(1).Range("A1:A10"), 0) MsgBox myVar End Sub 注意 Visual Basic 函数不使用 WorksheetFunction 识别符。 函 数可能和 Microsoft Excel 的函数同名但工作各异。例如: Application.WorksheetFunction.Log 和 Log 将返回不同的值。 在单元格中插入工作表函数 要在单元格中插入工作表函数,您需要指定函数作为相应的 Range 对象的 Formula 属性值。以下示例中,RAND 工作表函数 (由它生成随机数字) 被分配到活动工作簿的“Sheet1”的“A1:B3”范围 的 Formula 属性中。 Sub InsertFormula() Worksheets("Sheet1").Range("A1:B3").Formula = "=RAND()" End Sub 27、处理形状(图形对象) 形状,或者说图形对象,可由三种不同类型的对象来代表: Shapes 集合,ShapeRange 集合和 Shape 对象。通常情况下,可用 清风读月 Shapes 集合创建形状,并在给定工作表上的所有形状中进行循环; 可用 Shape 对象修改单个形状或设置单个形状的格式;而用 ShapeRange 集合可同时修改多个形状,就像在用户界面上处理多个 形状一样。 设置形状的属性 形状许多格式属性不是直接用 Shape 对象或 ShapeRange 对 象的属性来设置的。相反,相互有关的形状属性组织在次级对象中, 如包含所有关于形状填充格式的属性的 FillFormat 对象,或包含所 有特定于链接的 OLE 对象属性的 LinkFormat 对象。如果要设置 形状的属性,就必须先返回代表一系列相关的形状属性的对象,然后 设置所返回的对象的属性。例如,如果要设置指定形状的前景填充颜 色,就必须先用 Fill 属性返回 FillFormat 对象,然后再设置 FillFormat 对象的 ForeColor 属性,如下例所示。 Worksheets(1).Shapes(1).Fill.ForeColor.RGB = RGB(255, 0, 0) 同时对若干形状应用属性或方法 在用户界面上, 可以对若干选定形状同时执行某些操作;例如, 可以选定若干形状,然后同时设置每个形状的填充格式。但有些操作 只能对单个形状执行;例如,一次只能编辑一个形状中的文字。 在 Visual Basic 中,可用两种方式对一系列形状同时应用属性 和方法。用这两种方式,可像对单个形状执行操作那样对若干形状同 时执行操作,而不论该操作是否可在用户界面上执行。 如果可在用户界面上对若干选定的形状执行该操作, 那 清风读月 么 在 Visual Basic 中 , 可 通 过 构 造 包 含 要 处 理 的 形 状 的 ShapeRange 集合,并直接对该 ShapeRange 集合应用适当的 属性和方法,来执行同一操作。 如果不能在用户界面上对若干选

定的形状同时执行该 操作,那么在 Visual Basic 中,仍可通过下述方法来执行该操 作: 在包含要处理的形状的 Shapes 集合或 ShapeRange 集合 中循环,对集合中每个单独的 Shape 对象应用适当的属性和 方法。 许多应用于 Shape 对象和 ShapeRange 集合的属性和方法, 如果应用到特定类型的形状时将失败。例如,将 TextFrame 属性应 用于不能包含文字的形状时,该属性就将失败。如果不能确定 ShapeRange 集合中的每个形状都能应用某一特定的属性或方法,就 不要对 ShapeRange 集合应用该属性或方法。如果要对某一集合内 的形状应用这种类型的属性或方法,就必须在该集合中循环,并在对 每个形状应用该属性或方法之前, 检测该形状是否属于能够应用该属 性或方法的类型。 创建包含工作表上所有形状的 ShapeRange 集合 可通过选定工作表上所有的形状, 并使用 ShapeRange 属性以 返回包含选定形状的 ShapeRange 对象的方法,来创建包含工作表 上所有 Shape 对象的 ShapeRange 对象。 Worksheets(1).Shapes.Select Set sr = Selection.ShapeRange 清风读月 在 Microsoft Excel中,Shapes 集合的 Range 属性的 Index 参数不是可选的,而是必选的;所以不能用不带参数的 Range 属性 来返回包含 Shapes 集合中的所有形状的 ShapeRange 对象。 对 ShapeRange 集合应用属性或方法 如果可在用户界面上对若干选定的形状同时执行某一操作,那 么在编程时,可通过构造 ShapeRange 集合,并对该集合应用适当 的属性和方法,来执行等价的操作。下例在 myDocument 上构造了 包含形状“Big Star”和“Little Star”的形状子集, 并对该形状子集应用了 渐进色填充格式。 Set myDocument = Worksheets(1) Set myRange = myDocument.Shapes.Range(Array("Big Star", _ "Little Star")) myRange.Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientBrass 下列是对 ShapeRange 集合应用属性和方法的一般准则。 对该集合应用某一方法, 等价于对该集合内每个单独的 Shape 对象应用同一方法。 设置该集合的某一属性的值, 等价于设置该集合内每个 单独形状的同一属性的值。 集合的返回常量的属性, 当集合内所有形状的该属性都 为同一值时,即返回该值;而当集合内所有形状的该属性的值 不全相等时,将返回“混合”常量。 清风读月 集合的返回简单数据类型 (如 Long、 Single 或 String) 的属性,当集合内所有形状的该属性都为同一值时,即返回该 值。 有些属性的值只有在该集合中仅包含一个形状时, 才能 返回或设置。如果该集合中有多个形状,返回或设置这类属性 将导致运行时错误。这种情况通常发生在用户界面上的等价操 作不

能同时对若干形状进行时(如编辑形状中的文字,或编辑 任意多边形上的站点) 。 当设置那些组织在 ShapeRange 集合的次级对象(如 FillFormat 对象)中的形状属性时,上述准则同样适用。如果该次 级对象所代表的操作能在用户界面对若干选定形状同时进行, 那么就 能返回 ShapeRange 集合的该对象, 并设置其属性。例如, 可用 Fill 属性返回代表 ShapeRange 集合中所有形状的填充格式的 FillFormat 对象。设置此 FillFormat 对象的属性,即设置 ShapeRange 集合中所有单独形状的同一属性。 在 Shapes 集合或 ShapeRange 集合中循环 即使不能在用户界面上通过选定若干形状并执行某一命令来对 这些形状同时进行某一操作, 也可以通过下述编程的方式来完成该操 作:在包含要处理的形状的 Shapes 集合或 ShapeRange 集合中循 环,对集合中的各 Shape 对象应用适当的属性和方法。下例在 MyDocument 上的所有形状中循环, 并修改这些形状中的每个自选图 形的前景颜色。 清风读月 Set myDocument = Worksheets(1) For Each sh In myDocument.Shapes If sh.Type = msoAutoShape Then sh.Fill.ForeColor.RGB = RGB(255, 0, 0) End If Next 下例构造了包含活动窗口中所有选定的形状的 ShapeRange 集合,然后设置了每个选定形状的前景颜色。 For Each sh in ActiveWindow.Selection.ShapeRange sh.Fill.ForeColor.RGB = RGB(255, 0, 0) Next 在形状区域中对齐、分布和组合形状 可用 Align 方法和 Distribute 方法按相互之间的相对位置或 按与文档的相对位置来定位一系列形状。可用 Group 方法或 Regroup 方法将一系列形状构造为单个形状组。 28、在某一 Microsoft Office 应用程序中控制其他 Microsoft Office 应用程序 如果要在某一 Microsoft Office 应用程序中运行处理其他 Microsoft Office 应用程序的对象的代码,请按下列步骤进行。 1)在“工具”菜单的“引用”对话框内设置对其他应用程序的类库 的引用。这样,该应用程序的对象、属性和方法将显示在对象浏览器 中,并且在编译时将检查有关的语法;还可以查阅这些对象、属性和 清风读月 方法的上下文相关帮助。 2)以特定的类型声明引用其他应用程序中的对象的对象变量。 请在声明时用应用程序的名称限定对象的类型。例如,下列语句声明 了指向 Word 文档的变量和指向 Microsoft Excel 工作簿的变量。 Dim appWD As Word.Application, wbXL As Excel.Workbook 注意 如果希望代码是早绑定的,则必须遵循前面的步骤。 3 ) 用 要 处 理 对 象 的 OLE 程 序 标 识 符 作 为 参 数 调 用 CreateObject 函数,如下例所示。如果要观察相应的应用程序的工 作期,请将 Visible 属性设置为 True。 4)Dim appWD As Word.Application 5)Set appWD = CreateObject(

"Word.Application") appWd.Visible = True 6)对变量所代表的对象应用属性和方法。例如,下述指令创建 了新的 Word 文档。 7)Dim appWD As Word.Application 8)Set appWD = CreateObject("Word.Application.8") appWD.Documents.Add 9)对相应应用程序的处理结束后,用 Quit 方法关闭之,如下 例所示。 appWd.Quit 29、OLE 程序标识符 清风读月 可以使用 OLE 程序标识符(有时称作 ProgID)创建自动化对 象。下表列出了 ActiveX 控件、Microsoft Office 应用程序和 Microsoft Office Web 组件的 OLE 程序标识符。 ActiveX 控件 要创建下表列出的 ActiveX 控件, 请使用相应的 OLE 程序标 识符。 要创建此控 件 CheckBox ComboBox CommandB utton Frame Image Label ListBox MultiPage OptionButto n Forms.Frame.1 Forms.Image.1 Forms.Label.1 Forms.ListBox.1 Forms.MultiPage.1 Forms.OptionButton.1 Forms.CheckBox.1 Forms.ComboBox.1 Forms.CommandButton.1 请使用此程序标识符 清风读月 ScrollBar SpinButton TabStrip TextBox ToggleButto n Forms.ScrollBar.1 Forms.SpinButton.1 Forms.TabStrip.1 Forms.TextBox.1 Forms.ToggleButton.1 Microsoft Access 要创建下表列出的 Microsoft Access 对象, 请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版 本的 Access(运行宏的计算机上可用的 Access 版本)中创建对象。 要创建此对象 Application 请使用这些标识符之一 Access.Application Access.Application.9 CurrentData Access.CodeData Access.CurrentData CurrentProject Access.CodeProject Access.CurrentProject DefaultWebOpti Access.DefaultWebOptions 、 、 、 清风读月 ons Microsoft Excel 要创建下表列出的 Microsoft Excel 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版 本的 Excel(运行宏的计算机上可用的 Excel 版本)中创建对象。 要创建此对 象 Application 请使用这些标 识符之一 Excel.Applicatio n、Excel.Application.9 Workbook Workbook Excel.AddIn Excel.Chart Excel.Chart.8 、 返回包含两张工 作表的工作簿; 一个用于 图表, 另一个用于图表的 数据。 其中, 图表工作表 为活动工作表。 Workbook Excel.Sheet Excel.Sheet.8 Microsoft Graph 、 返回具有一张工 作表的工作簿。 备注 清风读月 要创建下表列出的 Microsoft Graph 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版 本的 Graph(运行宏的计算机上可用的 Graph 版本)中创建对象。 要创建此对象 Application 请使用这些标识符之一 MSGraph.Application MSGraph.Application.8 Chart MSGraph.Chart、MSGraph.Chart.8 、 Microsoft Office Web 组件 要创建下表列出的“Microsoft Office Web 组件”对象,请使用相 应的 OLE 程序标识符之一。如果使用不带版本号后

缀的标识符,则 会在最近版本的“Microsoft Office Web 组件”(运行宏的计算机上可 用的“Microsoft Office Web 组件”版本)中创建对象。 要创建此对象 ChartSpace DataSourceControl 请使用这些标识符之一 OWC.Chart、OWC.Chart.9 OWC.DataSourceControl OWC.DataSourceControl.9 ExpandControl OWC.ExpandControl OWC.ExpandControl.9 PivotTable OWC.PivotTable 、 、 、 清风读月 OWC.PivotTable.9 RecordNavigationControl OWC.RecordNavigationContr ol、 OWC.RecordNavigationControl.9 Spreadsheet OWC.Spreadsheet OWC.Spreadsheet.9 Microsoft Outlook 要创建下表列出的 Microsoft Outlook 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在 最近版本的 Outlook(运行宏的计算机上可用的 Outlook 版本) 中创 建对象。 要创建此对象 Application 请使用这些标识符之一 Outlook.Application Outlook.Application.9 Microsoft PowerPoint 要创建下表列出的 Microsoft PowerPoint 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在 最近版本的 PowerPoint(运行宏的计算机上可用的 PowerPoint 版 本)中创建对象。 要创建此对象 Application 请使用这些标识符之一 PowerPoint.Application、 、 、 清风读月 PowerPoint.Application.9 Microsoft Word 要创建下表列出的 Microsoft Word 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版 本的 Word(运行宏的计算机上可用的 Word 版本)中创建对象。 要创建此对象 Application Document 请使用这些标识符之一 Word.Application、Word.Application.9 Word.Document、Word.Document.9、 Word.Template.8 Global Word.Global 30、关于数字签名 Microsoft Office 2000 利用 Microsoft Authenticode 技术使得开 发者可以通过使用数字证书对宏工程进行数字签名。Microsoft Excel 具有一些安全级, 这样用户就可以根据该宏是否具有可信源列表中开 发者的数字签名来决定是否运行宏。Excel 也会检查该数字签名的有 效性,例如,宏工程未被更改、宏工程是在数字证书过期或吊销前签 名的、数字证书是通过有效的证书颁发机构分发的。 对宏工程进行签名 清风读月 在安装数字证书后,可以对宏工程进行签名。应该只在测试完 解决方案并准备进行分发时对宏工程进行签名, 因为不论何时修改了 已签名的宏工程中的代码,其数字签名都会被删除。但是,如果计算 机上存在合适的数字证书,则在保存宏工程时,会自动再次对其进行 签名。 如果要防止用户在无意中修改宏工程或使签名无效,请在签名 前锁定宏工程。数字签名仅表明您保证宏工程的安全性,而并不证明 是您编写宏工程的, 所以锁定宏工程不能防止其

他人用其他签名代替 您的签名。 企业管理员可能会再次对模板和加载宏程序进行签名以控 制用户运行计算机。 如果创建加载宏程序向宏工程中添加代码,则该代码应该确定 宏工程是否已进行数字签名, 并且应该通知用户修改已签名宏工程后 的结果。修改包含已签名宏工程的工作簿不会使签名无效,因为经过 签名的是宏工程而不是工作簿。 注意 数字签名仅在安装了 Microsoft Internet Explorer 4.0 或其 后续版本的计算机上有效。如果在没有安装 Microsoft Internet Explorer 4.0 或其后续版本的计算机上打开包含宏(签名或未签名) 的工作簿,则会显示标准的宏病毒对话框,使用户可以在打开工作簿 前选择启用或禁用宏。 为宏工程进行数字签名 请确保在对宏工程进行签名前至少有一份数字证书。 1. 打开包含要签名的宏工程的工作簿或模板。 清风读月 2. 将鼠标指向“工具”菜单上的“宏”子菜单,然后单击 “Visual Basic 编辑器”命令。 3. 单击“工程管理器”中需要签名的工程。 4. 单击“工具”菜单上的“数字签名”命令。 5. 请执行下列操作之一: 如果要使用当前证书,请单击“确定”按钮。 如果要使用其他证书,请单击“选择”按钮以选择所需证 书,接着单击“确定”按钮,然后再次单击“确定”按钮。 31、启动 Microsoft Excel 时不运行“自动执行宏” 自动宏(例如:Auto_Activate)是在启动 Excel 时自动运行的。 有关自动宏的详细内容,请参阅“Visual Basic 帮助”。 要 防 止 宏 自 动 运 行 , 请 在 启 动 Excel 的 同 时 按 住 SHIFT 键。 注意 如果从 Office 快捷工具栏中启动 Excel,请首先单击 “Office 快捷工具栏”中的“Microsoft Excel”按钮,然后迅速按下 SHIFT 键,直到 Excel 完成启动。 32、焦点 在任何时间接收鼠标单击或键盘输入的能力。在 Microsoft Windows 环境中,在同一时间只有一个窗口、窗体或控件具有这种 能力。“具有焦点”的对象通常会以突出显示标题或标题栏来表示。用 户或应用程序可设置焦点。 二、 、了解对象、属性、方法和事件 清风读月 1、了解对象、属性、方法和事件 对象代表应用程序中的元素,比如,工作表、单元格、图表、 窗体,或是一份报告。在 Visual Basic 的代码中,可在使用对象的任 一方法或改变它的属性之一的值之前,必须去识别对象。 对象集合是一个包含几个其他对象的对象,而这些对象通常但 并不总是相同的类型。 例如, Microsoft Excel 中的 Workbooks 对 在 象包含了所有已打开的 Workbook 对象。而 Visual Basic 中的 Forms 集合则包含了所有在它所属应用程序中的 Form 对象。 集合中的项目可以通过

号码或名称来做识别。例如,在下面的 过程中 Workbooks(1) 会识第一个打开的 Workbook 对象。 Sub CloseFirst() Workbooks(1).Close End Sub 下面的过程使用一个指定为字符串的名称来识别 Form 对象。 Sub CloseForm() Forms("MyForm.frm").Close End Sub 如果对象共享共同的方法,则可以操作整个对象集合。例如, 下列的过程会关闭所有打开的窗体。 Sub CloseAll() Forms.Close End Sub 清风读月 方法指的是对象能执行的动作。 例如, Add 是属于 ComboBox 对象的一个方法,因为它会增加一个新项到下拉式列表框中。 下面的程序使用 Add 方法,增加一个新的工程到 ComboBox 中。 Sub AddEntry(newEntry as String) Combo1.Add newEntry End Sub 属性是一个对象的属性,它定义了对象的特征,诸如大小、颜 色或屏幕位置,或某一方面的行为,诸如对象是否有激活或可见的。 可以通过修改对象的属性值来改变对象的特性。 若要设置属性值,则在对象的引用后面加上一个复合句,它是 由属性名加上等号 (=) 以及新的属性值所组成的。例如,下面的过 程通过设置窗体中的 Caption 属性来更改 Visual Basic 窗体的标 题。 Sub ChangeName(newTitle) myForm.Caption = newTitle End Sub 有些属性并不能设置。每一个属性的帮助主题,会指出是否可 以设置此属性(读与写),或只能读取此属性(只读),还是只能写 入此属性(只写)。 可以通过属性的返回值,来检索对象的信息。下列的过程使用 一个消息框来标题,它显示在当前活动窗体顶部。 清风读月 Sub GetFormName() formName = Screen.ActiveForm.Caption MsgBox formName End Sub 事件是一个对象可以辨认的动作,像单击鼠标或按下某键等, 并且可以写某些代码针对此述动作来做响应。 用户做动作或程序代码 的结果可能导致事件的发生,或是由系统引发。 返回对象 每个应用程序都有返回它所包含的对象的方法,然而这些对象 并非都相同, 所以必须参考所使用的应用程序的对象或者集合的帮助 主题,才会知道如何返回对象。 2、Application 对象 Application 多个对象 代表整个 Microsoft Excel 应用程序。Application 对象包含: 应用程序范围内的设定和选项(例如“工具”菜单中“选 项”对话框内的许多选项。 返回处于活动状态的对象的方法,例如 ActiveCell 和 ActiveSheet 等。 Application 对象用法 可用 Application 属性返回 Application 对象。下例应用 Application 对象的 Windows 属性。 清风读月 Application.Windows("book1.xls").Activate 下例在其他应用程序中创建 Microsoft Excel 工作簿对象, 然后 在 Microsoft Excel 中打开工作簿。 Set xl = CreateObject("Excel.Sheet") xl.Application.Workbooks.Open "newbook.xls" 说明 许多返

回常用用户界面对象(例如活动单元格)的属性和方法 (例如 ActiveCell 属性),可不加 Application 对象识别符而直接 使用。例如,可用 ActiveCell.Font.Bold = True 代替 Application.ActiveCell.Font.Bold = True。 3、Workbook 对象 Application Workbook [Workbooks] 多个对象 代表 Microsoft Excel 工作簿。Workbook 对象是 Workbooks 集合的成员。 Workbooks 集合包含 Microsoft Excel 中所有当前打开 Workbook 对象。 Workbook 对象用法 本部分将说明下列返回 Workbook 对象的属性和方法: ? Workbooks 属性 ActiveWorkbook 属性 清风读月 ThisWorkbook 属性 4、Workbooks 属性 可用 Workbooks(index) (其中 index 为工作簿名称或编号)返 回单个 Workbook 对象。下例激活第一个工作簿。 Workbooks(1).Activate 索引号表明创建或打开工作簿的顺序。 Workbooks(1) 为创建的 第一个工作簿,而 Workbooks(Workbooks.Count) 为最后一个。激活 某工作簿并不改变其编号。所有工作簿均包括在编号序列中,即便是 隐藏工作簿也是如此。 Name 属性返回工作簿名称。 不能用该属性设置工作簿的名称; 如果需要改名, 应当用 SaveAs 方法以其它名称保存工作簿。 下例激 活工作簿“Cogs.xls”中的工作表“Sheet1”(该工作簿必须已在 Microsoft Excel 中打开)。 Workbooks("cogs.xls").Worksheets("sheet1").Activate ActiveWorkbook 属性 ActiveWorkbook 属性返回当前处于活动状态的工作簿。下例 设置活动工作簿的作者名称。 ActiveWorkbook.Author = "Jean Selva" ThisWorkbook 属性 ThisWorkbook 属性返回其中正在运行 Visual Basic 代码的工 作簿。在绝大多数情况下,这也就是活动工作簿。然而,如果 Visual Basic 代码是加载宏的一部分,那么 ThisWorkbook 属性就不会返 清风读月 回活动工作簿。在这种情况下,活动工作簿是调用加载宏的工作簿, 而 ThisWorkbook 属性将返回该加载宏工作簿。 如果用 Visual Basic 代码创建加载宏,那么对于那些编译到加 载宏中的工作簿,在其中运行的语句应当用 ThisWorkbook 属性加 以限定。 5、Range 对象 Application Workbook [Workbooks] Range 代表某一单元格、某一行、某一列、某一选定区域(该选定区 域可包含一个或若干连续单元格区域)或者某一三维区域。 Range 对象用法 本部分将说明下列返回 Range 对象的属性和方法: ? ? ? ? Range 属性 Cells 属性 Range 和 Cells Offset 属性 Union 方法 6、Range 属性 清风读月 可用 Range(arg) (其中 arg 为区域名称)返回代表单个单元 格或单元格区域的 Range 对象。 下例将单元格 A1 中的值赋给单元 格 A5。 Worksheets("Sheet1").Range("A5").Value = _ Worksheets("Sheet1").Range("A1").Value 下例设置单元格区域“A1:H8”中每个单元格的公式,

用随机数 填充该区域。在没有对象识别符(句点左边的对象)的情况下使用 Range 属性,将返回活动表上的一个区域。如果活动表不是工作表, 该方法将失败。在没有明确的对象识别符的情况下,使用 Range 属 性之前,可用 Activate 方法来激活工作表。 Worksheets("sheet1").Activate Range("A1:H8").Formula = "=rand()"'Range is on the active sheet 下例清除区域“Criteria”中的内容。 Worksheets(1).Range("criteria").ClearContents 如果用文本参数指定区域地址,必须以 A1-样式符号指定该地 址(不能用 R1C1-样式符号)。 7、Cells 属性 可用 Cells(row, column) (其中 row 为行号, column 为列号) 返回单个单元格。下例将单元格“A1”赋值为 24。 Worksheets(1).Cells(1, 1).Value = 24 下例设置单元格 A2 的公式。 ActiveSheet.Cells(2, 1).Formula = "=sum(B1:B5)" 清风读月 虽然也可用 Range("A1") 返回单元格 A1,但有时用 Cells 属 性更为方便,因为使用该属性时,可用变量指定行和列。下例在工作 表“Sheet1”上创建行号和列标。注意,当工作表激活以后,使用 Cells 属性时不必显式指定工作表(它将返回活动工作表上的单元格)。 Sub SetUpTable() Worksheets("sheet1").Activate For theYear = 1 To 5 Cells(1, theYear + 1).Value = 1990 + theYear Next theYear For theQuarter = 1 To 4 Cells(theQuarter + 1, 1).Value = "Q" & theQuarter Next theQuarter End Sub 虽然可用 Visual Basic 字符串函数转换 A1-样式引用,但使用 Cells(1, 1) 记号更为简便(而且也是更好的编程习惯)。 可用 expression.Cells(row, column) 返回区域中的一部分, 其中 expression 是返回 Range 对象的表达式, row 和 column 为相对于 该区域的左上角偏移量。下例设置单元格 C5 中的公式。 Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=rand()" Range 和 Cells 清风读月 可用 Range(cell1, cell2) 返回 Range 对象,其中 cell1 和 cell2 为指定起始和终止位置的 Range 对象。下例设置单元格区域 “A1:J10”的边框线条样式。 With Worksheets(1) .Range(.Cells(1, 1), _ .Cells(10, 10)).Borders.LineStyle = xlThick End With 注意每个 Cells 属性之前的句点。如果前导的 With 语句应用 于该 Cells 属性,那么这些句点就是必需的。本例中,句点指明单元 格处于第一张工作表上。如果没有句点,Cells 属性将返回活动工作 表上的单元格。 8、Caller 属性 返回关于调用 Visual Basic 的信息(详细内容请参阅“说明”部 分)。 语法 expression.Caller(Index) expression 必选。该表达式返回 Application 对象。 Index Variant 类型,可选。数组的索引。仅当本属性返回数组 时此参数才有用(详细内容请参阅“说明”部分)。 说明 本属性返回关于调用 Visual Basic 的信息,如下表所示。 调用进程 返回值 清

风读月 在单个单元格中输入的自定 义函数 在单元格区域中作为数组公 式的一部分的自定义函数 Auto_Open、 Auto_Close 、 Auto_Activate 或 Auto_Deactivate 宏 由 OnDoubleClick 或 OnEntry 属性所指定的宏 对象 代表该单元格的 Range 代表该单元格区域的 Range 对象 以文本方式返回的文档名 该宏所应用的图表对象标 识符或单元格引用(若适用)的 名称 “工具 ”菜单中的“宏”对话 框,或上述之外的其它调用者 #REF! 错误值 Caller 属性示例 本示例显示关于调用 Visual Basic 的信息。 Select Case TypeName(Application.Caller) Case "Range" v = Application.Caller.Address Case "String" v = Application.Caller Case "Error" v = "Error" 清风读月 Case Else v = "unknown" End Select MsgBox "caller = " & v 9、Offset 属性 可用 Offset(row, column) (其中 row 和 column 为行偏移量 和列偏移量)返回相对于另一区域在指定偏移量处的区域。下例选定 位于当前选定区域左上角单元格的下三行且右一列处的单元格。 由于 不能选定不在活动工作表上的单元格,故必须首先激活工作表。 Worksheets("sheet1").Activate 'can't select unless the sheet is active Selection.Offset(3, 1).Range("A1").Select Union 方法 可用 Union(range1, range2, ……) 返回多块的区域,即该区域由 两个或多个连续的单元格块所组成。下例创建由单元格区域“A1:B2” 和“C3:D4”组成的多块区域对象,然后选定该区域。 Dim r1 As Range, r2 As Range, myMultiAreaRange As Range Worksheets("sheet1").Activate Set r1 = Range("A1:B2") Set r2 = Range("C3:D4") Set myMultiAreaRange = Union(r1, r2) myMultiAreaRange.Select 清风读月 使用包含若干区域块的选定区域时,Areas 属性很有用。它将 一个多区域选定区分割为单个的 Range 对象,然后将这些对象作为 一个集合返回。使用返回集合的 Count 属性可检测一个选定区是否 包含多个区域,如下例所示。 Sub NoMultiAreaSelection() numberOfSelectedAreas = Selection.Areas.Count If numberOfSelectedAreas > 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 本示例检查工作表一当前区域中的行,如果某行的第一个单元 格值与前一行的第一个单元格的值相等,则删除此行。 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”。 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 事件 当激活任一工作簿时产生此事件。 语法 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 描述 启动错误处理程序, 且该例程从必要的 line 参数 Error GoTo 中指定的 line 开始。line 参数可以是任何行标签或行 line 号。如果发生一个运行时错误,则控件会跳到 line,激 活错误处理程序。指定的 line 必须在一个过程中,这 个过程与 On Error 语句相同; 否则会发生编译时间 错误。 On Error Resume Next On Error GoTo 0 禁止当前过程中任何已启动的错误处理程序。 说明当一个运行时错误

发生时,控件转到紧接着 发生错误的语句之后的语句,并在此继续运行。访问对 象时要使用这种形式而不使用 On Error GoTo。 说明 如果不使用 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: …… 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:' 错误处理程序。 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 工作簿时,将丢失 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”,则在事 件过程名称中必须使用 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"), _ 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、 xlVali

dAlertStop 或 xlValidAlertWarning。 OperatorVariant 类型,可选。有效数据操作符。可为下列 XlFormatConditionOperator 常量之一:xlBetween、xlEqual、 xlGreater、xlGreaterEqual、xlLess、xlLessEqual、xlNotBetween 或 者 xlNotEqual。 Formula1 Variant 类型,可选。有效数据方程式的第一部分。 Formula2 Variant 类型, 可选。 Operator 参数是 xlBetween 当 或 xlNotBetween 时,有效数据方程式的第二部分(否则本参数将忽 略)。 说明 Add 方法所要求的参数依有效性检验的类型而定,如下表所 示。 有效性检验类型 xlValidateCusto m 参数 Formula1 必选, 忽略 Formula2。 Formula1 必须为一表达式,数据项有效时该表达式取值为 清风读月 True,而数据项无效时取值为 False。 xlInputOnly 能使用 AlertStyle、Formula1 或 Formula2 参数。 xlValidateList Formula1 必选, 忽略 Formula2。 Formula1 必须为一以逗号分隔的取值列表,或指向此列表 的工作表。 xlValidateWhole Number xlValidateDate xlValidateDecimal 必须指定 Formula1 或 Formula2 之一, 或 、 两者均指定。 、 、 xlValidateTextLength 或 xlValidateTime Add 方法(Validation 对象)示例 本示例向单元格“E5”添加数据有效性检验。 With Range("e5").Validation .Add Type:=xlValidateWholeNumber, _ AlertStyle:= xlValidAlertStop, _ Operator:=xlBetween, Formula1:="5", Formula2:="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 21、Validation 对象 Renge Validation 代表工作表区域的数据有效性规则。 使用 Validation 对象 使用 Validation 属性可返回 Validation 对象。下例改变单元 格 E5 的数据有效性规则。 Range("e5").Validation _ .Modify xlValidateList, xlValidAlertStop, "=$A$1:$A$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 方法 打开一个工作簿。 语法 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。如果省略本参数,则使用 当前操作系统。 清风读月 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 中的 页或标签的索引。 说明 在导致 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 属性的代码。 若要使用该示例,请将代码粘贴到包含名为 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 将按照下表所示处理传送。 取值 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 事件中。 在这个例子中,用户指定组合框的文本部分是否必须与组合框 中的列表项之一匹配。用户可以利用复选框来指定是否要求匹配,然 后在组合框中键入条件,指定列表中的一项。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: ? 名为 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 属性 Value 属性的意义取决于其应用的对象,如下表所示。 对象 应用程序 边界 名称 取值 总是返回“Microsoft Excel”。只读。 Borders.LineStyle 的同义词。 一个包含公式的字符串,该名称为此公式的 引用。在宏语言中使用 A1 样式引用的字符串,并 以等号开头。只读。 参数 PivotField PivotItem PivotTabl e Range 指定单元格的值。 如果单元格为空, Value 则 返回 Empty 值(使用 IsEmpty 函数可测试这种 情况) 。如果 Range 对象包含不止一个单元格,就 会返回一个值的数组(使用 IsArray 函数可测试 参数值。 详细信息, 请参阅 Parameter 对象。 数据透视表报表中指定字段的名称。 数据透视表字段中指定数据项的名称。 数据透视表报表的名称。 清风读月 这种情况) 。 Style Validation 指定样式的名称 如果符合所有的有效性规则则为 True (也就 是说,该区域包含合法数据) 。 下表显示了 Value 属性及其相关属性的示例值, 假设存在唯一 名称为“[Europe].[France].[Paris]”的 OLAP 数据源,以及具有数据项 “Paris”的非 OLAP 数据源。 属性 值(OLAP 数据源) 值 (非 OLAP 数据源) Caption Name Paris [Europe].[France].[Paris] (只读) SourceN ame Value [Europe].[France].[Paris] (只读) [Europe].[France].[Paris] (只读) ( 与 SQL Paris Paris 属性值相同,只读) Paris 当在 PivotItems 集合中指定一个索引时,可使用下表所示的 语法。 语

法(OLAP 数据源) expression.PivotItems("[Europe].[F 语法(非 OLAP 数据源) expression.PivotItems("Paris") 清风读月 rance].[Paris]") 在使用 Item 属性引用集合中的特定成员时,可使用下面的文 本索引名称。 名称(OLAP 数据 源) [Europe].[France].[Par is] Paris 名称(非 OLAP 数据源) Value 属性示例 本示例将“Sheet1”中 A1 单元格的值设为 3.14159。 Worksheets("Sheet1").Range("A1").Value = 3.14159 本示例对“Sheet1”中 A1:D10 单元格进行循环。如果这些单元 格中的某个值小于 0.001,则将其值替换为 0(零)。 For Each c in Worksheets("Sheet1").Range("A1:D10") 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 事件的语法有以下几个成分: 成分 obje ct inde x Can cel 必需。在 Pages 或 Tabs 集合里的 Page 或 Tab 对象的位置。 必需。 事件状态。 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 方法把控 件从窗体复制到剪贴板。 用户单击 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 '将文本粘贴到控件的代码 'Private 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 事件 当右击任一工作表时产生此事件,此事件先于默认的右击操 作。 语法 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 事件。 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 对象 本部分将说明下列返回 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 事件 当激活任何一张表时产生此事件。 语法 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 属性的语法包含以下成分: 成分 objec t Bool ean 件。 可选。判断该对象能否响应用户产生的事 必需。有效对象。 描述 设置 Boolean 的设置值有: 值 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 清风读月 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]) 在 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 在下列的语句中,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 '更多的语句 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 语句 将对象引用赋给变量或属性。 语法 Set objectvar = {[New] objectexpression | Nothing} Set 语句的语法包含下面部分: 部分 objectvar 描述 必需的。变量或属性的名称,遵循标准变量 命名约定。 New 可选的。通常在声明时使用 New,以便可 以隐式创建对象。如果 New 与 Set 一起使用, 则将创建该类的一个新实例。 如果 objectvar 包含 了一个对象引用,则在赋新值时释放该引用。不 能使用 New 关键字来创建任何内部数据类型的 新实例,也不能创建从属对象。 objectexpre 必需的。由对象名,所声明的相同对象类型 清风读月 ssion 的其它变量,或者返回相同对象类型的函数或方 法所组成的表达式。 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 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} 在 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 函数定义 中的第三个参数是一个长整形,它代表一个过程。该参数必须包含这 清风读月 个过程的地址,而不是这个过程的返回值。在对 EnumFontFamilies 的调用中,第三个参数需要 AddressOf 运算符来返回 EnumFontFamProc 过程的地址,该过程是当调用 Windows API 函 数,即 EnumFontFamilies 时提供的回调过程的名称。当把 AddressOf EnumFontFamProc 传递给 EnumFontFamilies 时, Windows 就会为系统中的每一个字体库调用一次 EnumFontFamProc。 传递给 EnumFontFamilies 的最后一个参数指定 用来显示信息的列表框。 '字体枚举类型 Public Const LF_FACESIZE = 32 Public Const LF_FULLFACESIZE = 6

4 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 清风读月 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 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 设置属性值的语句也是一个赋值语句。下面的示例,将设置对 于活动单元格 Font 对象的 Bold 属性: ActiveCell.Font.Bold = True 11、写可执行的语句 一个可执行的语句初始化动作。 它可以执行一个方法或者函数, 并且可以循环或从代码块中分支执行。 可执行的的语句通常包含数学 的或条件运算符。 下面的示例使用 For Each……Next 语句来重复名称为 MyRange 范围内的每个单元格,而此范围在活动的 Microsoft Excel 工作簿的 Sheet1 中。 Sub ApplyFormat() Const limit As Integer = 33 For Each c In Worksheets("Sheet1").Range("MyRange").Cells If c.Value > limit Then With c.Font .Bold = True .Italic = True 清风读月 End With End If Next c MsgBox "All done!" End Sub 示例中的 If……Then……Else 语句检查单元格的值。如果它的值超 过 33, With 语句设置单元格中 Font 对象的 Bold 和 Italic 属 则 性。而 If……Then……Else 语句会以 End If 结束。 With 语句可以节省代码键入次数,因为所包含的语句会自动 的执行于紧接在 With 关键字后面的对象中。 Next 语句会去调用单元格集合中的下一个单元格, 而此单元格 集合是包含于 MyRange 中。 MsgBox 函数(它显示一个固有的 Visual Basic 对话框)显示 一个信息用来指出 Sub 过程已经完成执行。 12、Public 语句 在模块级别中使用,用于声明公用变量和分配存储空间。 语法 Public [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . . Public 语句的语法包含下面部分: 部分 WithEve 描述 可选的。关键字,说明 varname 是用来响应 清风

读月 nts 由 ActiveX 对象触发的事件的对象变量。只有在类 模块中才是合法的。使用 WithEvents,可以定义任 意个所需的单个变量,但不能用 WithEvents 创建 数组。New 和 WithEvents 不能一起使用。 varname 定。 subscript 可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法: [lower To] upper [,[lower To] upper] . . . 如 果 不 显 式 指 定 lower , 则 数 组 的 下 界 由 Option Base 语句控制。如果没有 Option Base 语 句则下界为 0。 New 可选的。用它可以隐式地创建对象的关键字。 如果使用 New 声明对象变量, 则在第一次引用该变 量时创建该对象的新实例,因此不必使用 Set 语句 来对该对象引用赋值。New 关键字不能用来声明任 何内部数据类型的变量以及从属对象的实例,也不 能与 WithEvents 一起使用。 Type 可选的。变量的数据类型;可以是 Byte、 Boolean、Integer、Long、Currency、Single、Double、 Decimal(目前尚不支持) 、Date、String(对变长的 字符串) 、String * length(对定长的字符串) 、Object 必需的。变量的名称;遵循标准的变量命名约 s 清风读月 或 Variant,用户定义类型,或对象类型。所声明的 每个变量都要有一个单独的 As type 子句。 说明 Public 语句声明的变量在所有应用程序的所有没有使用 Option Private Module 的模块的任何过程中都是可用的;若该模块 使用了 Option Private Module,则该变量只是在其所属工程中是公 用的。 小心 不能在类模块中使用 Public 语句来声明一个定长的字 符串变量。 使用 Public 语句可以声明变量的数据类型。例如,下面的语 句声明了一个 Integer 类型的变量。 Public NumberOfEmployees As Integer 也可以使用 Public 语句来声明变量的对象类型。下面的语句 为工作表的新实例声明了一个变量。 Public X As New Worksheet 如果在定义对象变量时没有使用 New 关键字,则在使用该变 量之前,必须使用 Set 语句将一个已有的对象赋给这个引用对象的 变量。 在被赋值之前, 所声明的这个对象变量有一个特定值 Nothing, 这个值表示该变量没有指向任何对象的实例。 可以用带空圆括号的 Public 语句来声明动态数组。在声明了 动态数组之后, 可以在过程内用 ReDim 语句来定义该数组的维数和 清风读月 元素。如果试图在 Private、Public 或 Dim 语句中重定义一个已被 显式定义了大小的数组的维数,就会发生错误。 如果不指定数据类型或对象类型,且在模块中没有使用 Deftype 语句,则按缺省情况该变量为 Variant 类型。 当初始化变量时,数值变量被初始化为 0,变长的字符串被初 始化为一个零长度的字符串 (""),而定长

的字符串则用 0 填充。 Variant 变量被初始化为 Empty。 用户自定义类型的变量的每个元素 都作为各自独立的变量进行初始化。 Public 语句示例 该示例在标准模块的模块级(通用部分)使用 Public 语句, 来显式声明公用的变量,指如果没有使用 Option Private Module, 则在所有应用程序的所有模块的所有过程中都可以使用的变量。 Public Number As Integer'公用的整数变量。 Public NameArray(1 To 5) As String'公用的字符串数组变量。 '多个声明,两个变体型变量,以及一个整数型变量,都是公用 的。 Public MyVar, YourVar, ThisVar As Integer 13、Private 语句 在模块级别中使用,用于声明私有变量及分配存储空间。 语法 Private [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . . 清风读月 Private 语句的语法包含下面部分: 部分 WithEven ts 描述 可选的。关键字,说明 varname 是用来响应 由 ActiveX 对象所触发的事件的对象变量。只有 在类模块中才是合法的。使用 WithEvents,可以 定义任意个所需的单变量,但不能用 WithEvents 创建数组。New 和 WithEvents 不能一起使用。 varname 必需的。变量的名称;遵循标准的变量命名 约定。 subscripts 可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数的使用语法如下: [lower To] upper [,[lower To] upper] . . . 如果不显式指定 lower,则数组的下界由 Option Base 语句控制。 如果没有 Option Base 语 句则下界为 0。 New 可选的。 使其可以隐式地创建对象的关键字。 如果使用 New 声明对象变量,则在第一次引用该 变量时创建该对象的新实例,因此不必使用 Set 语句来对该对象引用赋值。New 关键字不能声明 任何内部数据类型的变量以及从属对象的实例,也 不能与 WithEvents 一起使用。 type 可选的。变量的数据类型;可以是 Byte、 清风读月 Boolean、 Integer、 Long、 Currency、 Single、 Double、 Decimal(目前尚不支持) 、Date、String(对可变长 的字符串) 、String * length(对定长的字符串) 、 Object、Variant、用户定义类型或对象类型。所声 明的每个变量都要一个单独的 As type 子句。 说明 Private 变量只能在包含其声明的模块中使用。 可以使用 Private 语句声明变量的数据类型。例如,下面的语 句声明了一个 Integer 类型的变量。 Private NumberOfEmployees As Integer 也可以使用 Private 语句来声明变量的对象类型。下面的语句 为工作表的新实例声明了一个变量。 Private X As New Worksheet 如果在定义对象变量时没有使用 New 关键字,则在使用该变 量之前,必须使用 Set 语句将一个已有的对象赋给该引用对象的变 量。在赋值之前,

所声明的这个对象变量有一个特定值 Nothing,这 个值表示该变量没有指向任何对象的实例。 如果不指定数据类型或对象类型,且在模块中没有使用 Deftype 语句,则按缺省情况该变量为 Variant 类型。 可以用带空圆括号的 Private 语句来声明动态数组,然后可以 在过程内用 ReDim 语句来定义该数组的维数和元素。如果试图在 清风读月 Private,Public 或 Dim 语句中重新定义一个已显式定义了大小的 数组的维数,就会发生错误。 当初始化变量时,数值变量被初始化为 0,变长的字符串被初 始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。 Variant 变量被初始化为 Empty。 用户自定义类型的变量的每个元素 作为各自独立的变量进行初始化。 注意 当在过程中使用 Private 语句时,通常将 Private 语句 放在过程的开始。 Private 语句示例 该示例演示在模块级使用 Private 语句来声明私有变量;即这 些变量只能在包含其声明的模块中使用。 Private Number As Integer'私有的整数变量。 Private NameArray(1 To 5) As String'私有的数组变量。 '多个声明,两个变体型,以及一个整型,都是私有的。 Private MyVar, YourVar, ThisVar As Integer 14、使用数组 可以声明一个数组来代表一群具有相同数据类型的值。数组是 单一类型的变量,它具有很多的隔室来存储很多值,而常规的变量只 有一个存储隔室, 所以只能存储一个值。 但要引用所保持的所有值时, 可以引用整个数组或是只引用数组的个别元素。 例如,若要存储一年中每天的支出, 可以声明一个具有 365 个 元素的数组变量,而不是 365 个变量。数组中的每一个元素都包含 清风读月 一个值。下列的语句声明数组变量 curExpense 具有 365 个元素。 按照缺省规定,数组的索引是从零开始,所以此数组的上标界是 364 而不是 365。 Dim curExpense(364) As Currency 若要设置个别元素的值,必须指定元素的索引。下面的示例对 于数组中的每个元素都赋予一个初始值 20。 Sub FillArray() Dim curExpense(364) As Currency Dim intI As Integer For intI = 0 to 364 curExpense(intI) = 20 Next End Sub 更改数组的底层绑定 可以在模块的顶部使用 Option Base 语句,将第一个元素的缺 省索引值从 0 改成 1。在下面的示例中,Option Base 语句改变数 组第一个组件的索引值,接着 Dim 语句声明数组变量 curExpense 具有 365 个元素。 Option Base 1 Dim curExpense(365) As Currency 也可以利用 To 子句来对数组的底层绑定做显示地声明,如下 面的示例所示: 清风读月 Dim curExpense(1 To 365) As Currency Dim strWeekday(7 To 13) As String 在数组中存储 Variant 值 有两种方式可以创建 Variant 值的数组。第一种方式是

声明 Variant 数据类型的数组,如下面的示例所示: Dim varData(3) As Variant varData(0) = "Claudia Bendel" varData(1) = "4242 Maple Blvd" varData(2) = 38 varData(3) = Format("06-09-1952", "General Date") 另一种方式是指定 Array 函数所返回的数组为一个 Variant 变量,如下示例所示。 Dim varData As Variant varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _ Format("06-09-1952", "General Date")) 对于元素类型为 Variant 的数组,可以利用索引来识别各元 素,而不管用何种方式创建此数组。例如,下列的语句可以被加到上 述的示例中。 MsgBox "Data for " & varData(0) & " has been recorded." 使用具有多重维数的数组 在 Visual Basic 中最多可以声明变量到 60 个维数。例如,下 列的语句声明一个 5 乘 10 的两维数组。 清风读月 Dim sngMulti(1 To 5, 1 To 10) As Single 如果将数组想成矩阵,则第一个参数代表行,而第二个参数代 表列。 可以使用嵌套的 For……Next 语句去处理多重维数数组。下列的 过程将一个两维数组的所有元素都填入 Single 值。 Sub FillArrayMulti() Dim intI As Integer, intJ As Integer Dim sngMulti(1 To 5, 1 To 10) As Single ' 用值填入数组。 For intI = 1 To 5 For intJ = 1 To 10 sngMulti(intI, intJ) = intI * intJ Debug.Print sngMulti(intI, intJ) Next intJ Next intI End Sub 15、使用常数 您的代码可能包含经常出现的常数值,或可能某些数值是非常 难以记忆并且无明确意义的。使用常数可使代码更容易读取与维护。 常数是一个有意义的名称, 它可以替换一个号码或字符串而且值不会 改变。不能修改一个常数或如同操作变量般的赋一个新值给常数。 清风读月 有三种类型的常数: 固有的常数或系统定义的常数是由应用程序与控件提 供的。提供对象库的其它的应用程序如 Microsoft Access, 、 Microsoft Excel Microsoft Project 以及 Microsoft Word ,也提 供常数列表,这些常数可与它们所属的对象,方法以及属性等 一起使用。可以获得个别为对象浏览器中的对象库所提供的常 数列表。 Visual Basic 的常数都列在 Visual Basic for Applications 类型库以及 Data Access Object(DAO)程序库之中。 注意 Visual Basic 仍会对之前的 Visual Basic 或 Visual Basic for Applications 所定义的常数做识别。可以提升常数到 Object Browser 之中。在 Object Browser 中所列的常数,不 用在的应用程序中声明。 符号或用户自定义的常数都是利用 Const 语句来声 明。 条件编译常数都是利用 #Const 语句来声明。 在早期版本的 Visual Basic 中,常数的名称都是用大写字符串 加上一横下划线而成,例如: TILE_HORIZONTAL 固有的常数当前被限定来避免一个混淆,即具有相同名称的常 数存在于多个对象库中,而这些

常数可能具有不同的值所造成的。有 两种方法来限定常数名称: 清风读月 ? 通过前缀 通过库引用 用前缀限定常数 所有对象提供的固有的常数都以混合大小写格式显示,以两个 字符为前缀来指出定义这些常数的对象库。例如,由 Visual Basic for Applications 对象库而来的常数都会以“vb”为开端;而由 Microsoft Excel 对象库而来的常数都会以“xl”为开端。下面的示例解释了如何 应用前缀字符于自定义控件,其通常是与类型库相关的。 ? vbTileHorizontal xlDialogBorder 用库引用限定常数 也可利用下列的语法来限定对常数的引用: [libname.] [modulename.]constname 限定常数的语法包含下面部分: 单元 libname 描述 可选的。定义此常数的类型库。对于多数的自定 义控件 (在 Macintosh)中不可用来说, 它也是控件的类 名。如果忘掉了控件的类名,可将鼠标的光标移动到 工具箱中此控件的位置。该类名会显示在“工具提示” 中。 module 可选的。定义此常数的类型库,所包含的模块的 清风读月 name constna me 例如: 名称。可以利用“对象浏览器”来找到模块的名称。 在类型库中定义的常数名称。 Threed.LeftJustify 16、AppActivate 语句 激活一应用程序窗口。 语法 AppActivate title[, wait] AppActivate 语句的语法具有以下几个命名参数: 部分 title 描述 必需的。字符串表达式,所要激活的应用程序窗口的标题。可 以使用 Shell 函数返回的任务识别码来替换 title, 以激活应用 程序。 wait 可选的。Boolean 值,说明在激活另一个应用程序之前调用的 应用程序是否有焦点。如果为 False(缺省) ,那么,即使调用 的应用程序没有焦点,也直接激活指定的应用程序。如果为 True,则调用的应用程序会等到有焦点后,才激活指定的应用 程序。 清风读月 说明 AppActivate 语句将焦点移动到命名的应用程序或窗口,但并不影响 焦点是否最大化或最小化。当用户采取行动改变焦点或将窗口关闭 时, 就会将焦点从活动的应用程序窗口移动出去。可用 Shell 函数启 动一个应用程序并设置窗口样式。 在决定激活哪个应用程序时,请将 title 与每一个运行中的应用程序 的标题字符串进行比较。如果没有完全匹配,就激活任何这样的应用 程序, 其标题字符串以 title 开头。 如果以 title 命名的应用程序有很 多实例,则激活任何一个实例。 AppActivate 语句示例 本示例说明使用 AppActivate 语句来激活应用程序的各种用法。 示例 中用到的 Shell 语句均假定该应用程序已经存在指定的路径中。在 Macintosh 上,缺省驱动器名为"HD",且路径名部分由冒号而不是反 斜杠分隔。 Dim M

yAppID, ReturnValue AppActivate "Microsoft Word" ' Word。 ' 激活 Microsoft ' AppActivate 也可利用 Shell 函数的返回值。 MyAppID = Shell("C:\WORD\WINWORD.EXE", 1) Microsoft Word。 AppActivate MyAppID ' 激活 Microsoft ' 运行 清风读月 ' Word。 ' 您也可使用 Shell 函数的返回值。 ReturnValue = Shell("c:\EXCEL\EXCEL.EXE",1) Excel。 AppActivate ReturnValue ' Excel。 17、Beep 语句 通过计算机喇叭发出一个声调。 语法 Beep 说明 呼叫的频率与时间长短取决于硬件和系统软件,并随电脑不同而不 同。. Beep 语句示例 本示例使用 Beep 语句让计算机连续响三声。 Dim I For I = 1 To 3 Beep Next I 18、Close 语句 关闭 Open 语句所打开的输入/输出 (I/O) 文件。 ' 循环 3 次。 ' 发出一声。 ' 激活 Microsoft ' 运行 Microsoft 清风读月 语法: Close [filenumberlist] 可选的 filenumberlist 参数为一个或多个文件号, 其中 filenumber 为 任何有效的文件号,语法如下: [[#]filenumber] [, [#]filenumber] . . . 说明 若省略 filenumberlist,则将关闭 Open 语句打开的所有活动文件。 当关闭 Output 或 Append 打开的文件时, 将属于此文件的最终输出 缓冲区写入操作系统缓冲区。 所有与该文件相关联的缓冲区空间都被 释放。 在执行 Close 语句时,文件与其文件号之间的关联将终结。 Close 语句示例 本示例使用 Close 语句来关闭所有为 Output 而打开的三个文件。 Dim I, FileName For I = 1 To 3 ' 循环三次。 ' 创建文件名。 ' 打开文件。 FileName = "TEST" & I Open FileName For Output As #I Print #I, "This is a test." Next I Close ' 将字符串写入文件。 ' 将三个已打开的文件全部关闭。 19、Date 语句 设置当前系统日期。 清风读月 语法: Date = date 对于运行 Microsoft Windows 95 的系统,要设置的 date 必须介于 1980 年 1 月 1 日与 2099 年 12 月 31 日之间。对于运行 Microsoft Windows NT 的系统,date 必须介于公元 1980 年 1 月 1 日到 2079 年 12 月 31 日之间。 对于 Macintosh,date 值必须是介于 1904 年 1 月 1 日到 2040 年 2 月 5 日之间的日期。 Date 语句示例 本示例使用 Date 语句来设置系统日期。在开发环境中,日期原义会 根据系统的地区设置,以短式日期格式显示。 Dim MyDate MyDate = #February 12, 1985# Date = MyDate 20、Error 语句 模拟错误的发生。 语法 Error errornumber 必要的 errornumber 可以是任何有效的错误号。 说明 Error 语句获得的支持是向后兼容的。在新的代码中,特别是在建立 对象时,要使用 Err 对象的 Raise 方法产生运行时错误。 ' 指定某个日期。 ' 改变系统日期。 清风读月 如果已经定义 errornumber,那么,在 Err 对象的属性被赋予下列值 之后,Error 语句会调用错误处理程序: 属性 Num

ber 值 作为参数指定给 Error 语句的值。 可以是任何有效的 错误号。 Source Description 当前 Visual Basic 工程的名称。 字符串表达式,如果这个字符串存在,则表达式将与 Error 函数的返回值一致,该返回值是 Error 函数对 指定的 Number 的返回值。如果这个字符串不存在, 则 Description 包含一个长度为零的字符串 ("")。 HelpFile Visual Basic 帮助文件的完整限定的驱动器、路径和 文件名。 HelpContext 对于与 Number 属性一致的错误所指定的 Visual Basic 帮助文件上下文 ID。 LastDLLError 零。 如果不存在错误处理程序, 或未做任何启动动作, 那么就会由 Err 对 象属性发布一个错误信息并将错误信息显示出来。 注意 并非全部 Visual Basic 主应用程序都可以建立对象。请参考主 机应用程序的文档来判断它能否建立类和对象。 清风读月 Error 语句示例 本示例使用 Error 语句来模拟发生错误代号 11 的状况。 On Error Resume Next Error 11 ' 错误处理。 ' 模拟“除以零”的错误。 21、Exit 语句 退出 Do……Loop、For……Next、Function、Sub 或 Property 代码块。 语法 Exit Do Exit For Exit Function Exit Property Exit Sub Exit 语句的语法有以下几种形式: 语句 Exit Do 描述 提供一种退出 Do……Loop 循环的方法,并且只能在 Do……Loop 循环中使用。Exit Do 会将控制权转移到 Loop 语 句之 后的 语 句 。当 Exit Do 用 在 嵌套 的 Do……Loop 循环中时, Exit Do 会将控制权转移到 Exit Do 所在位置的外层循环。 Exit For 提 供 一 种 退 出 For 循 环 的 方 法 , 并 且 只 能 在 For……Next 或 For Each……Next 循环中使用。Exit For 清风读月 会将控制权转移到 Next 之后的语句。 Exit For 用 当 在嵌套的 For 循环中时,Exit For 将控制权转移到 Exit For 所在位置的外层循环。 Exit Function 立即从包含该语句的 Function 过程中退出。程序会 从调用 Function 的语句之后的语句继续执行。 Exit Property 立即从包含该语句的 Property 过程中退出。程序会 从调用 Property 过程的语句之后的语句继续执行。 Exit Sub 立即从包含该语句的 Sub 过程中退出。程序会从调 用 Sub 过程的语句之后的语句继续执行。 说明 不要将 Exit 语句与 End 语句搞混了。Exit 并不说明一个结构的终 止。 Exit 语句示例 本示例使用 Exit 语句退出 For……Next 循环、Do……Loop 循环及子过 程。 Sub ExitStatementDemo() Dim I, MyNum Do For I = 1 To 1000 ' 建立无穷循环。 ' 循环 1000 次。 ' 生成一随机数码。 MyNum = Int(Rnd * 1000) 清风读月 Select Case MyNum Case 7: Exit For ' 检查随机数码。 ' 如果是 7,退出 For……Next 循环。 ' 如果是 29,退出 Do……Loop Case 29: Exit Do 循环。 Case 54: Exit S

ub End Select Next I Loop End Sub ' 如果是 54,退出子过程。 22、GoSub……Return 语句 在一个过程中跳到另一个子程序中执行,执行后再返回。 语法 GoSub line …… line …… Return 必要的 line 参数可以是任何行标签或行号。 说明 可以在过程中的任何地方使用 GoSub 和 Return,但是 GoSub 和与 之相应的 Return 语句必须放在同一个过程中。一个子程序中可以包 清风读月 含一个以上的 Return 语句,但是当碰到第一个 Return 语句时,程 序就会返回到紧接在刚刚执行的 GoSub 语句之后的语句继续执行。 注意 不能使用 GoSub……Return 来进入或退出 Sub 过程。 提示 创建分开的过程,并使用 GoSub……Return 来调用,可以使程序 更具结构化。 GoSub……Return 语句示例 本示例使用 GoSub 来调用子过程里的一段子程序。 Return 语句则将 执行返回到 GoSub 的下一个语句。Exit Sub 语句则是用来避免控制 意外进入该子程序的情形发生。 Sub GosubDemo() Dim Num ' 请求用户输入一个数字。 Num = InputBox("Enter a positive number to be divided by 2.") ' 如果用户输入一个正整型,则使用子程序。 If Num > 0 Then GoSub MyRoutine Debug.Print Num Exit Sub MyRoutine: Num = Num/2 Return End Sub ' 将数除以 2。 ' 使用 Exit 命令来避免错误发生。 ' 将控制返回 GoSub 之后的语句。 清风读月 23、GoTo 语句 无条件地转移到过程中指定的行。 语法 GoTo line 必要的 line 参数可以是任意的行标签或行号。 说明 GoTo 只能跳到它所在过程中的行。 注意 太多的 GoTo 语句,会使程序代码不容易阅读及调试。尽可能 使用结构化控制语句(Do……Loop、For……Next、If……Then……Else、Select Case)。 GoTo 语句示例 本示例使用 GoTo 语句在一个过程内的不同程序段间作流程控制, 不同程序段用不同的“程序标签”来区隔。 Sub GotoStatementDemo() Dim Number, MyString Number = 1 ' 设置变量初始值。 ' 判断 Number 的值以决定要完成那一个程序区段(以“程序标 签”来表式)。 If Number = 1 Then GoTo Line1 Else GoTo Line2 Line1: MyString = "Number equals 1" 清风读月 GoTo LastLine Line2: ' 完成最后一行。 ' 下列的语句根本不会被完成。 MyString = "Number equals 2" LastLine: Debug.Print MyString 即”窗口。 End Sub ' 将“"Number equals 1"”显示在“立 24、Input # 语句 从已打开的顺序文件中读出数据并将数据指定给变量。 语法 Input #filenumber, varlist Input # 语句的语法具有以下几个部分: 部分 描述 filenumber 必要。任何有效的文件号。 varlist 必要。用逗号分界的变量列表,将文件中读出的值分配 给这些变量;这些变量不可能是一个数组或对象变量。 但是,可以使用变量描述数组元素

或用户定义类型的元 素。 清风读月 说明 通常用 Write # 将 Input # 语句读出的数据写入文件。 该语句只能用 于以 Input 或 Binary 方式打开的文件。 在读出数据时不经修改就可直接将标准的字符串或数值数据指定给 变量。下表说明如何处理其它输入数据: 数据 分隔逗号或空白行 #NULL# #TRUE# or #FALSE# Empty Null True 或 False 指定给变量的值 #yyyy-mm-dd hh:mm:ss# 用表达式表示的日期与/或时间 #ERROR errornumber# errornumber(此变量是一个 Variant,用来 标记错误) 输入数据中的双引号符号 (" ") 将被忽略。 注意 不能写入包含了内嵌引号的字符串,例如,用 Input # 语句写 入 "1,2""X" :Input # 会把这个字符串当作两个完全分开的字符串。 文件中数据项目的顺序必须与 varlist 中变量的顺序相同,而且与相 同数据类型的变量匹配。如果变量为数值类型而数据不是数值类型, 则指定变量的值为零。 清风读月 在输入数据项目时,如果已到达文件结尾,则会终止输入,并产生一 个错误。 注意 为了能够用 Input # 语句将文件的数据正确读入到变量中,在 将数据写入文件时,要使用 Write # 语句而不使用 Print # 语句。使 用 Write # 语句可以确保将各个单独的数据域正确分隔开。 Input # 语句示例 本示例使用 Input # 语句将文件内的数据读入两个变量中。本示例假 设 TESTFILE 文件内含数行以 Write # 语句写入的数据;也就是说, 每一行数据中的字符串部分都是用双引号括起来, 而与数字用逗号隔 开,例如,("Hello", 234)。 Dim MyString, MyNumber Open "TESTFILE" For Input As #1 Do While Not EOF(1) ' 打开输入文件。 ' 循环至文件尾。 ' 将数据读入两个变量。 ' 在立即窗口中显示数据。 Input #1, MyString, MyNumber Debug.Print MyString, MyNumber Loop Close #1 ' 关闭文件。 25、Let 语句 将表达式的值赋给变量或属性。 语法 [Let] varname = expression 清风读月 Let 语句的语法包含下面部分: 部分 Let 描述 可选的。显式使用 Let 关键字也是一种格式,但通常都 省略该关键字。 varname expression 必需的。变量或属性的名称;遵循标准变量命名约定。 必需的。赋给变量或属性的值。 说明 只有当表达式是一种与变量兼容的数据类型时, 该表达式的值才可以 赋给变量或属性。不能将字符串表达式的值赋给数值变量,也不能将 数值表达式的值赋给字符串变量。如果这样做,就会在编译时间出现 错误。 可以用字符串或数值表达式赋值给 Variant 变量, 但反过来不一定正 确。任何除 Null 之外的 Variant 都可以赋给字符串变量,但只有当 Variant 的值可以解释为某个数时才能赋给数值变量。可以使用 IsNumeri

c 函数来确认 Variant 是否可以转换为一个数。 小心 将一种数值类型的表达式赋给另一种数值类型的变量时,会强 制将该表达式的值转换为结果变量的数值类型。 Let 语句可以将一个记录类型的变量赋给属于同一用户定义类型的 变量。使用 LSet 语句可以给不同用户自定义类型的记录变量赋值。 使用 Set 语句可以将对象引用赋给变量。 清风读月 Let 语句示例 该示例使用显式的 Let 语句将表达式的值赋给变量。 Dim MyStr, MyInt '下面的变量赋值使用了 Let 语句。 Let MyStr = "Hello World" Let MyInt = 5 下面是没有使用 Let 语句的相同赋值。 Dim MyStr, MyInt MyStr = "Hello World" MyInt = 5 26、Load 语句 装载一对象但却不显示。 语法 Load object object 代表对象表达式,其值为“应用于”列表中的对象。 说明 在装载对象时会先把它放入内存中,但却是不可见的。必须用 Show 方法使对象可见。在对象成为可见的之前,用户不能与之交互作用。 您可以在 Initialize 事件过程中用程序操控对象。 Load 语句示例 清风读月 下列示例在 UserForm1 的 Initialize 事件期间加载 UserForm2 。单 击 UserForm2 就可将 UserForm1 显示出来。 ' UserForm1 的 Initialize 事件过程 Private Sub UserForm_Initialize() Load UserForm2 UserForm2.Show End Sub ' UserForm2 的 Click 事件 Private Sub UserForm_Click() UserForm2.Hide End Sub ' UserForm1 的 Click 事件 Private Sub UserForm_Click() UserForm2.Show End Sub 27、Name 语句 重新命名一个文件、目录、或文件夹。 语法 Name oldpathname As newpathname Name 语句的语法具有以下几个部分: 部分 描述 清风读月 oldpathname 必要参数。字符串表达式,指定已存在的 文件名和位置,可以包含目录或文件夹、 以及驱动器。 newpathname 必要参数。字符串表达式,指定新的文件 名和位置,可以包含目录或文件夹、以及 驱动器。而由 newpathname 所指定的文 件名不能存在。 说明 Name 语句重新命名文件并将其移动到一个不同的目录或文件夹中。 如有必要,Name 可跨驱动器移动文件。 但当 newpathname 和 oldpathname 都在相同的驱动器中时,只能重新命名已经存在的目录 或文件夹。 Name 不能创建新文件、目录或文件夹。 在一个已打开的文件上使用 Name,将会产生错误。必须在改变名称 之前,先关闭打开的文件。Name 参数不能包括多字符 (*) 和单字符 (?) 的统配符。 Name 语句示例 本示例使用 Name 语句来更改文件的名称。示例中假设所有使用到 的目录或文件夹都已存在。 在 Macintosh 中,默认驱动器名称是 “HD” 并且路径部分由冒号取代反斜线隔开。 Dim OldName, NewName 清风读月 OldName = "OLDFILE": NewName = "NEWFILE" Name OldNa

me As NewName ' 更改文件名。 ' 定义文件名。 OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE" Name OldName As NewName ' 更改文件名,并移动文件。 28、On……GoSub、On……GoTo 语句 根据表达式的值,转到特定行执行。 语法 On expression GoSub destinationlist On expression GoTo destinationlist On……GoSub 和 On……GoTo 语句的语法具有以下几个部分: 部分 expression 描述 必要参数。 数值表达式, 其运算结果应该是一个界于 0 到 255 之 间 的 整 数 , 包 含 0 和 255 。 如 果 expression 的计算结果不是一个整数,则它会先四舍 五入为一个整数。 destinationlist 必要参数。 行号或行标签的列表, 之间要以逗号隔开。 说明 清风读月 expression 的值会决定转到 destinationlist 中的哪一行。如果 expression 的值小于 1 或大于列表的项目个数,则会产生下面的结 果之一: 如果表达式的值 等于 0 则 控制权会转移到 On……GoSub 或 On……GoTo 之 后的语句。 大于串的项目个数 控制权会转移到 On……GoSub 或 On……GoTo 之 后的语句。 负数 大于 255 会发生错误。 会发生错误。 可以在同一个列表中混合使用行号和行标签。在 On……GoSub 和 On……GoTo 中也可随意使用任意个行号和行标签。但是,如果使用了 太多的行标签或行号,以至于在一行中放不下,那么就必须在一行后 使用续行符来衔接到下一行。 提示 若要执行多重分支,Select Case 提供了一种结构化与适应性更 强的方法。 On……GoSub 及 On……GoTo 语句示例 本示例使用 On……GoSub 及 On……GoTo 语句来完成不同的子程序或 程序区段。 Sub OnGosubGotoDemo() 清风读月 Dim Number, MyString Number = 2 ' 设置变量初值。 ' Branch to Sub2. On Number GoSub Sub1, Sub2 会回到此处来继续完成。 On Number GoTo Line1, Line2 ' 完成 Line2 标记之区段。 ' 在 On……GoSub 退出後, 程序 ' 在 On……GoTo 退出之后,程序不会回到此处来。 Exit Sub Sub1: MyString = "In Sub1" : Return Sub2: MyString = "In Sub2" : Return Line1: MyString = "In Line1" Line2: MyString = "In Line2" End Sub 29、Open 语句 能够对文件输入/输出 (I/O)。 语法 清风读月 Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] Open 语句的语法具有以下几个部分: 部分 pathname 描述 必要。字符串表达式,指定文件名,该文件名可能还包 括目录、文件夹及驱动器。 mode 必要。 关键字, 指定文件方式, Append、 有 Binary、 Input、 Output 、 或 Random 方 式 。 如 果 未 指 定 方 式 , 则 以 Random 访问方式打开文件。 access 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 Read Write 操作。 lock 可选。关键字,说明限

定于其它进程打开的文件的操作, 有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。 filenumber 必要。一个有效的文件号,范围在 1 到 511 之间。使 用 FreeFile 函数可得到下一个可用的文件号。 reclength 可选。小于或等于 32,767(字节)的一个数。对于用 随机访问方式打开的文件,该值就是记录长度。对于顺 序文件,该值就是缓冲字符数。 清风读月 说明 对文件做任何 I/O 操作之前都必须先打开文件。 Open 语句分配一个 缓冲区供文件进行 I/O 之用,并决定缓冲区所使用的访问方式。 如果 pathname 指定的文件不存在,那么,在用 Append、Binary、 Output、或 Random 方式打开文件时,可以建立这一文件。 如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。 如果 mode 是 Binary 方式,则 Len 子句会被忽略掉。 重要 在 Binary、Input 和 Random 方式下可以用不同的文件号打开 同一文件,而不必先将该文件关闭。在 Append 和 Output 方式下, 如果要用不同的文件号打开同一文件, 则必须在打开文件之前先关闭 该文件。 Open 语句示例 本示例示范 Open 语句的不同用法来做到文件的输出与输入。 下列代码以顺序输入模式打开 TESTFILE 文件。 Open "TESTFILE" For Input As #1 ' 若要以其他方式打开文件,必需先关闭此文件。 Close #1 下列代码以只允许写操作的二进制方式打开文件。 Open "TESTFILE" For Binary Access Write As #1 ' 若要以其他方式打开文件,必需先关闭此文件。 Close #1 清风读月 下列代码以随机方式打开文件,文件中含有用户自定义数据类型 Record 的记录。 Type Record ' 定义用户自定义数据类型。 ID As Integer Name As String * 20 End Type Dim MyRecord As Record ' 声明变量。 Open "TESTFILE" For Random As #1 Len = Len(MyRecord) ' 若要以其他方式打开文件,必需先关闭此文件。 Close #1 下列代码以顺序输出方式打开文件;任何过程都可以读写该文件。 Open "TESTFILE" For Output Shared As #1 ' 若要以其他方式打开文件,必需先关闭此文件。 Close #1 下列代码以只允许读的二进制方式打开文件; 其他过程不可以读该文 件。 Open "TESTFILE" For Binary Access Read Lock Read As #1 30、Rem 语句 用来在程序中包含注释。 语法 清风读月 Rem comment 也可以使用如下语法: ' comment comment 参数是可选的,指要包括的任何注释文本。在 Rem 关键字 与 comment 之间要加一个空格。 说明 如果使用行号或行标签,则可以从 GoTo 或 GoSub 语句转到一个 Rem 语句行。程序会从该 Rem 语句下面的第一条可执行语句继续 执行。如果在其它语句行后使用 Rem 关键字,则必须使用冒号 (:) 与

语句隔开。 可以用一个撇号 (') 来代替 Rem 关键字。若使用撇号,则在其它语 句行使用时不必加冒号。 Rem 语句示例 该示例说明用来在程序中包含注释的 Rem 语句的各种格式。 Dim MyStr1, MyStr2 MyStr1 = "Hello":Rem 注释在语句之后要用冒号隔开。 MyStr2 = "Goodbye" '这也是一条注释;无需使用冒号。 31、Stop 语句 暂停执行。 语法 Stop 清风读月 说明 可以在过程中的任何地方放置 Stop 语句,使用 Stop 语句,就相当 于在程序代码中设置断点。 Stop 语句会暂停程序的执行,但是它不像 End,因为 Stop 不会关 闭任何文件,或清除变量,除非它是以编译后的可执行文件 (.EXE) 方式来执行。 Stop 语句示例 本示例使用 Stop 语句来暂停 For……Next 循环里的每一次完成。 Dim I For I = 1 To 10 Debug.Print I Stop Next I ' 开始 For……Next 循环。 ' 将 I 的值显示到“立即”窗口。 ' 每一次的完成都会在此暂停。 32、Time 语句 设置系统时间。 语法 Time = time 必要的 time 参数,可以是任何能够表示时刻的数值表达式、字符串 表达式或它们的组合。 说明 清风读月 如果 time 是一字符串,则 Time 会试着根据系统指定的时间,利用 时间分隔符将其转换成一个时间。如果无法转换成一个有效的时间, 则会导致错误发生。 Time 语句示例 本示例使用 Time 语句来设置系统时间。 Dim MyTime MyTime = #4:35:17 PM# Time = MyTime ' 指定一时间。 ' 将系统时间设置为 MyTime 的内容。 33、While……Wend 语句 只要指定的条件为 True,则会重复执行一系列的语句。 语法 While condition [statements] Wend While……Wend 语句的语法具有以下几个部分: 部分 condition 描述 必要参数。数值表达式或字符串表达式,其计算结果为 True 或 False。 如果 condition 为 Null, condition 会 则 视为 False。 statements 可选参数。一条或多条语句,当条件为 True 时执行。 清风读月 说明 如果 condition 为 True,则所有的 statements 都会执行,一直执行 到 Wend 语句。然后再回到 While 语句,并再一次检查 condition, 如果 condition 还是为 True,则重复执行。如果不为 True,则程序 会从 Wend 语句之后的语句继续执行。 While……Wend 循环也可以是多层的嵌套结构。每个 Wend 匹配最近 的 While 语句。 提示 Do……Loop 语句提供了一种结构化与适应性更强的方法来执行 循环。 While……Wend 语句示例 本示例使用 While……Wend 语句来增加计数变量的值。如果条件判断 值为 True,则循环内的语句将一直执行下去。 Dim Counter Counter = 0 ' 设置变量初值。 ' 测试计数器的值。 ' 将计数器的值加一。 While Counter < 20 Counter = Counter + 1 Wend ' 当 Counter > 19 时则

循环终止。 ' 在“立即”窗口中显示数字 20。 Debug.Print Counter (二)逻辑语句 1、 If……Then……Else 语句 清风读月 根据条件的值,可使用 If……Then……Else 语句运行指定的语句或 一个语句块。If……Then……Else 语句可根据需要嵌套多级。然而,为了 可读性可能会使用 Select Case 语句而不使用多嵌套级的 If……Then……Else 语句。 如果条件为 True 则运行语句 当条件为 True 时,若只要执行一个语句,则可以使用单行的 If……Then……Else 语法。下列的示例显示了单行语法,省略了 Else 关 键字: Sub FixDate() myDate = #2/13/95# If myDate < Now Then myDate = Now End Sub 为了运行多行代码,必须使用多行的语法。而此语法包含 End If 语句,如同下面示例所示: Sub AlertUser(value as Long) If value = 0 Then AlertLabel.ForeColor = "Red" AlertLabel.Font.Bold = True AlertLabel.Font.Italic = True End If End Sub 清风读月 如果条件为 True,运行某些语句;条件为 False,运行其它的 语句 使用 If……Then……Else 语句可以定义两个可执行的语句块:其中 一个块会在条件为 True 时执行; 而另一个块会在条件为 False 时执 行。 Sub AlertUser(value as Long) If value = 0 Then AlertLabel.ForeColor = vbRed AlertLabel.Font.Bold = True AlertLabel.Font.Italic = True Else AlertLabel.Forecolor = vbBlack AlertLabel.Font.Bold = False AlertLabel.Font.Italic = False End If End Sub 如果第一个条件为 False 时,测试第二个条件 如果第一个条件为 False,则可以在 If……Then……Else 语句中加 上 ElseIf 语句来测试第二个条件。例如,下列的函数过程根据工作 分类来计算奖金。如果所有 If 和 ElseIf 语句中条件都是 False,则 会运行跟在 Else 语句之后的语句。 Function Bonus(performance, salary) 清风读月 If performance = 1 Then Bonus = salary * 0.1 ElseIf performance = 2 Then Bonus = salary * 0.09 ElseIf performance = 3 Then Bonus = salary * 0.07 Else Bonus = 0 End If End Function 2、使用 Select Case 语句 当一个表达式与几个不同的值相比较时,可以使用 Select Case 语句来交替使用在 If……Then……Else 语句中的 ElseIf。If……Then……Else 语句会计算每个 ElseIf 语句的不同的表达式,在控制结构的顶部, Select Case 语句只计算表达式一次。 在下面的示例中,Select Case 语句会计算发送给此过程的参数 performance。请注意,每个 Case 语句可以包含一个以上的值,一个 值的范围,或是一个值的组合以及比较运算符。如果 Select Case 语 句与 Case 语句的任何值相匹配,则可选的 Case Else 语句运行。 Function Bonus(performance, salary) Select Case performance Case 1 清风读月 Bonus = salary * 0.1 Case 2, 3 Bonus = salary * 0.09 Case 4 To 6 Bonus = salary * 0.07 Case Is > 8 Bon

us = 100 Case Else Bonus = 0 End Select End Function 3、使用 For……Next 语句 可以使用 For……Next 语句去重复一个语句块,而它的次数的数 字是指定的。For 循环使用一个计数变量,当重复每个循环时它的值 会增加或减少。 下面的过程会让计算机发出哔声 50 次。For 语句会指定计数 变量 x 的开始与结束值。Next 语句会将计数变量的值加 1。 Sub Beeps() For x = 1 To 50 Beep Next x End Sub 清风读月 使用 Step 关键字,可以由所指定的值增加或减少计数变量。 在下面的示例中,计数变量 j 会在每次循环重复时加上 2。当循环 完成时,total 的值为 2、4、6、8 和 10 的总合。 Sub TwosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "The total is " & total End Sub 为了减少计数变量的值,可以使用负的 Step 值。为了减少计 数变量的值,必须指定一个小于开始值的结束值。在下面的示例中, 计数变量 myNum 会在每次循环重复时减去 2。 当循环完成时,total 的值为 16、14、12、10、8、6、4 和 2 的总合。 Sub NewTotal() For myNum = 16 To 2 Step -2 total = total + myNum Next myNum MsgBox "The total is " & total End Sub 注意 在 Next 语句后面不必包含计数变量的名称。 上述的示例 中,因为要具有可读性才加上计数变量的名称。 清风读月 可以在计数变量到达它的结束值之前, 使用 Exit For 语句来退 出 For……Next 语句。 例如, 当错误发生时, 可以使用在 If……Then……Else 语句或是 Select Case 语句的 True 语句块中的 Exit For 语句,它 是专门用来检查此错误的。 如果没有错误发生, If……Then……Else 语 则 句的值为 False,循环会象预期那样的运行。 4、For Each……Next 语句 For Each……Next 语句会重复一个语句块,而它是作用于集合中 的每个对象或是数组中的每个元素。当循环执行一次则 Visual Basic 会自动设置一个变量。例如,下面的过程会关闭所有的窗体,除了窗 体包含的过程正在运行以外。 Sub CloseForms() For Each frm In Application.Forms If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close Next End Sub 下面的代码会在数组的每个元素中循环,并且将每个值设置成 它的索引变量 I 的值。 Dim TestArray(10) As Integer, I As Variant For Each I In TestArray TestArray(I) = I Next I 对某范围的单元格做循环 清风读月 可以使用 For Each……Next 循环对某范围的单元格做循环。下 面的过程会对于 Sheet1 中的 A1:D10 范围做循环, 并将任何绝对值 小于 0.01 的号码设为 0。 Sub RoundToZero() For Each myObject in myCollection If Abs(myObject.Value) < 0.01 Then myObject.Value = 0 Next End Sub 在完成前退出 For Each……Next 循环 可以使用 Exit For 语句来退出 For Each……Next 循环。例如, 当错误

发生时可以在 If……Then……Else 语句或是 Select Case 语句的 True 语句块中使用 Exit For 语句,它是专门用来检查此错误的。 如果没有错误发生,If……Then……Else 语句的值为 False,则循环会象 预期那样运行。 下面的示例,测试在 A1:B5 范围内找出第一个不含数值的单 元。如果有找到此类单元,则会有信息显示并用 Exit For 语句退出 循环。 Sub TestForNumbers() For Each myObject In MyCollection If IsNumeric(myObject.Value) = False Then MsgBox "Object contains a non-numeric value." Exit For 清风读月 End If Next c End Sub 5、 Do……Loop 语句 可以使用 Do……Loop 语句去运行语句的块,而它所用掉的时间 是不确定的。当条件为 True 或直到条件变成 True 时,此语句会 一直重复。 直到条件为 True 时重复语句 当使用 While 关键字去检查 Do……Loop 语句中的条件时,可 以有两种方法。可以在进入循环之前检查条件式,也可以在循环至少 运行一次之后才检查条件式。 在下面的 ChkFirstWhile 过程中,在进入循环之前检查条件。 如果将 myNum 的值由 20 替换成 9,则循环中的语句将永远不会 运行。 在 ChkLastWhile 过程中,在条件变成 False 之前循环中的 语句只执行一次。 Sub ChkFirstWhile() counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop 清风读月 MsgBox "The loop made " & counter & " repetitions." End Sub Sub ChkLastWhile() counter = 0 myNum = 9 Do myNum = myNum - 1 counter = counter + 1 Loop While myNum > 10 MsgBox "The loopmade " & counter & " repetitions." End Sub 直到条件变成 True 才重复语句 当使用 Until 关键字去检查 Do……Loop 语句中的条件时, 可以 使用两种方法。 可以在进入循环之前检查条件 (如同 ChkFirstUntil 过 程所示),也可以在循环至少运行一次之后才检查条件(如同 ChkLastUntil 过程所示)。当条件仍然为 False 时,循环继续。 Sub ChkFirstUntil() counter = 0 myNum = 20 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 清风读月 Loop MsgBox "The loop made " & counter & " repetitions." End Sub Sub ChkLastUntil() counter = 0 myNum = 1 Do myNum = myNum + 1 counter = counter + 1 Loop Until myNum = 10 MsgBox "The loop made " & counter & " repetitions." End Sub 从循环内退出 Do……Loop 语句 可以使用 Exit Do 语句来退出 Do……Loop 语句。例如,为了退 出无穷循环,可以在 If……Then……Else 语句或是 Select Case 语句的 True 语句块中使用 Exit Do 语句。如果条件为 False,则循环会象 通常那样运行。 在下面的示例中,myNum 被赋予一个会造成无穷循环的值。 而 If……Then……Else 语句会去检查这个情况然后退出,以避免无穷循 环。 Sub ExitExample() counter = 0 清风读月 myNum = 9 Do Until myNum = 10 myNu

m = myNum - 1 counter = counter + 1 If myNum < 10 Then Exit Do Loop MsgBox "The loop made " & counter & " repetitions." End Sub 注意 可以按 ESC 或 CTRL+BREAK 键来终止无穷循环。 6、 With 语句 在一个单一对象或一个用户定义类型上执行一系列的语句。 语法 With object [statements] End With With 语句的语法具有以下几个部分: 部分 描述 必要参数。一个对象 或用户自定义类型的名称。 obje ct 清风读月 stat ements 可选参数。要执行在 object 上的一条或多条语 句。 With 语句可以对某个对象执行一系列的语句, 而不用重复指出 对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制 结构中加上属性的赋值语句, 这时候只是引用对象一次而不是在每个 属性赋值时都要引用它。 下面的例子显示了如何使用 With 语句来给 同一个对象的几个属性赋值。 With 语句让您指定一系列的语句中的一个对象或用户定义类 型。With 语句使过程运行得更快并且帮助避免反复的键入代码。 下面的示例将某一范围的单元格都填入 30,字体使用黑体格 式,并将内部单元格颜色设置成黄色。 Sub FormatRange() With Worksheets("Sheet1").Range("A1:C10") .Value = 30 .Font.Bold = True .Interior.Color = RGB(255, 255, 0) End With End Sub 可以将 With 语句嵌套的使用,如此将更具有效率。下面的示 例在 A1 这个存储单元格中插入一个公式,然后格式化字体。 Sub MyInput() 清风读月 With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1) .Formula = "=SQRT(50)" With .Font .Name = "Arial" .Bold = True .Size = 8 End With End With End Sub (三)过程 1、写 Sub 过程 Sub 过程是一系列由 Sub 和 End Sub 语句所包含起来的 Visual Basic 语句,它们会执行动作却不能返回一个值。Sub 过程可 有参数, 例如常数、 变量、 或是表达式等来调用它。 如果一个 Sub 过 程没有参数,则它的 Sub 语句必须包含一个空的圆括号。 下面 Sub 过程中,每一行都有注释来解释它的作用: '声明过程命名为 GetInfo '该 Sub 过程没有参数 Sub GetInfo() '声明字符串变量命名为 answer Dim answer As String 清风读月 '指定 InputBox 函数的返回值给 answer answer = InputBox(Prompt:="What is your name?") '条件 If……Then……Else 语句 If answer = Empty Then '调用 MsgBox 函数 MsgBox Prompt:="You did not enter a name." Else 'MsgBox 函数与 answer 变量连接。 MsgBox Prompt:="Your name is " & answer '结束 If……Then……Else 语句 End If '结束 Sub 过程 End Sub 2、写 Function 过程 Function 过程是一系列由 Function 和 End Function 语句所 包含起来的 Visual Basic 语句。Function 过程和 Sub 过程很类似, 但函数可以返回一个值。Function 过程可经由调用者过程通过传递

参数,例如常数、变量、或是表达式等来调用它。如果一个 Function 过程没有参数,它的 Function 语句必须包含一个空的圆括号。函数 会在过程的一个或多个语句中指定一个值给函数名称来返回值。 在下面的示例中,Celsius 函数会根据华式温度来计算摄氏温 度。当 Main 过程调用此函数时,会有一包含参数值的变量传递给 清风读月 此函数。而计算的结果会返回到调用的过程,并且显示在一个消息框 中。 Sub Main() temp = Application.InputBox(Prompt:= _ "Please enter the temperature in degrees F.", Type:=1) MsgBox "The temperature is " & Celsius(temp) & " degrees C." End Sub Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End Function 3、写 Property 过程 Property 过程是一系列的 Visual Basic 语句, 它允许程序员去 创建并操作自定义的属性。 Property 过程可以用来为窗体,标准模块,以及类模 块创建只读属性。 Property 过程可被用来在代码中代替 Public 变量, 当 设置属性值时上述动作应被执行。 与 Public 变量不同,在“对象浏览器”中 Property 过 程会有一些的帮助字符串指定给它们。 当创建一个 Property 过程时,它会变成此过程所包含的模块 的一个属性。Visual Basic 提供下列三种类型的 Property 过程: 程序 描述 清风读月 Prope rty Let Prope rty Get Prope rty Set 用来设置属性值的过程。 用来返回属性值的过程。 用来设置对对象引用的过程。 声明 Property 过程的语法如下所示: [Public | Private] [Static] Property {Get | Let | Set} propertyname_ [(arguments)] [As type] statements End Property Property 过程通常是成对使用的:Property Let 与 Property Get 一组,而 Property Set 与 Property Get 一组。单独声明一个 Property Get 过程就象声明只读属性。 三个 Property 过程一起使用 时,只有对 Variant 变量有用,因为只有 Variant 才能包含一个对 象或其它数据类型的信息。Property Set 本意是使用在对象上;而 Property Let 则不是。 在 Property 过程声明中所需要的参数都列在下表中: 程序 Prope 声明语法 Property Get propname(1, ……, n) As type 清风读月 rty Get Prope rty Let Prope rty Set 在具有相同名称的 Property 过程中,从第一个到最后一个参 数(1, ……, n)都必须共享相同的名称与数据类型。 Property Get 过程声明时所需的参数比相关的 Property Let 以及 Property Set 声明少一个。Property Get 过程的数据类型必须 与相关的 Property Let 以及 Property Set 声明中的最后 (n+1) 个 参数的类型相同。例如,如果声明下列的 Property Let 过程,则 Property Get 声明所使用参数的名称与数据类型必须 Property Let 过程中所用一样。 Property Let Names(intX As

Integer, intY As Integer, varZ As Variant) ' Statement here. End Property Property Get Names(intX As Integer, intY As Integer) As Variant ' Statement here. End Property Property Set propname(1, ……, n, n+1) Property Let propname(1, ……,,,, n, n+1) 清风读月 在 Property Set 声明中, 最后一个参数的数据类型必须是对象 类型或是 Variant。 四、 ActiveX 控件 通过为控件中编写相应的宏,可以使用 ActiveX 控件自动执行 某项操作。 1) 如果要为工作表或窗体中的 ActiveX 控件创建相应的 宏,请先确认“控件工具箱”处于显示状态。如果要显示“控件工 具箱”,请用鼠标指向“视图”菜单中的“工具栏”子菜单,然后单 击“控件工具箱”命令。 2)单击“设计模式”按钮。 3) 如果要编写或更改控件的宏, 请用鼠标右键单击控件, 然后单击快捷菜单中的“查看代码”命令。 4)在“Visual Basic 编辑器”中编写所需的宏代码。 5)编写完宏代码后,请单击“文件”菜单中的“关闭并返回 到 Microsoft Excel”命令。 6)在完成控件设计之后,请单击“退出设计模式”按钮 。 1、AfterUpdate 事件 在通过用户界面更改了控件中的数据后,此事件发生。 语法 Private Sub object_AfterUpdate( ) 清风读月 AfterUpdate 事件的语法包含以下成分: 成 分 obj ect 说明 AfterUpdate 事件的发生与该控件是否被连接(即通过 RowSource 属性为该控件指定一个数据源)无关。这个事件不能被 取消。如果你想取消这次更改(恢复控件原来的值),请使用 BeforeUpdate 事件,并将参数 Cancel 设置为 True。 对于当前控件来说,AfterUpdate 事件发生在 BeforeUpdate 事 件之后,Exit 事件之前。对于 Tab 键次序中的下一个控件来说, AfterUpdate 事件发生在 Enter 事件之前。 2、Click 事件 下面两种情况下,发生该事件: ? 描述 必需。一个有效的 对象。 用鼠标单击控件。 用户最终在几种可能的值中为控件选择一个值。 语法 对于多页和 TabStrip Private Sub object_Click( index As Long) 清风读月 对于所有的其他控件 Private Sub object_Click( ) Click 事件的语法包含以下成分: 成 分 obj ect ind ex 必需。 与该事件相关联的多页或 TabStrip 中的页或 标签的索引。 必需。一个有效的对象。 描述 说明 在导致 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 事件。 3、Click 事件、命令按钮控件、Accelerator 和 Caption 属性 示例 每当用户用鼠标或加速键来单击按钮时,该示例都将改变一次 命令按钮的 Accelerator 和 Caption 属性。Click 事件包含改变 Accelerator 和 Caption 属性的代码。 若要使用该示例,请将代码粘贴到包含名为 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" Comman

dButton1.Accelerator= "O" '将加速键设置为 COMMAND + O End If End Sub 4、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 事件的语法有以下几个成分: 成 分 描述 清风读月 obj ect ind ex Ca ncel 必需。一个有效的对象。 必需。在 Pages 或 Tabs 集合里的 Page 或 Tab 对象的位置。 必需。事件状态。False 表示由控件处理该事件(这 是默认方式) 。True 表示由应用程序处理该事件。 说明 要使该事件发生,这两次击键必须发生在由系统的双击速度的 设置所限定的时间范围之内。 对于支持 Click 的控件,DblClick 事件前发生的一系列事件 有: 1. MouseDown 2. MouseUp 3. Click 4. DblClick 如果一个控件(例如文本框)不支持 Click 事件,则忽略上述 事件序列中的 Click 事件。 如果双击时 Cancel 的返回值为 True, 则控件将忽略第二次单 击。如果第二次单击与第一次单击的作用相反,这是非常有用的,比 如双击一个切换按钮。Cancel 参数允许窗体忽略第二次单击,因此 无论是单击还是双击按钮都有同样的作用。 清风读月 5、Error 事件 当控件检测到一个错误,并且不能将该错误信息返回调用程序 时该事件发生。 语法 对于多页: Private Sub object_Error( index As Long, ByVal Number As Integer, ByVal Description As MSForms.ReturnString, ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean) 对于其他控件: Private Sub object_Error( ByVal Number As Integer, ByVal Description As MSForms.ReturnString, ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean) Error 事件的语法包含以下成分: 成分 object index Number 描述 必需。一个有效的对象名。 必需。与此事件相关的多页中的页面的索引。 必需。指定控件用来标识该错误的唯一的值。 清风读月 Descripti on SCode 必需。对错误的文字描述。 必需。 为错误指定一个 OLE 状态码。 16 位 低 指定的值等于 Number 参数的值。 Source HelpFile 必需。标识初始化该事件的控件的字符串。 必需。指定了描述该错误的帮助文件的完整路 径名。 HelpCon text CancelDi splay 说明 必需。指定一个帮助文件主题的上下文 ID, 该主题中含有对该错误的说明。 必需。指定是否在消息框中显示该错误串。 为 Error 事件编写的代码决定了该控件如何响应这个错误状 况。 处理错误状况的能

力随应用程序的不同而不同。当一个错误发 生而应用程序没有能力进行处理时,Error 事件被初始化。 6、KeyDown 和 KeyUp 事件 按下和释放某键时这两个事件依次发生。按下键时发生 KeyDown 事件,而释放键时发生 KeyUp 事件。 语法 清风读月 Private Sub object_KeyDown( ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As fmShiftState) Private Sub object_KeyUp( ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As fmShiftState) KeyDown 和 KeyUp 事件的语法包含以下成分: 成 分 obje ct Key Code Shif t 设置 Shift 的设置如下: 常量 fmShi ftMask fmCtr lMask 2 Ctrl 键被按下。 值 1 描述 Shift 键被按下。 码。 必需。Shift、Ctrl 和 Alt 键的状态。 必需。整数,代表被按下或释放的键的键代 必需。一个有效的对象名。 描述 清风读月 fmAlt Mask 说明 4 Alt 键被按下。 对于一个运行中的窗体,如果该窗体或窗体上的某个控件具有 焦点,则按下键时 KeyDown 事件发生。KeyDown 和 KeyPress 事 件交替重复发生,直至用户释放此键,此刻 KeyUp 事件发生。这个 具有焦点的窗体或控件接收所有的按键操作。 只有在窗体上没有控件 或所有可视控件全部失效时,窗体才可能具有焦点。 应用宏中的 SendKeys 操作或 Visual Basic 中的 SendKeys 语句将按键操作发送到一个窗体或控件时,这些事件也会发生。 KeyDown 和 KeyUp 事件通常用于识别或区分以下各键: ? 扩充的字符键,比如功能键。 翻阅键,如 Home、End、PageUp、PageDown、向上、 向下、向右、向左和 Tab 键。 ? 组合键和标准键盘组合键 (Shift、Ctrl 或 Alt 键)。 数字键区和键盘数字键。 在下列情况下,KeyDown 和 KeyUp 事件不发生: 在带有命令按钮(其 Default 属性为 True )的窗体 上按 Enter 键。 在带有命令按钮(其 Cancel 属性为 True)的窗体上 按 Esc 键。 清风读月 在按下或发送一个 ANSI 键时,KeyDown 和 KeyPress 事件 发生。KeyUp 事件发生在按下或发送该键所引起的任何控件事件之 后。若一次击键导致了焦点从一个控件移到另外一个控件,则对第一 个控件发生 KeyDown 事件,对第二控件发生 KeyPress 和 KeyUp 事件。 和键盘相关的事件序列为: 1. KeyDown 2. KeyPress 3. KeyUp 注意 KeyDown 和 KeyUp 事件仅用于窗体上的窗体和控件。 要解释 ANSI 字符或找出与被按下的键相对应的 ANSI 字符,用 KeyPress 事件。 7、KeyPress 事件 当用户按下一个 ANSI 键时该事件发生。 语法 Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger) KeyPress 事件的语法有以下几个成分: 成 分 obje 必需。一个有效的对象。 描述 清风读月 ct Key ANSI 说明 当用户按下一个键,在运

行的窗体上产生可键入字符(一个 ANSI 键) 而该窗体或该窗体上的某个控件具有焦点时, , KeyPress 事 件发生。这个事件可以发生在该键被释放之前,也可以发生在该键被 释放之后。当用宏的 SendKey 操作或用 Visual Basic 的 SendKeys 语句,将一个 ANSI 键操作发送到窗体或控件的时候,这个事件也 会发生。 KeyPress 事件发生在下列任意键被按下时: ? ? ? ? 必需。整数值,代表标准的数字 ANSI 键代 码。 任何可打印的键盘字符。 Ctrl 键与标准字母表中字符的组合。 Ctrl 键与任何特殊字符的组合。 Backspace 键。 Esc 键。 在下面情况下,KeyPress 事件不发生: ? ? ? 按下 Tab 键。 按下 Enter 键。 按任何箭头键。 引起焦点在控件之间移动的键击操作。 清风读月 注意 Backspace 键是 ANSI 字符集的一部分,而 Delete 键不 是。 在一个控件中用 Backspace 键删除一个字符将引发 KeyPress 事 件;而用 Delete 删除一个字符则不引发 KeyPress 事件。 按住产生 ANSI 键代码的键不放,KeyDown 和 KeyPress 事 件交替重复发生。当释放此键,KeyUp 事件发生。具有焦点的窗体 或控件接收所有的击键操作。只有没有控件的窗体,或者其所有可视 控件都失效的窗体才可能有焦点。 KeyPress 事件的默认操作是处理被按下键所对应的事件代码。 KeyANSI 指出了与所按下的键或组合键相对应的 ANSI 字符。 KeyPress 事件把每个字符的大写和小写解释为互相独立的键码,因 而作为两个独立的字符处理。 为了响应键盘的物理状态,或处理 KeyPress 事件无法辨认的 键击操作,比如功能键、翻阅键、或这些键与键盘组合键(Alt、Shift 或 Ctrl 键)的任意组合,可使用 KeyDown 和 KeyUp 事件过程。 和键盘相关的事件序列有: 1. KeyDown 2. KeyPress 8、KeyPress 事件示例 下例用 KeyPress 事件,把击键值从一个文本框复制到另一个 文本框中。用户在相应标记的文本框中键入内容。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: 清风读月 名为 TextBox1 和 TextBox2 的两个文本框控件。 Private Sub TextBox1_KeyPress(ByVal KeyAscii As _ MSForms.ReturnInteger) TextBox2.Text = TextBox2.Text & Chr(KeyAscii) '为处理键组合(用 Shift, 'Control,Option,Command 以及其他键), '或 Tab 键 或 Enter 键,用 KeyDown 或 KeyUp 事件。 End Sub Private Sub UserForm_Initialize() Move 0, 0, 570, 380 TextBox1.Move 30, 40, 220, 160 TextBox1.MultiLine = True TextBox1.WordWrap = True TextBox1.Text = "Type text here." TextBox1.EnterKeyBehavior = True TextBox2.Move 298, 40, 220, 160 TextBox2.MultiLine = True TextBox2.WordWrap = True TextBox2.Text = "Typed text copied here." TextBox2.Locked = True End Sub 9、Mous

eDown 和 MouseUp 事件 清风读月 用户单击鼠标按钮时发生。用户按下鼠标按键时发生 MouseDown 事件;用户释放鼠标按键时发生 MouseUp 事件。 语法 对于多页和 TabStrip Private Sub object_MouseDown( index As Long, ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) Private Sub object_MouseUp( index As Long, ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) 对于其他控件 Private Sub object_MouseDown( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) Private Sub object_MouseUp( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) MouseDown 和 MouseUp 事件的语法包含以下成分: 成 分 obj ect ind 必需。发生特定事件的多页和 TabStrip 中的页索 必需。一个有效的对象。 描述 清风读月 ex Butt on Shif t X, Y 引或标签索引。 必需。标识引起该事件的鼠标按键的整数值。 必需。规定 Shift、Ctrl 和 Alt 键的状态。 必需。窗体、框架或页的位置的横坐标与纵坐标, 以磅为单位,分别从左侧边缘和顶部边缘开始测量。 设置 Button 的设置如下: 常量 fmButtonL eft fmButton Right fmButton Middle Shift 的设置如下: 成 分 描述 4 按下中键。 2 按下右键。 值 1 按下左键。 描述 清风读月 1 2 3 4 5 6 7 键。 按下 Shift 键。 按下 Ctrl 键。 同时按下 Shift 和 Ctrl 键。 按下 Alt 键。 同时按下 Alt 和 Shift 键。 同时按下 Alt 和 Ctrl 键。 同时按下 Alt 、Shift 和 Ctrl 用于标识键盘组合键的常量: 常量 fmShif tMask fmCtrl Mask fmAlt Mask 说明 对于多页,MouseDown 事件发生在用户在控件上按下鼠标按 钮时。 4 检测 Alt 键的标记。 2 检测 Ctrl 键的标记。 值 1 描述 检测 Shift 键的标记。 清风读月 对于 TabStrip, 索引参数标识用户单击的标签。 索引为 -1 时, 表示用户没有单击标签。例如,如果控件的右上角没有标签,单击右 上角会将索引值置为 -1。 对于窗体,在空白区、记录选择器、或滚动条上按下和释放鼠 标按键会产生 MouseDown 和 MouseUp 事件。 与鼠标有关的事件序列: 1. MouseDown 2. MouseUp 3. Click 4. DblClick 5. MouseUp MouseDown 或者 MouseUp 事件过程规定了按下或释放鼠标 按钮时应执行的动作。MouseDown 和 MouseUp 事件能够区别鼠标 的左、右、中按钮。也可以为使用 Shift、Ctl 和 Alt 键盘组合键的 鼠标—键盘组合编写代码。 如果在鼠标箭头在窗体或控件上时按下鼠标按钮,该对象“捕 捉”鼠标并接收所有的鼠标事件, 直到并包含最后的 MouseUp 事件。 这意味着鼠标事件返回的鼠标箭头的 X,Y 坐标不会总在接收这些 事件的对象的边界之内

。 如果鼠标按键被连续按下,捕捉鼠标的对象接收所有的连续的 鼠标事件,直到所有的按键被释放。 清风读月 用 Shift 参数标识在 MouseDown 或 MouseUp 事件发生时 Shift、 Ctrl 和 Alt 键的状态。 例如, 如果 Ctrl 和 Alt 键被同时按下, 则 Shift 的值为 6。 10、MouseMove 事件 用户移动鼠标时该事件发生。 语法 对于多页和 TabStrip Private Sub object_MouseMove( index As Long, ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) 对于其他控件 Private Sub object_MouseMove( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single) MouseMove 事件的语法包含以下成分: 成 分 obj ect ind ex Bu 必需。 与此事件相关的多页或 TabStrip 中的页或标 签的索引号。 必需。标识鼠标按键状态的整数值。 必需。一个有效的对象名。 描述 清风读月 tton Shi ft X, Y 必需。水平和垂直位置坐标,以磅为单位,从控件的 左侧边缘或顶部开始测量。 设置 index 参数指定了被单击的页。-1 表示用户没有单击任何页或 标签。 Button 的设置如下: 描述 按键未被按下。 按下左键。 按下右键。 同时按下左键和 右键。 按下中键。 同时按下左键和 中键。 同时按下中键和 必需。指定 Shift 、Ctrl 和 Alt 键的状态。 清风读月 右键。 三个按键全都按 下。 Shift 的设置如下: 描述 按下 Shift 键。 按下 Ctrl 键。 同时按下 Shift 和 Ctrl 键。 按下 Alt 键。 同时按下 Alt 和 Shift 键。 同时按下 Alt 和 Ctrl 键。 同时按下 Alt、Shift 和 Ctrl 键。 用于标识各键盘组合键的常量: 常量 fmShif tMask fmCtrl 2 检测 Ctrl 的标记。 值 1 描述 检测 Shift 的标记。 清风读月 Mask fmAlt Mask 说明 MouseMove 事件用于窗体、窗体上面的控件和标签。 当鼠标箭头在对象上移动时, MouseMove 事件连续发生。 只要 鼠标位于对象的边界之内,对象就会不断识别 MouseMove事件, 直 至其他对象“捕捉”到了鼠标为止。 移动窗体也能产生 MouseMove 事件,即使鼠标是静止的。当 窗体在箭头的下移动时, 便会产生 MouseMove 事件。如果一个宏或 者事件过程通过移动窗体以响应 MouseMove 事件, 则该事件会连续 产生(级联的)MouseMove 事件。 如果两个控件靠得很近,且很快将鼠标箭头移过两控件之间的 空间,则对于这个空间 MouseMove 事件可能不会发生。在这种情况 下,就可能需要在两个控件中响应 MouseMove 事件。 可用 Button 参数返回的值标识鼠标按钮的状态。 用 Shift 参数标识 MouseMove 事件发生时的 Shift 键、Ctrl 键和 Alt 键的状态。例如,同时按下 Ctrl 和 Alt 键时,Shift 的值 为 6。 注意可用 MouseDown 和 MouseUp 事件过程响应按

下和释 放鼠标按键引起的事件。 4 检测 Alt 的标记。 清风读月 11、列表框控件 用于显示一些值的列表,用户可以从中选择一个或多个值。 说明 如果将列表框连接到了数据源,则列表框会将用户选择的值保 存到数据源中。 列表框能够以列表形式出现,也能够以一组选项按钮控件或复 选框控件的形式出现。 列表框的默认属性是 Value 属性。 列表框的默认事件是 Click 事件。 注意不能在下拉式的列表框中放入文本。 ListBox 控件、AddItem 和 RemoveItem 方法以及 ListIndex、ListCount 属性示例 下例用 AddItem、RemoveItem 以及 ListIndex 和 ListCount 属性来添加和删除列表框的内容。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: ? 名为 ListBox1 的列表框。 名为 CommandButton1 和 CommandButton2 的两个 命令按钮控件。 Dim EntryCount As Single Private Sub CommandButton1_Click() EntryCount = EntryCount + 1 清风读月 ListBox1.AddItem (EntryCount & " - Selection") End Sub Private Sub CommandButton2_Click() '确认列表框包含列表项 If ListBox1.ListCount >= 1 Then '如果没有选中的内容,用上一次的列表项。 If ListBox1.ListIndex = -1 Then ListBox1.ListIndex = _ ListBox1.ListCount - 1 End If ListBox1.RemoveItem (ListBox1.ListIndex) End If End Sub Private Sub UserForm_Initialize() EntryCount = 0 CommandButton1.Caption = "Add Item" CommandButton2.Caption = "Remove Item" End Sub 12、SpinDown 和 SpinUp 事件 用户单击数值调节钮的向下或向左箭头时发生 SpinDown 事 件。用户单击数值调节钮的向上或向右箭头时发生 SpinUp 事件。 语法 清风读月 Private Sub object_SpinDown( ) Private Sub object_SpinUp( ) SpinDown 和 SpinUp 事件的语法包含以下成分: 成 分 o bject 说明 SpinDown 事件减少 Value 属性。 SpinUp 事件增加 Value 属 性。 13、SpinDown、SpinUp 事件和 Delay 属性示例 下例中,演示当用户按下鼠标按钮来更改数值调节钮或滚动条 的值时,连续的 Change、SpinUp 和 SpinDown 事件之间的时间间 隔。 该示例中,用户选择延时设置,然后单击并按住数值调节钮的 任一边。当 SpinUp 和 SpinDown 事件初始化时,它们被记录在列 表框中。 若要使用该示例,请将该示例代码复制到某窗体的声明变量部 分。请确保该窗体包含: ? 描述 必需。一个有效的对象。 名为 SpinButton1 的数值调节钮。 名为 OptionButton1 和 OptionButton2 的两个选项按 清风读月 钮控件。 名为 ListBox1 的列表框。 Dim EventCount As Long Private Sub ResetControl() ListBox1.Clear EventCount = 0 SpinButton1.Value = 5000 End Sub Private Sub UserForm_Initialize() SpinButton1.Min = 0 SpinButton1.Max = 10000 ResetControl SpinButton1.Delay = 50 Opti

onButton1.Caption = "50 millisecond delay" OptionButton2.Caption = "250 millisecond delay" OptionButton1.Value = True End Sub Private Sub OptionButton1_Click() SpinButton1.Delay = 50 ResetControl End Sub Private Sub OptionButton2_Click() 清风读月 SpinButton1.Delay = 250 ResetControl End Sub Private Sub SpinButton1_SpinDown() EventCount = EventCount + 1 ListBox1.AddItem EventCount End Sub Private Sub SpinButton1_SpinUp() EventCount = EventCount + 1 ListBox1.AddItem EventCount End Sub 14、组合框控件 组合框将列表框和文本框的特性结合在一起。用户可以像在文 本框中那样输入新值,也可以像在列表框中那样选择已有的值。 说明 如果将组合框连接到了数据源,那么组合框会将用户输入或选 择的值插入到该数据源中。如果连接的是多列组合框,那么 BoundColumn 属性将哪个值保存到连接的数据源中。 组合框中的列表由多行数据构成。每行可有一列或多列,列标 题是可有可无的。有些应用程序不支持列标题,还有些只提供有限的 支持。 组合框的默认属性是 Value 属性。 清风读月 组合框的默认事件是 Change 事件。 注意如果希望在任何时候都将列表中的各行数据显示出来,那 么可以使用列表框代替组合框。如果希望在使用组合框时,只使用列 表中列出的值, 可设置组合框的 Style 属性, 以使该控件看上去像下 拉列表框。 组合框控件、 AddItem 方法、 Picture 和 PicturePosition 属性 示例 下例用组合框来显示控件的图片位置选项。每次用户单击列表 选项,命令按钮上的图片和题注都将被更新。这个代码示例还使用了 AddItem 方法来固定组合框选项。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: ? ? 名为 Label1 的标签。 名为 CommandButton1 的命令按钮。 名为 ComboBox1 的组合框。 Private Sub UserForm_Initialize() Label1.Left = 18 Label1.Top = 12 Label1.Height = 12 Label1.Width = 190 Label1.Caption = "Select picture placement " _ & "relative to the caption." 清风读月 '把列表条目加入组合框。每一 '条目的值符合组合框中 '对应的 ListIndex 的值。 ComboBox1.AddItem "Left Top"'ListIndex = 0 ComboBox1.AddItem "Left Center" 'ListIndex = 1 ComboBox1.AddItem "Left Bottom" 'ListIndex = 2 ComboBox1.AddItem "Right Top" 'ListIndex = 3 ComboBox1.AddItem "Right Center"'ListIndex = 4 ComboBox1.AddItem "Right Bottom"'ListIndex = 5 ComboBox1.AddItem "Above Left"'ListIndex = 6 ComboBox1.AddItem "Above Center"'ListIndex = 7 ComboBox1.AddItem "Above Right"'ListIndex = 8 ComboBox1.AddItem "Below Left"'ListIndex = 9 ComboBox1.AddItem "Below Center"'ListIndex = 10 ComboBox1.AddItem "Below Right"'ListIndex = 11 ComboBox1.AddItem "Centered"'ListIndex = 12 '使用下拉列表 ComboBox1.Style = fmStyleDropDownList '组合框

值是 ListIndex 值 ComboBox1.BoundColumn = 0 '把组合框设置为第一个条目 ComboBox1.ListIndex = 0 清风读月 ComboBox1.Left = 18 ComboBox1.Top = 36 ComboBox1.Width = 90 ComboBox1.ListWidth = 90 '初始化 CommandButton1 CommandButton1.Left = 230 CommandButton1.Top = 36 CommandButton1.Height = 120 CommandButton1.Width = 120 '注意:确认引用的位图文件是 '存在于系统中的,并在 '文件名中包括路径 CommandButton1.Picture = _ LoadPicture("c:\windows\argyle.bmp") CommandButton1.PicturePosition = ComboBox1.Value End Sub Private Sub ComboBox1_Click() Select Case ComboBox1.Value Case 0'上左 CommandButton1.Caption = "Left Top" CommandButton1.PicturePosition = _ fmPicturePositionLeftTop 清风读月 Case 1'中左 CommandButton1.Caption = "Left Center" CommandButton1.PicturePosition = _ fmPicturePositionLeftCenter Case 2'下左 CommandButton1.Caption = "Left Bottom" CommandButton1.PicturePosition = _ fmPicturePositionLeftBottom Case 3'上右 CommandButton1.Caption = "Right Top" CommandButton1.PicturePosition = _ fmPicturePositionRightTop Case 4'中右 CommandButton1.Caption = "Right Center" CommandButton1.PicturePosition = _ fmPicturePositionRightCenter Case 5'下右 CommandButton1.Caption = "Right Bottom" CommandButton1.PicturePosition = _ fmPicturePositionRightBottom Case 6'左上 清风读月 CommandButton1.Caption = "Above Left" CommandButton1.PicturePosition = _ fmPicturePositionAboveLeft Case 7'中上 CommandButton1.Caption = "Above Center" CommandButton1.PicturePosition = _ fmPicturePositionAboveCenter Case 8'右上 CommandButton1.Caption = "Above Right" CommandButton1.PicturePosition = _ fmPicturePositionAboveRight Case 9'左下 CommandButton1.Caption = "Below Left" CommandButton1.PicturePosition = _ fmPicturePositionBelowLeft Case 10 '中下 CommandButton1.Caption = "Below Center" CommandButton1.PicturePosition = _ fmPicturePositionBelowCenter Case 11 '右下 CommandButton1.Caption = "Below Right" CommandButton1.PicturePosition = _ 清风读月 fmPicturePositionBelowRight Case 12 '中 CommandButton1.Caption = "Centered" CommandButton1.PicturePosition = _ fmPicturePositionCenter End Select End Sub 15、命令按钮控件 启动、结束或中断一项操作或一系列操作。 说明 为命令按钮的 Click 事件所指定的宏或事件过程决定了命令 按钮可以完成什么操作。例如,可以创建能够打开另一个窗体的命令 按钮。在命令按钮上可以显示文本或图片,或者二者同时显示。 命令按钮的默认属性是 Value 属性。 命令按钮的默认事件是 Click 事件。 Click 事件、命令按钮控件、Accelerator 和 Caption 属性示 例 每当用户用鼠标或加速键来单击按钮时,该示例都将改变一次 命令按钮的 Accelerator 和 Caption 属性。Click 事件包含改变 Accelerator 和 Caption 属性的代码。 若要使用该示例,请将代码粘贴到包含名为 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 Page 对象、命令按钮、多页控件和 ControlTipText 属性示例 下例中,为多页控件中的三个命令按钮控件和两个 Page 对象 定义 ControlTipText 属性。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: 名为 MultiPage1 的多页控件。 清风读月 名为 CommandButton1 到 CommandButton3 的三个 命令按钮控件。 注意 对于多页控件的单个页, 当多页控件或者多页控件的当前 页上的控件有焦点时,ControlTipText 变为有效。 Private Sub UserForm_Initialize() MultiPage1.Page1.ControlTipText = "Here in page 1" MultiPage1.Page2.ControlTipText = "Now in page 2" CommandButton1.ControlTipText = "And now here's" CommandButton2.ControlTipText = "a tip from" CommandButton3.ControlTipText = "your controls!" End Sub 16、标签控件 用于显示描述性文本。 说明 窗体中的标签控件用于显示描述性文本,如标题、题注或简单 的指导信息。例如地址簿的标签可以包括姓名、街道或城市。标签不 能显示来自数据源或表达式的值;它总是非连接的,并且不会随着从 一条记录移到另一条记录而改变。 标签的默认属性是 Caption 属性。 标签的默认事件是 Click 事件。 Style 属性和标签控件示例 清风读月 下例用 Style 属性来指定多页控件和 TabStrip 的标签的外 观。这个示例还演示了使用标签的方法。用户通过选择选项按钮来选 取样式。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: ? 名为 Label1 的标签。 名为 OptionButton1 到 OptionButton3 的三个选项按 钮控件。 ? ? ? 名为 MultiPage1 的多页控件。 名为 TabStrip1 的 TabStrip。 TabStrip 之中的任意控件。 在多页控件的每一页中的任意控件。 Private Sub OptionButton1_Click() MultiPage1.Style = fmTabStyleTabs TabStrip1.Style = fmTabStyleTabs End Sub Private Sub OptionButton2_Click() '注意页面边界是看不见的 MultiPage1.Style = fmTabStyleButtons TabStrip1.Style = fmTabStyleButtons End Sub Private Sub OptionButton3_Click() 清风读月 '注意页面边界是看不见的 '并且页正文开始于标签 '正常出现处 MultiPage1.Style = fmTabStyleNone TabStrip1.Style = fmTabStyleNone End Sub Private Sub UserForm_Initialize() Label1.Caption = "Page/Tab

Style" OptionButton1.Caption = "Tabs" OptionButton1.Value = True MultiPage1.Style = fmTabStyleTabs TabStrip1.Style = fmTabStyleTabs OptionButton2.Caption = "Buttons" OptionButton3.Caption = "No Tabs or Buttons" End Sub 17、列表框控件、DataObject 对象、MouseMove 事件和 StartDrag、SetText 方法示例 下例用 DataObject 来包含拖动文本,演示从一个列表框到另 一个的拖放操作。该代码示例在 MouseMove 事件中使用 SetText 和 StartDrag 方法来完成拖放操作。 清风读月 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含名为 ListBox1 和 ListBox2 的两个列表框控件。 还需在第二个列表框中添加选择。 Private Sub ListBox2_BeforeDragOver(ByVal Cancel As _ MSForms.ReturnBoolean, ByVal Data As _ MSForms.DataObject, ByVal X As Single, _ ByVal Y As Single, ByVal DragState As Long, _ ByVal Effect As MSForms.ReturnEffect, _ ByVal Shift As Integer) Cancel = True Effect = 1 End Sub Private Sub ListBox2_BeforeDropOrPaste(ByVal _ Cancel As MSForms.ReturnBoolean, _ ByVal Action As Long, ByVal Data As _ MSForms.DataObject, ByVal X As Single, _ ByVal Y As Single, ByVal Effect As _ MSForms.ReturnEffect, ByVal Shift As Integer) Cancel = True Effect = 1 ListBox2.AddItem Data.GetText End Sub 清风读月 Private Sub ListBox1_MouseMove(ByVal Button As _ Integer, ByVal Shift As Integer, ByVal X As _ Single, ByVal Y As Single) Dim MyDataObject As DataObject If Button = 1 Then Set MyDataObject = New DataObject Dim Effect As Integer MyDataObject.SetText ListBox1.Value Effect = MyDataObject.StartDrag End If End Sub Private Sub UserForm_Initialize() For i = 1 To 10 ListBox1.AddItem "Choice " _ & (ListBox1.ListCount + 1) Next i End Sub 18、多页控件 用于将多屏信息作为单个集合给出。 multipage Pages(pege) 说明 清风读月 多页控件在处理可以划分为不同类别的大量信息时很有用。例 如,在人事管理应用程序中,可用多页控件显示雇员信息:一页用于 显示个人信息,如姓名和地址;另一页列出工作经历;第三页列出参 考信息。利用多页控件能够将相关信息组织在一起显示出来,同时又 能够随时访问整条记录。 新页被添加到当前所选页的右边,但不紧靠着它。 注意多页控件是 Pages 集合的容器, 每个多页控件都保存了一 个或多个 Page 对象。 多页控件的默认属性是 Value 属性,该属性返回多页控件的 Pages 集合中当前活动页面的索引编号。 多页控件的默认事件是 Change 事件。 Add、Cut、Paste 方法,Page 对象和多页控件示例 下例用 Add、Cut 和 Paste 方法从多页控件的页中剪切和粘 贴控件。剪切和粘贴操作中涉及的控件,动态地被添加进窗体。 本示例假设用户将添加,然后剪切、粘贴新的控件。 若要使用该示例, 请将示例代码复制到某窗体

的声明变量部分。 请确保该窗体包含: 名为从 CommandButton1 到 CommandButton3 的三 个命令按钮控件。 名为 Multipage1 的多页控件。 Dim MyTextBox As Control Private Sub CommandButton1_Click() 清风读月 Set MyTextBox = MultiPage1.Pages(MultiPage1.Value).Controls_ .Add("MSForms.TextBox.1", "MyTextBox", Visible) CommandButton2.Enabled = True CommandButton1.Enabled = False End Sub Private Sub CommandButton2_Click() MultiPage1.Pages(MultiPage1.Value).Controls.Cut CommandButton3.Enabled = True CommandButton2.Enabled = False End Sub Private Sub CommandButton3_Click() Dim MyPage As Object Set MyPage = _ MultiPage1.Pages.Item(MultiPage1.Value) MyPage.Paste CommandButton3.Enabled = False End Sub Private Sub UserForm_Initialize() CommandButton1.Caption = "Add" CommandButton2.Caption = "Cut" CommandButton3.Caption = "Paste" CommandButton1.Enabled = True 清风读月 CommandButton2.Enabled = False CommandButton3.Enabled = False End Sub 19、选项按钮控件 用于显示群组选项中每一项的选中状态。 说明 用选项按钮显示群组中的某一项是否被选中。请注意框架中的 各个选项按钮是互斥的。 如果将选项按钮连接到了数据源,则选项按钮能够用来显示该 数据源的值,如 Yes/No 、True/False 或 On/Off 中的值。如果选中 了选项按钮,则其当前设置为 Yes、 True 或 On;如果没有选中选 项按钮,则其当前设置为 No、False 或 Off。例如,在库存情况跟 踪程序中,可用选项按钮显示某种货物是否缺货。如果将选项按钮连 接到了数据源,那么改变选项按钮的设置将同时改变数据源中的值。 禁用的选项按钮会变暗,并且不显示值。 选项按钮可以具有 null 值,这与 TripleState 属性的值有关。 也可以在群组框中使用选项按钮,以选择一组相关项目中的一 个或多个。例如,可以创建一个包含可选项目清单的订单窗体,每个 项目前有一个选项按钮。 用户可以通过选中相应的选项按钮来选择某 个项目。 选项按钮默认属性是 Value 属性。 选项按钮默认事件是 Click 事件。 清风读月 Item 方法和选项按钮控件示例 下例用 Item 方法访问 Controls 和 Pages 集合中的单个成 员。用户选择 Controls 集合的选项按钮,或者选择多页控件的选项 按钮,然后单击命令按钮,则在标签中返回相应的控件名称。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: ? ? ? 名为 CommandButton1 的命令按钮。 名为 Label1 的标签。 名为 OptionButton1 和 OptionButton2 的选项按钮。 名为 MultiPage1 和多页控件。 Dim MyControl As Object Dim ControlsIndex As Integer Private Sub CommandButton1_Click() If OptionButton1.Value = True Then '处理用户窗体的 Controls 集合 Set MyControl = Con

trols.Item(ControlsIndex) Label1.Caption = MyControl.Name '为用户窗体上的下一个控件准备索引 ControlsIndex = ControlsIndex + 1 If ControlsIndex >= Controls.Count Then ControlsIndex = 0 清风读月 End If ElseIf OptionButton2.Value = True Then '处理 Pages 集合的当前页 Set MyControl = MultiPage1.Pages _ .Item(MultiPage1.Value) Label1.Caption = MyControl.Name End If End Sub Private Sub UserForm_Initialize() ControlsIndex = 0 OptionButton1.Caption = "Controls Collection" OptionButton2.Caption = "Pages Collection" OptionButton1.Value = True CommandButton1.Caption = "Get Member Name" End Sub 20、文本框控件 用于显示用户输入的或是组织好的一系列数据信息。 说明 文本框是最常用的用于显示用户输入信息的控件。同时也能显 示一系列数据,例如数据库表、查询、工作表或计算结果。如果将文 清风读月 本框连接到了数据源, 则对文本框内容所作的修改也会改变它所连接 的数据源中的值。 对文本框中任何一段文字进行的格式设置都将影响该控件中的 所有文字。例如,改变该控件中任何字符的字体或磅值大小,将对该 控件中的所有字符产生影响。 文本框的默认属性是 Value 属性。 文本框的默认事件是 Change 事件。 AutoSize、MultiLine、WordWrap、ScrollBars 属性和文本框 控件示例 下例在文本框上演示 MultiLine、WordWrap 和 ScrollBars 属性。 若要使用该示例,请将该示例代码复制到某窗体的声明变量部 分。请确保该窗体包含: ? 名为 TextBox1 的文本框。 名为 ToggleButton1 到 ToggleButton4 的四个切换按 钮控件。 若要浏览文本框中的整个文本,请单击切换按钮控件,将 MultiLine 和 WordWrap 设置为 True。 当 MultiLine 为 True 时,按 Shift+Enter 组合键可以输入新 的文本行。 手工改变文本框的内容时,会出现滚动条。 Private Sub UserForm_Initialize() 清风读月 'Initialize TextBox properties and toggle buttons TextBox1.Text = "Type your text here. " & "Enter SHIFT+ENTER to move to a new line." TextBox1.AutoSize = False ToggleButton1.Caption = "AutoSize Off" ToggleButton1.Value = False ToggleButton1.AutoSize = True TextBox1.WordWrap = False ToggleButton2.Caption = "WordWrap Off" ToggleButton2.Value = False ToggleButton2.AutoSize = True TextBox1.ScrollBars = 0 ToggleButton3.Caption = "ScrollBars Off" ToggleButton3.Value = False ToggleButton3.AutoSize = True TextBox1.MultiLine = False ToggleButton4.Caption = "Single Line" ToggleButton4.Value = False ToggleButton4.AutoSize = True End Sub Private Sub ToggleButton1_Click() 'Set AutoSize property and associated ToggleButton 清风读月 If ToggleButton1.Value = True Then TextBox1.AutoSize = True ToggleButton1.Caption = "AutoSize On" Else TextBox1.AutoSize = False ToggleButton1.Caption = "AutoSize Off" End If End Sub Private Sub ToggleB

utton2_Click() '设置 WordWrap 属性和相关的 ToggleButton If ToggleButton2.Value = True Then TextBox1.WordWrap = True ToggleButton2.Caption = "WordWrap On" Else TextBox1.WordWrap = False ToggleButton2.Caption = "WordWrap Off" End If End Sub Private Sub ToggleButton3_Click() '设置 ScrollBars 属性和相关的 ToggleButton If ToggleButton3.Value = True Then TextBox1.ScrollBars = 3 清风读月 ToggleButton3.Caption = "ScrollBars On" Else TextBox1.ScrollBars = 0 ToggleButton3.Caption = "ScrollBars Off" End If End Sub Private Sub ToggleButton4_Click() '设置 MultiLine 属性和相关的 ToggleButton If ToggleButton4.Value = True Then TextBox1.MultiLine = True ToggleButton4.Caption = "Multiple Lines" Else TextBox1.MultiLine = False ToggleButton4.Caption = "Single Line" End If End Sub Cut、Paste 方法和文本框控件示例 下例用 Cut 和 Paste 方法从一个文本框中剪切文本,并将其 粘贴到另一个文本框中。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含: 名为 TextBox1 和 TextBox2 的两个文本框控件。 清风读月 名为 CommandButton1 的命令按钮。 Private Sub UserForm_Initialize() TextBox1.Text = "From TextBox1!" TextBox2.Text = "Hello " CommandButton1.Caption = "Cut and Paste" CommandButton1.AutoSize = True End Sub Private Sub CommandButton1_Click() TextBox2.SelStart = 0 TextBox2.SelLength = TextBox2.TextLength TextBox2.Cut TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.Paste TextBox2.SelStart = 0 End Sub 21、切换按钮控件 显示项目的选中状态。 说明 用切换按钮显示某个项目是否被选中。如果将切换按钮连接到 了数据源, 则切换按钮会将该数据源的值显示为 Yes/No、 True/False、 清风读月 On/Off 的其中之一。如果选中了切换按钮,则当前设置为 Yes、True 或 On;如果未选中切换按钮,则设置为 No、False 或 Off。如果将 切换按钮连接到了数据源, 则改变切换按钮设置将同时改变数据源中 的值。禁用的切换按钮能够显示值,但会变暗,并且不能通过用户界 面进行修改。 也可在框架中使用切换按钮,以在一组相关项目中选择一个或 多个项目。例如,可以创建一个包含可选项目清单的订单窗体,每个 项目前有一个切换按钮。 用户可以通过选择相应的切换按钮来选择某 个项目。 切换按钮的默认属性是 Value 属性。 切换按钮的默认事件是 Click 事件。 TripleState 属性和开关控件示例 下例用 TripleState 属性,使 Null 可作为复选框和切换按钮 的一个合法值。用户通过 ToggleButton2 控制 TripleState 的值。用 户可根据 TripleState 的值来设置复选框或切换按钮的值。 若要使用该示例, 请将示例代码复制到某窗体的声明变量部分。 请确保该窗体包含 : ? ? 名为 CheckBox1 的复

选框。 名为 ToggleButton1 的切换按钮。 名为 ToggleButton2 的切换按钮。 Private Sub UserForm_Initialize() CheckBox1.Caption = "Value is True" 清风读月 CheckBox1.Value = True CheckBox1.TripleState = False ToggleButton1.Caption = "Value is True" ToggleButton1.Value = True ToggleButton1.TripleState = False ToggleButton2.Value = False ToggleButton2.Caption = "Triple State Off" End Sub Private Sub ToggleButton2_Click() If ToggleButton2.Value = True Then ToggleButton2.Caption = "Triple State On" CheckBox1.TripleState = True ToggleButton1.TripleState = True Else ToggleButton2.Caption = "Triple State Off" CheckBox1.TripleState = False ToggleButton1.TripleState = False End If End Sub Private Sub CheckBox1_Change() If IsNull(CheckBox1.Value) Then 清风读月 CheckBox1.Caption = "Value is Null" ElseIf CheckBox1.Value = False Then CheckBox1.Caption = "Value is False" ElseIf CheckBox1.Value = True Then CheckBox1.Caption = "Value is True" End If End Sub Private Sub ToggleButton1_Change() If IsNull(ToggleButton1.Value) Then ToggleButton1.Caption = "Value is Null" ElseIf ToggleButton1.Value = False Then ToggleButton1.Caption = "Value is False" ElseIf ToggleButton1.Value = True Then ToggleButton1.Caption = "Value is True" End If End Sub 22、用户窗体窗口 在工程中创建一窗口或对话框。 可以画出并查看窗体上的控件。 在设计窗体时: ? 每个窗体窗口有最大化、最小化及关闭按钮。 可以查看窗体网格并从“选项”对话框的“标准”选项卡 中决定网格的大小。 清风读月 利用“工具箱”中的按钮, 在窗体上画出控件。 可以从“选 项”对话框的“标准”选项卡中设置控件对齐窗体的网格。 参考: UserForm 对象,UserForms 集合对象 UserForm 对象是一个窗口或对话框,用以构成应用的用户界 面部分。 UserForms 集合对象是一个集合,其部件代表应用程序中每个 装入的 UserForm。UserForms 集合对象有一个 Count 属性,一个 Item 属性,及一个 Add 方法。Count 用来指定集合对象中的部件 个数;Item(缺省成员)用来指定某个集合对象成员;而 Add 则用 来在集合对象中放置一个新的 UserForm 部件。 语法 UserForm UserForms[.Item](index) index 代表从 0 到 UserForms.Count – 1 之间的一个整型数; Item 则是 UserForms 集合对象的缺省成员,并且是不须指定的。 说明 可以经由 UserForms 集合对象,对程序中所有已装入的用户 窗体进行访问,其识别的方法须经由 UserForms 这个全局变量。可 以将 UserForms(index) 传送到一个参数为 UserForm 类的函数中。 可利用用户窗体的属性决定其外观,例如位置、大小、颜色, 以及动作。 清风读月 用户窗体也会回应由用户所引起或系统引发的事件。例如,可 以在 UserForm 的 Initialize 事件过程中编写

代码,以便在 UserForm 显示前初始化模块级别的变量。 除了属性与事件之外,还可以在代码中使用方法来操纵用户窗 体。例如,可以用 Move 方法来改变 UserForm 的位置与大小。 在设计用户窗体时,设置 BorderStyle 属性可定义边框,以及 设置 Caption 属性以便在标题栏填入文本。利用代码,以 Hide 及 Show 方法使 UserForm 在运行时为可见的或不可见的。 UserForm 是一种 Object 数据类型。设计时设置变量为 UserForm 类型的实例前,可将其声明为 UserForm。同样的,也可 用 UserForm 类型传送参数给过程。 可以在代码中用 Dim 中的关键 字 New、Set 及 Static 等语句,来建立用户窗体的多个实例。 可以用 Controls 集合对象,来访问 UserForm 上的控件的集 合对象。例如,要隐藏 UserForm 上的所有控件,可以用类似以下 的代码: For Each Control in UserForm1.Controls Control.Visible = False Next Control 本TXT由“文库宝”下载:http://www.mozhua.net/wenkubao

本文档下载自文档之家,www.doczj.com-免费文档分享平台,众多试卷、习题答案、公务员考试、英语学习、法语学习、人力资源管理、电脑基础知识、学习计划、工作计划、工作总结、活动策划、企业管理等文档分类免费下载;乐于分享,共同进步,转载请保留出处:http://www.doczj.com/doc/38897322dd36a32d7375813f.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金枝玉叶9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值