如何锁定自动填充的单元格

How to lock cells which are automated filled

我想在输入值后锁定单元格。当我更改sheet2 A1上的值时,该值应该仍然锁定在B2中。

当我在 Sheet2 A1 中输入“3”时,数字 2 应该在那里。

这是我已有的代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Sheet1.Unprotect "1234"

If VBA.IsEmpty(Target.Value) Then

    Target.Locked = False

Else
     
    Target.Locked = True

End If
Sheet1.Protect "1234"

End Sub

当您执行 Worksheet.Protect 时,每个单元格都默认锁定。您需要指定在保护 sheet 后哪些单元格仍应可编辑(未锁定)。在你的情况下,你需要指定除了你选择的几个单元格之外的每个单元格都没有被锁定。

第二个重要说明是 Worksheet.Protect 有一个选项 UserInterfaceOnly,当它为真时,允许宏继续编辑单元格而无需先取消保护 sheet。这意味着您可以让 sheet 受到保护,并根据需要解锁或锁定单元格。

以下是如何解锁工作表 1 上除 A1 以外的所有单元格的示例:

Sub Example()
    With Sheet1
        .Protect Password:="1234", UserInterfaceOnly:=True
        .Cells.Locked = False
        .Cells(1, 1).Locked = True
    End With
End Sub

我的第一个答案是假设单元格锁定指的是 Range.Locked 属性 但现在我明白这是为了指代单元格值并防止它们重新计算。

有一些技术可用于防止单元格重新计算。最简单的方法是将任何公式更改为静态值,例如:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Target.Value = Target.Value
    Application.EnableEvents = True
End Sub

此事件将在第一次计算其值后删除所有公式。每个单元格将只是用户输入的任何值或公式第一次计算的任何值。

您可以使用 Intersect 来限制事件运行的范围,例如:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OperationalArea As Range, AffectedArea As Range
    Set OperationalArea = Me.Range("B2:F10")
    Set AffectedArea = Intersect(Target, OperationalArea)
    
    If Not AffectedArea Is Nothing Then
        Application.EnableEvents = False
        AffectedArea.Value = AffectedArea.Value
        Application.EnableEvents = True
    End If
End Sub

这会将事件限制为仅更改 OperationalArea 中定义的“B2:F10”区域内的单元格。

如果您不喜欢这个想法,您可以尝试使用 Application.Calculation,但是当您打开多个工作表或工作簿时,它会变得非常混乱。