示例
如图所示,该表为某公司员工档案表。由于该表记录较多,为使该表的各个记录更容易区分,希望能够对当前选中的行添加不同的背景色设置。该如何用VBA完成?
序号 | 姓名 | 科室 | 级别 | 身份 | 职称 | 受聘专业 | 参工时间 | 工作年限 | 入院时间 | 入院年限 | 职务 |
1 | 张1张 | 后勤科 | 中级 | 干部 | 主治医师 | 医生 | 1970/9/1 | 40 | 1970/7/1 | 40 | |
2 | 李2李 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1991/8/1 | 19 | 2008/10/1 | 2 | 院长.书记 |
3 | 江3江 | 外妇科 | 工人 | 医生 | 1993/9/1 | 17 | 1999/1/1 | 12 | |||
4 | 陈4陈 | 外妇科 | 初级 | 干部 | 医士 | 医生 | 1999/10/1 | 11 | 1999/10/1 | 11 | 医务科长 |
5 | 周5周 | 外妇科 | 合同 | 医生 | 2009/2/13 | 2 | 2009/2/13 | 2 | |||
6 | 吴6吴 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1977/2/1 | 34 | 1977/7/1 | 33 | 副院长 |
7 | 张7张 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1978/4/1 | 33 | 1985/1/1 | 26 | |
8 | 李8李 | 外妇科 | 初级 | 干部 | 护师 | 护士 | 1987/2/1 | 24 | 1989/3/1 | 22 | |
9 | 江9江 | 外妇科 | 合同 | 护士 | 2007/4/26 | 4 | 2008/4/1 | 3 | |||
10 | 陈10陈 | 外妇科 | 干部 | 护士 | 2000/8/1 | 10 | 1999/5/1 | 12 | |||
11 | 周11周 | 外妇科 | 初级 | 干部 | 护士 | 护士 | 2007/6/6 | 4 | 2007/6/1 | 4 | |
12 | 吴12吴 | 外妇科 | 干部 | 医生 | 2006/3/1 | 5 | 2006/4/1 | 5 | |||
13 | 张13张 | 外妇科 | 合同 | 医生 | 2009/5/7 | 2 | 2009/5/7 | 2 | |||
14 | 李14李 | 外妇科 | 合同 | 护士 | 2009/9/9 | 1 | 2009/9/9 | 1 | |||
15 | 江15江 | 手术室 | 干部 | 医生 | |||||||
16 | 陈16陈 | 手术室 | 合同 | 医生 | 2009/7/11 | 1 | 2009/6/11 | 2 | |||
17 | 周17周 | 手术室 | 初级 | 干部 | 医师 | 护士 | 1981/12/1 | 29 | 1981/12/1 | 29 | 护士长 |
18 | 吴18吴 | 内儿科 | 初级 | 干部 | 主治医师 | 医生 | 1988/8/1 | 22 | 1988/7/1 | 22 | 医务科副科长兼中医科科长 |
19 | 张19张 | 内儿科 | 初级 | 干部 | 主治医师 | 医生 | 1997/10/1 | 13 | 1997/10/1 | 13 | 内科主任 |
20 | 李20李 | 内儿科 | 干部 | 医生 | 2000/8/1 | 10 | 2008/8/1 | 2 | |||
21 | 江21江 | 内儿科 | 初级 | 干部 | 护师 | 护士 | 1981/12/1 | 29 | 2006/10/1 | 4 | |
22 | 陈22陈 | 内儿科 | 初级 | 干部 | 护士 | 护士 | 2000/12/1 | 10 | 2002/1/1 | 9 | |
23 | 周23周 | 内儿科 | 合同 | 护士 | 护士 | 2007/11/14 | 3 | 2007/11/1 | 3 |
实现代码
使用工作表的Selection_Change事件,当用户选择的单元格发生变化时,对所选中的单元格及其所在的行设置不同的背景色。
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal target As Range)
'若选中的单元格数量为1,并用大于第一行
If target.Count = 1 And target.Row > 1 Then
'将第2行开始的所有单元格的填充色改为无色
Rows("2:" & Rows.Count).Interior.Color = xlNone
'改变当前先中单元格所在行的填充色为黄色
target.EntireRow.Interior.Color = vbYellow
End If
End Sub
事件的概念
事件指的是当用户执行某个特定的操作后,即可触发某个事件程序并使其自动运行,其机制类似于生物学中的条件反射。比如,当用户单击Excel程序中[快速访问工具栏]中的“保存”按钮后,可以实现保存功能。而其实质是在用户单击该按钮后,Excel程序触发了该按钮的单击事件,并执行了其单击的事件程序,而在该程序中由于定义了与保存工作簿相关的程序,从而实现工作簿的保存,其过程可以参见图。事实上,Windows系统和Excel都是基于事件机制而设计的。
事件程序是可以自动、反复地执行的。只需要满足事件程序触发的条件,事件程序就会执行,而无须用户或开发者特意使用特殊的方法去启动程序。事件是程序“自动”执行的基础,许多“自动”的功能都是依靠事件来完成的。
Worksheet的Selection_Change事件
Selection_Change事件程序是Excel预定义的事件,其触发条件是当选中的单元格区域发生变化,即当选中的单元格区域发生变化时触发该事件程序的执行。本例中,首先需要为当前选中的单元格所在的行设置不同的填充色。而当用户选择不同行的单元格时,需要将之前的行设置为默认的填充色,并且将当前选中的行设置为不同的颜色。因而本例使用工作表对象(Worksheet) Selection_Change事件,并在该事件中定义变更单元格填充色的语句。该事件的形式为:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
在该事件过程的定义中,有一个名为Target类型的Range参数。该参数表示触发该Selection_Change事件的单元格或者单元格区域。即当选择区域发生了变化,用户重新选择了新的单元格区域后,该新的单元格区域将触发该事件的启动。因而该Target参数表示新的单元格区域,即当前用户选中的单元格区域。
通常情况下,事件中的参数名称可以由用户自定义,然而参数类型和相对的顺序必须严格按照事件过程的定义编写。如以上事件可以写为
Private Sub Worksheet_SelectionChange(ByVal Rng As Range)
此时,参数Rng表示当前选中的单元格区域。但以下过程由于其参数的类型发生了变化,在实际执行过程中将会发生错误。
Private Sub Worksheet SelectionChange(ByVal Target As Object)
启用Excel的事件
当需要启用Excel的事件,无须进行额外的设置时,只需要将事件程序按照规定的形式写入工作表、工作簿或者相应模块的代码中即可。
工作表事件一览
工作表事件及其程序
事 件 | 事件程序 |
工作表激活 | Worksheet_activate() |
双击单元格 | Worksheet_BeforeDoubleClick(ByVal Taylet As Range,_Cancel As Boolean) |
鼠标右击单元格 | Worksheet_BeforeRightClick(ByVal Target As Range,_Cancel As Boolean) |
工作表计算 | Worksheet_Calculate() |
工作表的值改变 | Workgheet_Change(ByVal Target As Range) |
失去激活状态 | Worksheet_Deactivate() |
单击超链接 | Worksheet_FollowHypedink(ByVal Target As Hyperlink) |
数据透视表更新 | Worksheet_PivotTableUpdate(ByVal Target As PivotTable) |
选择区域变化 | Worksheet_SelectionChange(ByVal target As Range) |