【问题标题】:Lock certain cells depending on value from another cell根据另一个单元格的值锁定某些单元格
【发布时间】:2018-06-12 02:42:12
【问题描述】:

我希望根据一行数据中下拉菜单的输入来锁定特定范围的单元格?

例如,在每一行中,第三个单元格提出一个问题 - 通过下拉列表给出“是”或“否”。如果用户选择“否”,则必须锁定剩余的三个单元格。但是,如果用户选择“是”,则剩余的单元格仍可用于输入数据。

   A         B          C            D         E         F  
| S.No   |  ID    |  Response   |  TIme  |  Value  | Expense | 
| 1      |  12345 |  NO         |  ----  |  ----   |  ----   |  (Locked Cells)
| 2      |  67y45 |  YES        |  44    |  1.68   |    1500 |  (UnLocked Cells)
| 3      |  12456 |  NO         |  ----  |  ----   |  ----   |  (Locked Cells)

就像 D2 到 F2 必须被锁定,而 D3 到 F3 应该可以进入,而 D4 到 F4 又被锁定等等,...

我尝试了以下代码,但据我观察,它没有锁定单元格或没有执行任何操作

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("C2:C160") = "YES" Then
        Range("D2:D160").Locked = False
    ElseIf Range("C2:C160") = "NO" Then
        Range("D2:D160").Locked = True
        Range("E2:E160").Locked = True
        Range("F2:F160").Locked = True
    End If
End Sub

160为最高范围。

任何帮助都会非常有帮助,谢谢。

【问题讨论】:

  • 如果您选择范围,例如Range("C2:C160") = "yes",则VBA 会扫描整个范围的数据,而不是如果范围内的任何单元格包含关键字yes。这也是你的代码不起作用的原因
  • @Rawrplus :哦,知道了,你能帮我看看吗..我不知道如何继续前进,谢谢..
  • 很高兴,但是 Vityata;s 的代码应该可以工作,而且它对 m 来说似乎是一个很好的实现,所以我认为它并没有太大变化(除了不同的实现方法)
  • @Rawrplus Vitayata 确实帮了很多忙,但我无法让代码运行..它仍然允许输入值..任何替代方案都会很有帮助

标签: vba excel


【解决方案1】:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("C2:C160")) Is Nothing Then Exit Sub
    If Target.Cells.Count > 1 Then Exit Sub

    Me.Unprotect Password:="password"

    If Target = "YES" Then            
        Target.Offset(0,1).Resize(1,3).Locked = False
    ElseIf Target = "NO" Then
        Target.Offset(0,1).Resize(1,3).Locked = True        
    End If

    Me.Protect Password:="password"

End Sub

这个想法是检查Target 值。改变的是细胞。因此,您可以从Intersect() 开始,它会检查更改后的单元格是否在Range("C2:C160") 中:

If Not Intersect(Target, Range("C2:C160")) Then Exit Sub

然后试试看变化的单元格是否大于1:

If Target.Cells.Count > 1 Then Exit Sub

最后,基于"YES" 和“否”,您可以提供锁定单元格。您可以考虑使用UCase(),以使您的代码也适用于“是”

If UCase(Target) = "YES" Then
...
ElseIf UCase(Target) = "NO" Then

关于锁定和解锁的单元格以及是否可以选择它们,请参阅这篇文章,属性解释得很好:

https://support.office.com/en-us/article/lock-or-unlock-specific-areas-of-a-protected-worksheet-75481b72-db8a-4267-8c43-042a5f2cd93a

【讨论】:

  • 真的很感谢您的输入和时间...我尝试了您的代码,但它说 the cell or chart you are trying to change is protected....,所以我没有保护纸,但是现在选择了当我跑步时没有锁定单元格。该行 - If Not Intersect(Target, Range("C2:C160")) Then 在调试窗口中以黄色突出显示...我对 VB/宏非常陌生,所以真的不知道这里有什么问题
  • @Goku - 你把代码放在哪里?它应该在工作表中。我的答案中有一些我忘记了,现在编辑了。一直按F8,是调试的好方法。
  • 对,我已经把它放在工作表上,对应的右手值说Change 并保存了它。当我尝试选择否时,它仍然允许在其他单元格上输入值
  • @Goku 您必须提供密码并保护工作表。 .Locked 只是一个属性。添加Me.Unprotect Password:="password"Me.Protect Password:="password"。实际上密码是可选的。
  • @JohnBus​​tos - 有道理,可能 OP 不想要整个范围。我已经编辑了。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多