本节介绍两个事件示例,帮助大家学习理解事件的具体应用,代码会尽量分析的详细些帮助理解。
1、选中某个值时,用颜色标注同样的值。
示例一的效果如下,假如每周的值班如图,当在B1:C7单元格中选中一个值时,同样的值都会标注颜色。
具体代码如下,后面会逐段分析。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("b1:c7").Interior.ColorIndex = xlNone
If Application.Intersect(Target, Range("b1:c7")) Is Nothing Then
Exit Sub
End If
If Target.Count > 1 Then
Set Target = Target.cells(1)
End If
Dim rng As Range
For Each rng In Range("b1:c7")
If rng.Value = Target.Value Then
rng.Interior.ColorIndex = 34
End If
Next
End Sub
代码的整体结构是Worksheet_SelectionChange事件。当单元格选择发生改变时,即触发事件将选中单元格传递到target参数。
Range("b1:c7").Interior.ColorIndex = xlNone
首先每次事件触发时都将B1:C7单元格的区域的设置重新设置为无色。
If Application.Intersect(Target, Range("b1:c7")) Is Nothing Then
Exit Sub
End If
这段用于限制只有B1:C7的单元格区域选择改变时会触发SelectionChange事件。
Application.Intersect方法返回参数指定的多个单元格的公共区域,它的参数为两个以上的range单元格。代码中表示返回Target和Range("b1:c7")的公共区域。当选择超出B1:C7时,就没有公共区域即无结果,if判断is nothing 成立,执行exit sub 退出事件过程。
If Target.Count > 1 Then
Set Target = Target.cells(1)
End If
这段是考虑如果选中多个单元格的情况,判断选中的单元格数量超过一个即Target.Count > 1,将Target.cells(1)选中,即选中的多个单元格区域最左上角的单元格,用set语句重新赋值给Target,这样就只有一个单元格的值。
Dim rng As Range
For Each rng In Range("b1:c7")
If rng.Value = Target.Value Then
rng.Interior.ColorIndex = 34
End If
Next
这段代码就通过for each循环语句,遍历B1:C7单元格区域,当值与选中的单元格值相同时,设置该单元格的背景色。最后结束循环。(当下次事件触发时,会再次删除所有颜色。)
这是示例主要帮助大家如何去限制区域使用工作表事件,采用的方法也比较典型,希望有助于助理解。
2、每隔一分钟自动保存工作簿
在使用excel可能手一抖关闭时没保存,或者excel报错的情况,下面的案例就是文件被打开后让文件每隔一分钟自动保存一次。(代码中会涉及调用过程的知识。)
涉及定时或者间隔时间的时间可以想到application对象的ontime方法。
首先在工程资源管理窗口,插入一个模块,在模块中写入两个过程代码:
新建dingshi过程,通过application对象的ontime方法,设置现在起1分钟之后运行baocun过程。
新建baocun过程,设置ThisWorkbook.Save保存当前工作簿,然后通过call dingshi再次调用dingshi过程,这样又会再一分钟之后运行baocun,形成一个循环。
再换到thisworkbook模块中,新建workbook的open事件,然后通过Call dingshi调用dingshi过程即可实现。
这样当工作簿打开之后,运行dingshi过程,在1分钟之后运行baocun过程,baocun过程保存工作簿之后会再次调用dingshi过程,形成1分钟的循环保存。
大家可以编写代码尝试下,可以修改保存时间,还可以利用以前学过的workbook的saveas方法将文件另存。
本节介绍两个事件的综合示例,涉及到如何限制事件触发的区域,触发事件后的条件判断,如何调用过程等。希望介绍有助于理解。下节会再介绍两个综合示例,祝大家学习快乐。