作者:绿色风
分类:
时间:2022-08-17
浏览:137
楼主 zzmxy |
Q: 如何在工作表保护状态下限制未锁定单元格的修改次数? (比如说限定其修改次数为2次,2次后自动锁定该单元格。)
A: 主要是利用一个全局性的数组,存放各个单元格的修改次数,从而判断其是否应该“锁定”, 但关闭工作簿再打开后,Arr数组将被重置,因此对于只修改过一次的单元格,如果关闭工作簿再打开,仍可修改两次, 而这个问题可以使用辅助单元格存储修改次数来解决,下面只是简单的示例,供参考。
Lock Cells_zz.rar
- Dim Arr(1 To 1000, 1 To 256) '定义数组,放置各个单元格的修改次数
- '这里只定义了1000行,256列,因此超出1000行的单元格将无效,使用时可视情况增加,但最大也有限制
- Private Sub Worksheet_Change(ByVal Target As Range)
- For Each cell In Target '遍历有内容修改的所有单元格
- With cell '其中循环到的某一个单元格
- If Not (.Locked) Then '如果该单元格的“锁定”属性为“非”(未勾选),那么执行如下代码
- Arr(.Row, .Column) = Arr(.Row, .Column) + 1 '将该单元格所对应行、列的Arr数组元素的值+1
- If Arr(.Row, .Column) = 2 Then '如果该对应位置的Arr的值等于2,那么执行如下代码
- ActiveSheet.Unprotect Password:="123" '先取消工作表的保护状态,密码为123
- .Locked = True '将该单元格的“锁定”属性勾选
- ActiveSheet.Protect Password:="123" '再将工作表进行保护,密码为123
- End If
- End If
- End With
- Next '继续循环下一个有内容修改的单元格
- End Sub
效果演示:
|
2楼 zzmxy |
再共享一位朋友——太阳雨 提供的代码,这个代码不用受限于数组元素的最大个数,而可以直接完成题目的要求,供参考。
- Private Sub Worksheet_Change(ByVal Target As Range) '限制未锁定单元格修改次数
- Dim counter, term, chk
- chk = GetSetting("edit", "myvba", "使用次数", "")
- If chk = "" Then
- term = 1 '限制修改2次
- MsgBox "该单元格只限修改2次," & vbCrLf & "超过次数将自动锁定,还剩1次!", vbExc**tion
- SaveSetting "edit", "myvba", "使用次数", term
- Else:
- counter = Val(chk) - 1
- MsgBox "你还能修改" & counter & "次,请注意!", vbExc**tion
- SaveSetting "edit", "myvba", "使用次数", counter
- If counter <= 0 Then
- ActiveSheet.Unprotect (1234)
- Target.Locked = True
- DeleteSetting "edit", "myvba", "使用次数"
- ActiveSheet.Protect (1234)
- End If
- End If
- End Sub
|
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一