【问题标题】:Lock a range of cells in row based on first cell in row for every row in a table根据表中每一行的行中的第一个单元格锁定行中的单元格范围
【发布时间】:2020-09-05 16:22:21
【问题描述】:

提前感谢您的帮助。

简短版:

  • 需要这样才能根据该行中第一个单元格包含的内容锁定表格中的特定单元格。

  • 用于确定行中其他单元格是否被锁定的单元格需要始终保持解锁状态

我正在处理一个包含表格的 Excel 工作表。该表用于记录产品的关键信息,每天更新。每个产品都在其自己的行中定义,列用于显示详细信息,例如“图纸编号”和“客户”等。 根据产品处于开发阶段的阶段以及产品完成后的进展情况,它将用列表中的单个“状态”进行标记,例如“正在进行”、“不良产品”、“已归档”等。 enter image description here 在每一行的每个单元格中,单元格包含的文本是通过列表形式的数据验证或手动输入来确定的。例如,客户列中的所有单元格将使用下拉菜单从列表中选择客户,但是图纸编号列中的单元格始终是其中一种,因此需要手动输入。

由于有如此多的人访问和编辑此表格,因此存在误点击和键入问题,这会导致数据被覆盖而没有人注意到他们已经这样做了。 由于这个问题,我希望能够根据行中第一个单元格包含的内容(“状态”列)锁定一行中的特定列。

在状态列包含“已归档”一词的情况下,我想锁定整行以防止其内容被更改。

如果单词是“正在进行”,我想锁定该行中的 AA 和 AB 列。

由于一个已知的错误,有时需要返回并编辑信息,所以我需要它,所以 State 列始终保持解锁状态,无论它包含什么。

我附上了一份经过编辑的 Excel 表,其中包含我对编码解决方案的尝试。 https://drive.google.com/open?id=1rzTp0ur1tpXIY_Wa3cVlcwruJ7Q1rT 代码也可以在下面看到。 注意:我什至不确定如何满足“正在进行”条件的要求,所以如果有人能指出我正确的方向,我将不胜感激

Sub Locking()

Dim KeyCells As Range
    Set KeyCells = Range("A3:A612")

For Each cell In Range("A3:A612")

    If cell.Value = "Archived" Then
        cell.EntireRow.Locked = True


    ElseIf cell.Value = "Ongoing" Then
        cell.EntireRow.Locked = False


    ElseIf cell.Value = "Bad" Then
        cell.EntireRow.Locked = False

    End If

Next cell

End Sub

这是我在这里的第一篇文章,因为我无法通过查看几个不同的堆栈溢出问题找到解决方案。我还观看了许多有关 VBA 代码的视频,但肯定缺少一些东西,并且正在努力弄清楚它是什么。

如果我发布的内容有误或额外的细节会有所帮助,请告诉我。

非常感谢任何和所有帮助!

谢谢

编辑:代码现在可以工作了

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    而不是锁定整行

     cell.EntireRow.Locked = False
    

    如果您只想在该行中锁定 AA 和 AB,请执行以下操作:

     cell.EntireRow.Locked = False 'unlock entire row first
     'then lock just the 2 rows
     Range("AA" & cell.Row & ":AB" & cell.Row).Locked = True
    

    其他人的工作方式相同。

    【讨论】:

    • 感谢您的回复。因此,我尝试将代码应用于“正在进行”部分,但没有任何运气。例如,当我将 A5 更改为 Ongoing 时,我仍然可以编辑相关单元格 AA 和 AB。我在这个特定的工作表上有代码,因此只要有工作表更改,就会调用锁定单元 sub,但它似乎没有运行 sub。我已经包含了一个包含我正在使用的代码的文本文件的链接:drive.google.com/open?id=1ocvhpLQ5fmVNnjs0d-rM-xliVAGLCxGa
    • 您必须保护您的工作表。使用密码保护工作表后,所有带有.Locked = True 的单元格都将被锁定。如果您不保护工作表,则不会发生任何事情。
    • @Samoknight 如果此答案解决了您的问题,请将其标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多