[英]Excel - How to conditionally lock and unlock a particular cell using VBA.
[英]How to dynamically lock and unlock a cell in Excel?
我应该怎么做才能动态锁定/解锁 excel 中的单元格? 例如,如果我创建一个新文档,默认情况下所有单元格都是解锁的,但我在该单元格上输入了一个数据,它将被锁定。 我试过了,我在这里找到了Lock empty cells and unlock free cells
Sub test()
Dim rngTemp As Range
For Each rngTemp In Range("A1:XFD1048576").Cells
With rngTemp
If .Value > 0 Or Len(.Value) > 0 Then
.Locked = False
End If
End With
Next
End Sub
但它不适用于我的情况。 我使用的是 2007 excel 版本。 我还需要保存代码还是Alt + Q就足够了?
编辑:根据@JvdV 的回答,我尝试了以下方法:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
With Sheet1
.Unprotect
.Cells.Locked = True
.Cells.SpecialCells(xlCellTypeBlanks).Locked = False
.Protect
End With
End Sub
但这会返回错误Run-time error '1004' No cells were found
on .Cells.SpecialCells(xlCellTypeBlanks).Locked = False
。
如果您真的对这些单元格感兴趣,您可以简单地参考工作表的单元格。 此外,无需单独遍历这些单元格,例如:
Sub test()
Dim rng As Range
With Sheet1 'Change according to your sheet's CodeName
.Unprotect
.Cells.Locked = False
.Cells.SpecialCells(xlCellTypeBlanks).Locked = True
.Protect
End With
End Sub
其中.Cells.Locked = False
解锁所有单元格和.Cells.SpecialCells(xlCellTypeBlanks).Locked = True
锁定所有单元格空白单元格(注意:公式中的=""
值被视为一个值,并将保持解锁状态)
Unprotect
和Protect
都需要使您的更改完全生效。
如果这是每次更改值时要运行的代码,则必须查看Worksheet_Change
事件。 如果您的目标是解锁空单元格并锁定包含值的单元格,只需交换True
和False
。
编辑(根据您的评论)
如果这是您希望在每个下一个单元格选择上运行的东西,请尝试以下操作(包括错误处理程序,因为您不再使用整个工作表)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Unprotect 'Change according to your sheet's CodeName
With Target
.Cells.Locked = True
On Error Resume Next
.Cells.SpecialCells(xlCellTypeBlanks).Locked = False
On Error GoTo 0
End With
Sheet1.Protect
End Sub
如果您正在寻找循环遍历目标范围的替代方法,您可以实施@M.Schalk 的建议
作为上述(正确)答案的补充,这是我对Worksheet_Change
事件的建议,正如您在评论中所要求的那样。 这必须放在特定于工作簿的代码模块中:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cll As Range
On Error Resume Next
For Each cll In Target.Cells
With cll
If .Value2 <> vbNullString Then
.Locked = True
Else
.Locked = False
End If
End With
Next
End Sub
需要注意的是,(至少在我的 Excel 版本中)单元格的.Locked
属性仅在工作表受到保护时才有效。 但是,要更改.Locked
属性的值,工作表必须不受保护。 要合并这一点,您可能需要使用以下内容:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cll As Range
On Error GoTo Handler
Me.Unprotect
For Each cll In Target.Cells
With cll
If .Value2 <> vbNullString Then
MsgBox cll.Value2
.Locked = True
Else
MsgBox "NullString"
.Locked = False
End If
End With
Next
Handler:
Me.Protect
End Sub
这将导致每个单元格在输入值后变得不可更改,同时仍允许用户在所有空单元格中输入值。 要更改现有值,您需要手动取消对工作表的保护。 在工作表未受保护和更改后,您可以使用类似于上述答案中提供的代码来恢复所需的 state。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.