VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后,该单元格就被锁定,不能再编辑。

打开VBE,在工程资源管理器中双击该工作表名称打开其代码模块,在其中输入下面的代码:

vbnet 复制代码
'假设整个工作表的Locked=False
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim rCell As Range
 Dim ans As VbMsgBoxResult
 
 For Each rCell In Target
   With rCell
     If Len(.Value) > 0 Then
       ans = MsgBox("输入正确吗?" & vbCrLf & vbCrLf & _
         vbTab & .Value & "  (" & .Address(False, False) & ")" & vbCrLf & vbCrLf & _
         "输入数值后将不能编辑这个单元格.", vbYesNo, "单元格锁定通知")
       If ans = vbYes Then
         If Me.ProtectContents Then
           Me.Unprotect Password:="123"  '首先撤销保护
           .Locked = True
           Me.Protect
           Password:="123"
         Else
           .ClearContents
           ActiveCell.Offset(-1, 0).Select  '重新选择数据输入单元格
         End If
       End If
     End With
 Next rCell
End Sub

这里,假设锁定工作表的密码为"123"。

可以使用右击单元格的方式,来重置想要重新输入数据的单元格。在该工作表代码模块中添加下面的代码:

vbnet 复制代码
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
 Dim rCell As Range
 Dim ans As VbMsgBoxResult

 For Each rCell In Target.Cells
   With rCell
     If Len(.Value) > 0 Then
       ans = MsgBox("你想要重置这个单元格吗?" & vbCrLf & vbCrLf & _
         vbTab & .Value & "  (" & .Address(False, False) & ")", vbYesNo, "单元格锁定通知")
       If ans = vbYes Then
         If ActiveSheet.ProtectContents Then ActiveSheet.Unprotect Password:="123"  '首先撤销保护
           Application.EnableEvents = False
           .ClearContents
           .Locked = False
           Application.EnableEvents = True
           ActiveSheet.Protect Password:="123"
         End If
       End If
     End With
 Next
 
 Cancel = True
End Sub

这样,右击想要重新输入数据的单元格,会弹出一个消息框,询问你是否要重置这个单元格,如果点击"是",则会清空该单元格并供输入新数据。

效果如下图1所示。

相关推荐
for_ever_love__8 小时前
SQL学习: SQL入门与DDL
数据库·sql·学习
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(45):ReMemR1——让长期上下文 Agent 可以回溯历史记忆进行非线性推理
论文阅读·人工智能·学习·开源·github
个 人 练 习 生8 小时前
数据结构链表:带头双向循环链表
c语言·数据结构·经验分享·学习·其他·链表
Shaoxi Zhang18 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
陈皮波比茶18 小时前
Redis学习
数据库·redis·学习
minglie121 小时前
espidf的esp32版的webClient
学习
学运维的Kysan21 小时前
暑假运维学习打卡第二十五天8.16
学习
键盘飞行员21 小时前
Flutter App 全套实战学习计划:从零搭建到 APK 部署
学习·flutter
会编程的吕洞宾1 天前
DeepAgents In Action学习(Second)
android·java·学习
我爱cope1 天前
【计算机网络 | 数据链路层7:VLAN:一台交换机如何划分多个逻辑局域网?】
网络·学习·计算机网络