首页 > 解决方案 > 使用 VBA 代码根据带有下拉菜单的单元格的内容来防止在某些单元格中进行编辑

问题描述

公平警告:在这里完成 VBA 新手。

我有一张我要寄出的单子。该表单有一个单元格 (D8),从下拉列表中进行选择。根据该列表中的选择,我希望锁定和解锁工作表的某些区域,以便他们可以填写的表格的唯一部分与他们在 D8 中的选择有关。所以说他们在下拉列表中输入“蒙大拿州”,我只希望表单中具有适用于该选择的区域的部分是可编辑的。然后,我将根据此下拉列表中的选择来锁定和解锁各种范围。

这是我到目前为止所拥有的:

Private Sub Worksheet_Change(ByVal Target As Range)

    If ActiveSheet.Cells(8, 4).Text = "Montana" Then
        ActiveSheet.Range(Cells(14, 1), Cells(15, 6)).Locked = False
    Else
       ActiveSheet.Range(Cells(14, 1), Cells(15, 6)).Locked = True
    End If

End Sub

但是当我去尝试测试范围是否已被锁定时,即使满足条件,我仍然可以在工作表受到保护的情况下编辑单元格。

标签: vbaexcel

解决方案


只要您的工作表不受保护,该locked属性就不会做任何事情。Excel中对此进行了解释:调用单元格格式并选择“保护”选项卡。

在此处输入图像描述

问题是一旦一个单元格被锁定并且您的工作表受到保护,您就不能简单地解锁它 - 您必须首先删除工作表的保护。所以你的代码可能看起来像:

Private Sub Worksheet_Change(ByVal Target As Range)
    Const MySecretPassword = "Hallo"

    If Intersect(Target, Cells(8, 4)) Is Nothing Then Exit Sub

    On Error GoTo Protect
    ActiveSheet.Unprotect MySecretPassword 
    If ActiveSheet.Cells(8, 4).Text = "Montana" Then
        ActiveSheet.Range(Cells(14, 1), Cells(15, 6)).Locked = False
    Else
        ActiveSheet.Range(Cells(14, 1), Cells(15, 6)).Locked = True
    End If
Protect:
    ActiveSheet.Protect MySecretPassword

End Sub

请注意,我添加了一个检查 cell(8, 4) 是否已修改,而不是任何其他内容,以防止不必要的代码执行。

另请注意:由于您需要代码中的密码,因此您还必须保护您的 VBA 项目

最后:记住解锁用户应该能够修改的所有单元格,尤其是您的“蒙大拿州”单元格。


推荐阅读