excel - 如何根据单元格值锁定 Excel 中的单元格行?
问题描述
所以我知道可以将单元格格式化为锁定,然后保护工作表以防止数据被覆盖。但我希望能够动态锁定工作表中的单元格。通过做一些谷歌搜索,我尝试根据我的需要调整下面的代码块。目的是,如果 A 列有值,则该行的其余部分将被锁定,因此没有人可以覆盖该行的其余部分。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(ActiveSheet.Cells(18, 1), Target) Is Not Nothing Then
If ActiveSheet.Cells(18, 1).Text = "X" Then
ActiveSheet.Range(Cells(18, 2), Cells(18, 20)).Locked = True
Else
ActiveSheet.Range(Cells(18, 2), Cells(18, 20)).Locked = False
End If
End If
End Sub
任何帮助将不胜感激,以及简洁地将其应用于工作表中每一行的提示。
更新:
根据 BigBen 的回答,我已修改为以下内容:
Private Sub Workbook_Open()
Sheets(“Sheet8”).Protect Password:="Secret", UserInterFaceOnly:=True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Intersect(Me.Columns(1), Target)
If rng Is Nothing Then Exit Sub
Dim cell As Range
For Each cell In rng
cell.EntireRow.Locked = (cell.Value = "X")
Next
End Sub
但这似乎仍然不起作用......
解决方案
您需要更改Intersect
以测试是否Target
与 A 列相交,而不是特定单元格:
还要注意Not
语法:If Not Intersect... Is Nothing
,而不是If Intersect... Is Not Nothing
.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Me.Columns(1), Target) Is Nothing Then
Dim rng as Range
For Each rng in Intersect(Me.Columns(1), Target)
If rng.Value = "X" Then
rng.EntireRow.Locked = True
Else
rng.EntireRow.Locked = False
End If
Next
End If
End Sub
或者更简洁一点:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Intersect(Me.Columns(1), Target)
If rng Is Nothing Then Exit Sub
Dim cell As Range
For Each cell In rng
cell.EntireRow.Locked = (cell.Value = "X")
Next
End Sub
推荐阅读
- asp.net - ASP.NET @User.Identity.Name 返回空值
- javascript - 在jquery中对此进行动画处理
- r - 对整数矩阵的列表列进行子集化
- c# - System.Diagnostics.Trace 与 ILogger
- c# - 在第二个字符后添加“/”符号
- javascript - 在异步循环中设置 useState 挂钩
- java - 嵌套类的自定义验证器并将错误发送回控制器
- javascript - 表单输入文本从 JSON 数组中获取值
- web-applications - iModelJS - 如何在不通过 iModelHub 的情况下显示模型?
- python - 如果字典中的值之一是'int',如何在打印函数中使用标题方法?