如何锁定自动填充的单元格
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
,但是当您打开多个工作表或工作簿时,它会变得非常混乱。
我想在输入值后锁定单元格。当我更改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
,但是当您打开多个工作表或工作簿时,它会变得非常混乱。