Excel 2003对象模型编程快速入门 [摘要] 本文全面概括地讲解了一些关于Excel2003对象模型编程的基础知识,包括创建VBA子程序和宏,对象、方法、属性和集合的基本概念,如何使用事件、使用窗体创建对话框等,为您提供了使用程序自动化处理工作的基本方法。 阅读本文后,您应该对关键的编程概念和知识有所了解,并能开发一些简单实用的应用程序以解决工作中遇到的实际问题。
通过一个示例认识Excel VBA程序 首先,让我们看看下面的代码,在每行代码的前面都附有代码功能的解释。 Sub 隔行设置背景色() '声明常量值为15,即灰色的颜色索引值 Const Gray = 15 '选择工作表中的第2行,其中活动单元格为最左边的单元格 Range("A2").EntireRow.Select '开始循环.若活动单元格不为空,则重复循环, '直到活动单元格值为空时退出循环 Do While ActiveCell.Value <> "" '将所选行背景色设置为常量值Gray所代表的颜色, '本例中为灰色即15所代表的颜色索引值色 Selection.Interior.ColorIndex = Gray '选择从活动单元格起向下的第2行 '选择整行后,其活动单元格为最左边的单元格 ActiveCell.Offset(2, 0).EntireRow.Select Loop End Sub 试试看,在Excel中运行上面的程序,只用短短的6行代码,就能迅速地将你当前工作表中每隔一行添加背景色,使你的工作表更具有可读性。 通过Excel对象模型编程,可以: 定制Excel,实现自动化操作,以满足你特定的需要 添加额外的功能 节省时间和资源 提示 学习需要实践,将所学习到的知识通过实践才能真正理解和掌握。因此,边阅读边上机操作,才能达到好的学习效果。
认识VBA和宏 VBA是VB整合到Microsoft Office应用程序中的一个版本,在VBA中创建的代码也称作宏,宏是一系列的VB指令,通过在VB指令中使用Excel对象模型来执行Excel操作任务。 在Excel中,你可以通过自已写代码来创建宏,也可以通过宏录制器来创建宏。 ■ 创建宏 开启Excel 2003,选择菜单“工具——宏——宏”,出现的“宏”对话框。在“宏名”文本框中输入所创建宏的名字,如“我的第一个宏”,单击“创建”按钮,Excel将自动打开VBE编辑器。 缺省的VBE编辑器显示了3个窗口(可在“视图”菜单中控制是否显示),即: ● 代码窗口 窗口标题为“Book1–[模块1(代码)]”。在该窗口中编写程序代码。也可在“工程窗口”中双击模块名或对象名打开相应的代码窗口。 ● 工程窗口 位于屏幕左侧上方,窗口标题为“工程-VBAProject”。该窗口中显示了当前所有的Excel对象和模块,方便查看和管理。如单击“Microsoft Excel对象”前的加号将展开所有的对象,当前共有4个对象即Sheet1,Sheet2,Sheet3和ThisWorkbook。 ● 属性窗口 位于屏幕左侧下方,窗口标题为”属性-模块1”。该窗口显示了当前所选项目的属性设置。在这里,所选项为模块1,可在属性窗口中为模块1改名为一个合适的名字,如在名称文本框中,输入“我的第一个模块”后按Enter键,则工程窗口中的模块名称和代码窗口标题名称也相应变化。 现在,在“我的第一个宏”程序中输入下面的代码: Sub 我的第一个宏() Dim ws As Worksheet Set ws = ActiveWorkbook.Worksheets.Add Range("A1").Value = "I am a student." End Sub 您先不需要明白这些代码的含义以及它们如何工作,以后我们会讲解。 接下来,关闭VBE编辑器,返回Excel主界面(可单击VBE编辑器左上角的Excel图标或选择菜单命令来进行此操作)。然后,选择菜单“工具——宏——宏”,可看到在出现的“宏”对话框中已选取了“我的第一个宏”,单击“执行”按钮,此时,一个新的工作表被创建,且在该工作表的单元格A1中自动输入文本“I am a student.” ■ 录制宏 除了在VBE编辑器中通过输入代码创建宏之外,您还可以通过宏录制器录制菜单命令、按键和其它操作来创建宏。 首先,选择菜单“工具——宏——录制新宏”,在弹出的“录制新宏”对话框中输入宏名,如“年级”;在“快捷键”文本框中,输入使所录制的宏运行的快捷键,如B;在“保存在”下拉框中选“当前工作簿”;在“说明”文本框中输入宏的功能描述,如“自动生成年级号”,单击“确定”按钮,开始录制宏。此时,在工作表中出现一个如下图1所示的悬浮的工具栏,有两个按钮,其中左边为“停止录制”按钮,右边为“相对引用”按钮。
图1 然后,在单元格A1中输入“一年级”,A2中输入“二年级”,单击“停止录制”按钮。 最后,测试刚录制的宏。清除工作表中的内容后,按Ctrl+Shift+B组合键,Excel将运行刚才所录制宏,在单元格A1和A2中自动输入“一年级”和“二年级”。 提示 关于宏安全性。当你打开含有宏程序的工作簿时,Excel会检查该工作簿中是否含有宏,若有,则会弹出“安全警告”对话框(在安全性级别设置为中的情况下),若点击“启用宏”按钮,宏将运行。注意,对于未知宏,最好先使用杀毒软件确保无宏病毒后再运行。
子程序 先看看刚才编写的代码: Sub 我的第一个宏() Dim ws As Worksheet Set ws = ActiveWorkbook.Worksheets.Add Range("A1").Value = "I am a student." End Sub 关健词Sub…End Sub开始和结束宏,其格式为: Sub 宏名() <代码> End Sub 一个子程序由一组代码语句组成,以Sub开始,以End Sub结束。一个子程序不一定是宏。您能在一个子程序中调用另一个子程序。如: Sub 我的另一个宏() 我的第一个宏 End Sub 如果运行“我的另一个宏”子程序,则调用”我的第一个子程序”,添加一个单元格A1内容为”I am a student.”的新工作表。 创建单独的子程序能更清晰地组织你的代码,更容易地处理通用过程。例如,若需创建并显示3个工作表,则可将上面代码改写为: Sub 我的另一个宏() 我的第一个宏 我的第一个宏 我的第一个宏 End Sub 即将“我的第一个宏”子程序运行三次,不仅实现了最终的目标,而且也简化了代码。 对象、方法和属性 Excel对象模型使用面向对象编程方式。听起来很高深,其实很简单,您只需了解对象、方法和属性三个基本的概念,就可以先入门了。 对象,即某物;方法,即某物能做的事情;属性,即某物的特征。 例如,一台空调即为一个对象,空调能做的事情如制冷、制热、换气等是它的方法,而对空调的描述则是它的属性,如空调的颜色为白色、尺寸大小等。 让我们来看看刚才程序中所使用的代码,并区分对象、方法和属性。 Set ws = ActiveWorkbook.Worksheets.Add Range("A1").Value = "I am a student." 这里有三个对象,即ws代表Worksheet对象,ActiveWorkbook对象代表当前工作簿,Range对象代表在当前工作表中的单元格区域。 提示 Excel对象模型就是我们所能使用来编制Excel程序的对象列表。 当第一次使用某对象变量时,以Set关键字开始,为该对象分配所需的内存空间,并可为对象变量命以合适的名字,如上面的的ws。 方法总是与对象相关联。如在“我的第一个宏”程序代码中包含一个Add方法,它与ws对象相关。使用方法时,应在对象和方法之间添加一个句点,如Worksheets.Add。在上面的代码中,使用Add方法在活动工作簿中添加了一个新的工作表。 属性也总是与对象相关联。在上面的代码中,包含一个属性Value,它与Range对象相关。同方法一样,使用属性时,也应在对象与属性之间添加一个句点,如Range.Rowheight。 每个对象都是一种特定的对象类型,每类对象都有自已的一组方法和属性。在上面的代码中,ws是一个Worksheet对象,有方法如Visible,有属性如Count。属于Worksheet对象的方法和属性,其它类型的对象可能没有,反之,其它对象有的方法,Worksheet对象不一定也有,如执行语句 Worksheet.Value=”Hello” 将会出现错误,因为Worksheet对象没有Value属性。
使用事件 先编写一个宏。按前面所述的方法,创建一个名为“考勤记录表”的宏程序,即在工作表菜单中选择“工具——宏——宏”,输入名称“考勤记录表”,单击“创建”按钮,自动打开VBE编辑器,选中“模块1”,在工程属性窗口的名称框中输入“考勤记录表”。然后,在代码窗口中输入如下代码: Sub 考勤记录表() Dim ws As Worksheet Set ws = ActiveWorkbook.Worksheets.Add Range("A1").Value = "年级" Range("C1").Value = "班级" Range("B3").Value = "姓名" Range("D3").Value = "考勤" Range("B4").Value = "正常" Range("B5").Value = "迟到" Range("B6").Value = "早退" Range("B7").Value = "缺课" Range("B8").Value = "实到" End Sub 我们先设想一下,当你打开工作簿时,如果上面的程序能自动运行,生成你每天想要的表格,该多好啊! 这是可以实现的,你能使用对象事件来完成。当某事情发生在某对象上时,该对象的一个事件发生。例如,当单击一个按钮时,一个Click事件发生在该按钮对象上。当开启Excel时,Auto_Open事件发生,因此,要想当Excel打开时,某程序运行,则将该程序置于Open事件程序中即可。 打开Excel 2003,开启VBE编辑器(可在工作表菜单工具——宏中选择,也可按Alt+F11组合键),先创建上面的“考勤记录表”宏程序。接下来,在工程窗口的Microsoft Excel对象模型中找到“ThisWorkbook”并双击,打开标题为ThisWorkbook的代码窗口,可以看到在该窗口顶部有两个下拉框,点击左边的对象列表下拉框,选择“Workbook”,VBE编辑器自动添加Sub Workbook_Open事件过程,该Open事件将在Excel开启时自动运行。现在,在该事件过程中添加需要在Excel开启时自动运行的宏程序代码,本例中,要使得当Excel工作簿打开时,“考勤记录表”程序自动运行以建立一张表单,代码如下: Private Sub Workbook_Open() 考勤记录表 End Sub 保存工作表后退出,重新开启该Excel工作簿,将会看到工作簿上新生成一张考勤记录表单,这是”考勤记录表”宏程序运行后的结果。
使用窗体——创建自已的对话框 窗体是一个对话框,能在VBA中创建并设计,如添加复选框、文本、图片和其它控件对象。窗体可用来与用户进行交互,如传递信息给用户或从用户那里获取信息。例如,当宏正在运行时,可向用户显示一个进度条,代表程序运行进度。 对于上一小节中所展示的例子,当你每次打开该工作簿时,都会自动生成一个考勤记录表。如果你一天打开该工作簿五次,将会生成5个考勤记录表。但有时,你不想新生成考勤记录表,因为你原来的考勤记录表还需要补充填写,所以,你应该能对该工作簿进行控制。这时,你可以使用窗体设计一个对话框,当你每次打开该工作簿时,都会出现一个带有选项的对话框,让你选择是否创建新的工作表。 ■ 使用窗体创建对话框 1.在Excel中,选择菜单“工具——宏——宏”命令,弹出“宏”对话框,在“宏名”文本框中输入“记录表提示”,单击“创建”按钮,打开VBE编辑器; 2.在VBE编辑器中,选择菜单“插入——用户窗体”命令,将出现一个带有控件工具箱的窗体,在属性窗口中将名称属性改为“提示”,将Caption(标题)属性改为“是否创建新的考勤记录表?”,输入完成并按Enter键后,窗体标题相应变化。 提示 在控件工具箱中,当鼠标指针移到某个控件上时,会显示该控件名称。 3.在控件工具箱中,单击“标签”控件,然后在“提示”窗体中单击,可看到标签控件自动显示在窗体中,在属性窗口中,选择Caption(标题)属性并输入“您想创建一个数据记录表格吗?”后,按Enter键,此时窗体中的标签相应更新为所输入的文字。 提示 (1)您刚创建的“标签”是一个对象,因此,它有自已的方法和属性;(2)在控件工具箱中,点击某控件并按住鼠标左键不放,将该控件拖到窗体中;(3)可通过属性窗口中的Font和ForeColoe来改变标签字体大小、类型和颜色等。 4.单击“提示”窗体,控件工具箱也同时显现。选取控件工具箱中的命令按钮并单击,再到“提示”窗体中单击,将在窗体中添加一个按钮。重复上述步骤,再在窗体上添加一个按钮。 5.在“提示”窗体中,单击第一个命令按钮,并在属性窗口中设置其名称属性为“确定”,Caption(标题)属性为“创建新考勤记录表”;同样,单击第二个命令按钮,并在属性窗口中设置其名称属性为“取消”,Caption(标题)属性为“不创建新考勤记录表”。 6.在“提示”窗体中,调整刚创建的一个标签、两个按钮的尺寸大小(使文本全部显现)、位置布局。最后窗体如下图2所示。
图2 ■ 使刚创建的窗体对话框运行 确保该Excel工作簿中含有上节所编写的“考勤记录表”宏程序。只须在三个不同的子程序中添加四行代码,就能使该窗体按所需要的功能运行。 1.首先,需要在Excel启动后显示对话框窗体。在工程窗口中双击ThisWorkbook对象,在出现的代码窗口顶部左侧下拉框中选择Workbook,VBE编辑器自动产生Workbook_Open事件程序,然后在程序中添加一行代码如下: Private Sub Workbook_Open() 提示.Show End Sub 注 “提示”窗体是一个对象,Show是它的方法。 2.在工程窗口中,双击窗体对象下的“提示”打开“提示”窗体。然后,给窗体中的按钮控件添加代码使其工作。 双击“创建新考勤记录表”按钮,打开代码窗口。按要求,当用户单击此按钮后,将创建一个新的考勤记录表并隐藏窗体。代码如下: Private Sub 确定_Click() 考勤记录表 提示.Hide End Sub 注 “提示”是我们在属性窗口中为窗体定的名字,Hide是该窗体对象的方法。 3.同样,回到“提示”窗体中,双击“不创建新考勤记录表”按钮,打开代码窗口。按要求,当用户单击此按钮后,将隐藏该窗体。代码如下: Private Sub 取消_Click() 提示.Hide End Sub 4.好了,大功告成!现在要以保存Excel工作簿并关闭。然后,重新开启该工作簿,效果如何?
集合 集合是一种特定类型的对象,代表一组其它对象。例如,一台空调是一个对象,多台空调组成空调集合。 一个集合也是另一个对象的属性。例如,空调中的指示灯集合是空调对象的属性,是单个指示灯对象的集合。因此,它们之间的关系是: 空调集合是多台单个空调对象组成的集合,每个空调对象有一个称作指示灯集合的属性,而指示灯集合是单个指示灯对象组成的集合。 ■ Excel中的集合 在Excel对象模型中包括一些集合类型,如在前面小节中所编写的代码: Set ws = ActiveWorkbook.Worksheets.Add Worksheets是Worksheet对象的集合,也是ActiveWorkbook对象的一个属性。在这里也可以得出集合的用处,一个工作簿可以包含任意个工作表,而Worksheets集合提供了管理这些工作表的简单的方法。 在Excel中的其它集合对象包括: Sheets 工作簿中所有工作表的集合 Workbooks 所有打开的工作簿的集合 Charts 工作簿中图表工作表的集合 ■ 集合的方法和属性 所有的集合都有方法和属性,允许您去访问集合中的单个对象。其中,最重要的方法和属性中有3个在这里要用到,即Count属性、Item方法和Add方法。 Count属性 该属性指出在集合中有多少个单个对象。例如: Dim numWorksheets numWorksheets=ActiveWorkbook.Worksheets.Count 其中,numWorksheets是一个变量,存储ActiveWorkbook对象中Worksheet对象的数量。 注 (1)变量在程序中定义用来记录和存储数据信息,并在程序后面予以使用。可由自已根据习惯命名变量名,但在使用前必须用关键字Dim进行声明。(2)若一个集合为空,该集合的Count属性值为0。 Item方法 该方法访问集合中一个特定的对象。例如: Set myWorksheet=ActiveWorkbook.WorkSheets.Item(2) 括号中的数字表明你想访问的工作表,即在Worksheets集合中的第2个Worksheet对象,并将它赋给myWorksheet变量。你也能在括号中使用变量,例如: Dim numWorksheets as Long,theLastWorksheet as Object numWorksheets=ActiveWorkbook.Worksheets.Count Set theLastWorksheet=ActiveWorkbook.Worksheets.Item(numWorksheets) 上面的代码首先用变量numWorksheets来存储在Worksheets集合中Worksheet对象的数量,然后访问最后的工作表。因此,如果工作簿中共有5个工作表,则能指定最后项目为5来访问最后的工作表,故下面的代码与上面代码最后一行等价: Set theLastWorksheet=ActiveWorkbook.Worksheets.Item(5) Add方法 该方法允许你向集合中添加对象。例如: Set anotherWorksheet=ActiveWorkbook.WorkSheets.Add(“Sheet6”) 如何使用Add方法取决于您想要添加项目的集合对象,在多数情况下,您能为新的对象指定一个名字,如上面代码中的Sheet6。 提示 变量的值不是固定的,它的值会随程序的设置和运行而变化。
If … Then … 控制语句 有时,我们需要根据某个条件状态去指定所需运行的代码。例如,在“考勤记录表”宏程序中,若您只想在周一至周五创建新的考勤记录,如何控制?类似这种情形,可以使用If…Then语句控制。 If…Then控制语句能根据不同的条件去调用或执行相应的程序实现所需功能,其语法为: If <条件表达式> Then <代码行> End If 如果条件表达式为真,则执行代码行。 下面举例来加深您对If…Then控制语句的认识。 Sub IfThenStatement() Dim numDataSheets, myWorksheet numDataSheets = ActiveWorkbook.Worksheets.Count If numDataSheets > 0 Then Set myWorksheet = ActiveWorkbook.Worksheets.Item(numDataSheets) MsgBox "最后一名同学的考勤记录是" & myWorksheet.Name & "." End If If numDataSheets = 0 Then MsgBox "无考勤记录." End If End Sub 上述代码运行后,将显示一个对话框来告诉用户最后一名同学的考勤记录在哪个工作表上,或者工作簿中无工作表的话,将提示无考勤记录。 提示 MsgBox语句可用来显示简单的消息框,在语句中可使用“&”符号将字符与变量相连接。 再举一个例子。如下图3所示,根据是否选中对话框中的复选框来运行相应的程序代码。如果没有选中复选框,则打印该工作表;如果选中复选框,则只是保存该工作表而不进行打印操作。
图3 按照“使用窗体”一节中所介绍的知识建立一个窗体。其中,窗体名称属性设置为“测试”,Caption(标题)属性设置为“打印或保存?”。在窗体中,有一个标签、一个复选框和一个按钮。“标签”Caption(标题)属性为“已经创建了一个考勤记录表。是否打印?”;复选框的名称属性为“保存”,Caption(标题)属性为”暂不打印,先保存。”;按钮的名称属性为“Ok”,Caption(标题)属性为“确定”。程序代码如下: '用户点击窗体上"确定"按钮后运行, '因此,使用"Ok"按钮的Click事件 Private Sub Ok_Click() '判断复选框是否被选中,若选中则为真 If 测试.保存.Value = True Then ActiveWorkbook.Save End If '判断复选框是否被选中,若没选中则为假 If 测试.保存.Value = False Then ActiveWorkbook.Worksheets.PrintOut End If 测试.Hide End Sub
小结 本文仅简略地介绍了使用Excel对象模型的一些基本概念和用法,希望能起到抛砖引玉的作用,带您进入神奇的VBA编程,使您的工作更加有效率,也让您的工作充满色彩和乐趣。 您可以使用对象浏览器和VBA在线帮助进一步认识Excel的集合、对象、方法、属性、事件,也能为您在学习和使用VBA时答疑解惑。 |