繁体   English   中英

如何动态锁定和解锁 Excel 中的单元格?

[英]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锁定所有单元格空白单元格(注意:公式中的=""值被视为一个值,并将保持解锁状态)

UnprotectProtect都需要使您的更改完全生效。

如果这是每次更改值时要运行的代码,则必须查看Worksheet_Change事件。 如果您的目标是解锁空单元格并锁定包含值的单元格,只需交换TrueFalse


编辑(根据您的评论)

如果这是您希望在每个下一个单元格选择上运行的东西,请尝试以下操作(包括错误处理程序,因为您不再使用整个工作表)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM