vba - 使用 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
但是当我去尝试测试范围是否已被锁定时,即使满足条件,我仍然可以在工作表受到保护的情况下编辑单元格。
解决方案
只要您的工作表不受保护,该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 项目
最后:记住解锁用户应该能够修改的所有单元格,尤其是您的“蒙大拿州”单元格。
推荐阅读
- javascript - 在 JavaScript 中使用反引号(反引号)将导致“无法读取属性 'style' of null '
- tfs - 同一个 TFS 版本的两个实例能否共享一个数据层
- php - 从php中的字符串组中获取替代字符串
- r - 我可以使用 R 中的循环自动执行此代码吗?
- python - 正则表达式(re.search)无法检测错误
- c# - foreachasync 和 for 循环与实体记录的区别?
- sql - SQL查询以找出用户在一周中访问的天数
- php - 如何在我的示例 php 代码中添加一个 css 类
- python - Python3:+ 不支持的操作数类型:“float”和“str”
- google-apps-script - 谷歌脚本卡在 getRange