ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何在工作表保护状态下限制未锁定单元格的修改次数?

如何在工作表保护状态下限制未锁定单元格的修改次数?

作者:绿色风 分类: 时间:2022-08-17 浏览:137
楼主
zzmxy
Q: 如何在工作表保护状态下限制未锁定单元格的修改次数?
    (比如说限定其修改次数为2次,2次后自动锁定该单元格。)

A:
主要是利用一个全局性的数组,存放各个单元格的修改次数,从而判断其是否应该“锁定”,
但关闭工作簿再打开后,Arr数组将被重置,因此对于只修改过一次的单元格,如果关闭工作簿再打开,仍可修改两次,
而这个问题可以使用辅助单元格存储修改次数来解决,下面只是简单的示例,供参考。

Lock Cells_zz.rar
  1. Dim Arr(1 To 1000, 1 To 256)  '定义数组,放置各个单元格的修改次数
  2.      '这里只定义了1000行,256列,因此超出1000行的单元格将无效,使用时可视情况增加,但最大也有限制

  3. Private Sub Worksheet_Change(ByVal Target As Range)
  4.     For Each cell In Target  '遍历有内容修改的所有单元格
  5.         With cell   '其中循环到的某一个单元格
  6.             If Not (.Locked) Then   '如果该单元格的“锁定”属性为“非”(未勾选),那么执行如下代码
  7.                 Arr(.Row, .Column) = Arr(.Row, .Column) + 1  '将该单元格所对应行、列的Arr数组元素的值+1
  8.                 If Arr(.Row, .Column) = 2 Then      '如果该对应位置的Arr的值等于2,那么执行如下代码
  9.                     ActiveSheet.Unprotect Password:="123"    '先取消工作表的保护状态,密码为123
  10.                     .Locked = True                           '将该单元格的“锁定”属性勾选
  11.                     ActiveSheet.Protect Password:="123"      '再将工作表进行保护,密码为123
  12.                 End If
  13.             End If
  14.         End With
  15.     Next  '继续循环下一个有内容修改的单元格
  16. End Sub

效果演示:


 
2楼
zzmxy
再共享一位朋友——太阳雨 提供的代码,这个代码不用受限于数组元素的最大个数,而可以直接完成题目的要求,供参考。

  1. Private Sub Worksheet_Change(ByVal Target As Range) '限制未锁定单元格修改次数
  2.     Dim counter, term, chk
  3.     chk = GetSetting("edit", "myvba", "使用次数", "")
  4.     If chk = "" Then
  5.         term = 1 '限制修改2次
  6.         MsgBox "该单元格只限修改2次," & vbCrLf & "超过次数将自动锁定,还剩1次!", vbExc**tion
  7.         SaveSetting "edit", "myvba", "使用次数", term
  8.        Else:
  9.         counter = Val(chk) - 1
  10.         MsgBox "你还能修改" & counter & "次,请注意!", vbExc**tion
  11.         SaveSetting "edit", "myvba", "使用次数", counter
  12.         If counter <= 0 Then
  13.            ActiveSheet.Unprotect (1234)
  14.            Target.Locked = True
  15.            DeleteSetting "edit", "myvba", "使用次数"
  16.            ActiveSheet.Protect (1234)
  17.         End If
  18.     End If
  19. End Sub

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap