首页 > 解决方案 > 如何根据单元格值锁定 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

但这似乎仍然不起作用......

标签: excelvba

解决方案


您需要更改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

推荐阅读