本节将再介绍两个事件示例,代码会尽量分析的详细些帮助理解。重在代码的逻辑和用法。
1、锁定单元格的值。
Excel工作表中有时有单元格的值希望被锁定,输入密码后才能修改,通常我们使用”审阅“的“保护工作簿”功能来实现,那下面通过vba代码也来实现一下。
在thisworkbook模块中首先定义模块级变量data(由于两个过程均要调用),用于储存选择的单元格的值。(由于不确定类型,就定义为变体型。)
Dim data
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
data = Target.Value
End Sub
选择Worksheet_SelectionChange事件,选择的单元格时,将target.value值赋值给data变量。用于储存原始值。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i
If Not Application.Intersect(Target, Range("a1:a7")) Is Nothing Then
i = InputBox("请输入密码")
If i = 123456 Then
Exit Sub
Else
MsgBox "密码错误,请勿修改单元格的值"
Application.EnableEvents = False
Target.Value = data
Application.EnableEvents = True
End If
End If
End Sub
再新建Worksheet_Change事件,当单元格被修改是触发。(要限制单元格为A1:A7区域)
定义个变量i,通过Application.Intersect(Target, Range("a1:a7"))来判断修改的单元格是否有公共部分,再前面加not来表示否定,所以这句的逻辑实际变成如果有公共部分的时候。就弹出输入框要求输入密码,如果密码正确就退出Worksheet_Change事件过程,就可以修改。
如果密码错误,就提示密码错误,然后Application.EnableEvents的值设为false,防止后面Target.Value = data恢复原值时再一次触发change事件。改完后再恢复Application.EnableEvents为true。
2、备份单元格修改记录
要求在前两个表格的单元格中修改的内容时,将修改完整记录和修改时间在汇总表中保留记录。(效果如下图所示,只演示表格1。)
具体代码分析如下,在表格1中先创建事件worksheet_selectionchange事件
Dim i
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
i = Target.Value
End Sub
定义了过程级变量i,通过worksheet_selectionchange事件,用变量i保存单元格的初始值。
然后创建worksheet_change事件,在输入代码如下。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim j As Long, k, t As Date
j = Worksheets("汇总表").Range("a1045576").End(xlUp).Row
k = Target.Address & "由 " & i & "改为 " & Target.Value
t = Now()
Worksheets("汇总表").Range("a" & j).Offset(1, 0).Value = k & " 时间" & t
End Sub
由于要将“表格1”中更改的内容保存到“汇总表”的A列,首先通过range单元格的end属性来获得有数据的最后一行的行号。赋值给长整型变量 j。
然后将单元格的地址、单元格原始值i,还有单元格现在的值组成字符串赋值给变量k。把当前的时间赋值给变量t。
最后通过单元格offset属性,在“汇总表”A列的有数值的最后一行行的下一行填入变量k和变量t。
示例中只是在“表格1“的模块中写入了代码,”表格2“中也写入类似的代码。(实际操作中为了区分开,可以将“表格2”的改动写在汇总表的B列,或者在变量k中直接加入不同的工作表的名称即可。)
本节介绍两个事件的综合示例,涉及到触发区域的判断,触发事件后的条件判断,事件的开启和关闭,单元格的end属性和offset属性的应用。祝大家学习快乐。
本文分享自 Excel和Access学习笔记 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!