【问题标题】:How Can You Lock Rows of Cells in Excel Based on Cell Value?如何根据单元格值锁定 Excel 中的单元格行?
【发布时间】:2020-03-16 14:55:49
【问题描述】:

所以我知道可以将单元格格式化为锁定,然后保护工作表以防止该数据被覆盖。但我希望能够动态锁定工作表中的单元格。通过做一些谷歌搜索,我尝试根据我的需要调整下面的代码块。目的是,如果 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

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

【问题讨论】:

  • IsNot Nothing =) 看来您对 vb.net 感到困惑
  • that still doesn't seem to be working. - 什么不起作用?

标签: excel vba


【解决方案1】:

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

【讨论】:

  • 使用这些代码块中的任何一个,每当我对 A 列中的单元格进行更改时,我都会收到“运行时错误'1004':无法设置 Range 类的 Locked 属性”。我是否开始在所有单元格锁定或解锁的情况下,尝试编辑受保护的工作表时出现此错误。
  • 正确 - 因为您无法编辑受保护的工作表,除非您先取消保护,或使用 UserInterfaceOnly:=True 进行保护。
  • 我想我当时有点困惑。如果工作表不受保护,那么锁定单元格是否仍允许用户更改它们?目的是一旦输入 X,任何人都无法覆盖信息。进行更改时我们是否还必须保护/取消保护工作表?
  • 是...除非您最初使用 UserInterfaceOnly:=True 以编程方式保护工作表。
  • 我根据您的 cmets 修改了问题,以显示我现在正在运行的内容。我仍然没有得到预期的结果,只有用户界面的代码块似乎没有做任何事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多