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所示。

相关推荐
饮长安千年月2 小时前
Linksys WRT54G路由器溢出漏洞分析–运行环境修复
网络·物联网·学习·安全·机器学习
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
拥有一颗学徒的心5 小时前
鸿蒙第三方库MMKV源码学习笔记
笔记·学习·性能优化·harmonyos
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
经验分享·学习·汽车·测试用例·capl
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑪】
经验分享·学习·汽车·测试用例·capl
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程
网安Ruler9 小时前
泷羽Sec-黑客基础之html(超文本标记语言)
前端·学习·网络安全·html
啥也不会的菜鸟·11 小时前
Redis7——基础篇(五)
redis·学习·缓存