[英]How to combine multiple “worksheet_change events” in a protected worksheet? VBA
我有一个代码(代码 1 )来保护某些单元格不被编辑,这取决于另一个单元格。 我还有另一段代码(代码 2 )。 当我更改它时,此代码将删除下拉列表旁边的值。 它们都基于 worksheet_change 潜艇。
现在我想将两者结合起来(代码 3 )。 然而,当我这样做时,代码 1功能不再起作用。 它不会给我一个错误,但它也不再锁定内容单元格。 有谁知道我需要改变什么才能将它们结合起来才能工作?
代码 1
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B2") = "Text 1" Then
Sheet2.Unprotect Password:="Secret"
Range("F4:Q4").Locked = True
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "text 2" Then
Sheet2.Unprotect Password:="Secret"
Range("F4:I4").Locked = False
Range("B2").Locked = False
Range("J4:Q4").Locked = True
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "text 3" Then
Sheet2.Unprotect Password:="Secret"
Range("B4:Q4").Locked = False
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "text 4" Then
Sheet2.Unprotect Password:="Secret"
Range("B4:Q4").Locked = False
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
End If
代码 2
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
If Target.Validation.Type = 3 Then
Application.EnableEvents = False
Target.Offset(0, 1).ClearContents
End If
End If
exitHandler:
Application.EnableEvents = True
Exit Sub
End Sub
代码 3
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = True
If Target.Column = 2 Then
If Target.Validation.Type = 3 Then
Sheet2.Unprotect Password:="Secret"
Application.EnableEvents = False
Target.Offset(0, 1).ClearContents
Sheet2.Protect Password:="Secret"
End If
End If
exitHandler:
Application.EnableEvents = True
Exit Sub
If Range("B2") = "C-shuttle 150 core" Then
Sheet2.Unprotect Password:="Secret"
Range("F4:Q4").Locked = True
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "C-shuttle 250 core" Then
Sheet2.Unprotect Password:="Secret"
Range("F4:I4").Locked = False
Range("B2").Locked = False
Range("J4:Q4").Locked = True
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "C-shuttle 250 core with platfrom for DB or TD" Then
Sheet2.Unprotect Password:="Secret"
Range("B4:Q4").Locked = False
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
ElseIf Range("B2") = "C-shuttle 350 core" Then
Sheet2.Unprotect Password:="Secret"
Range("B4:Q4").Locked = False
Range("B2").Locked = False
Sheet2.Protect Password:="Secret"
End If
End Sub
更新:
我更改了代码 3,我发现嵌入很重要
Sheet2.Unprotect Password:="Secret"
在 if 子句中。 我编辑了代码 3。
原因代码 2 无法正常运行是因为您在代码块之前有一个Exit Sub
指令。 带有冒号的 VBA 行标签不会阻止代码运行。 它们将按顺序处理。 通常这些应该放在子程序的末尾作为错误处理的一部分。
考虑以下调整错误处理和使用更具可读性的Select Case
而不是ElseIf
。 此外,考虑使用With...End With
和句点限定符的显式上下文。 (避免 Excel 代码中任何地方的不合格Range
。请参阅如何避免在 Excel Z6E3ECZ386A9F60087B 中使用 Select ) 最后,处理.Unprotect
和.Protect
一次:
Private Sub Worksheet_Change(ByVal Target As Range)
Sheet2.Unprotect Password:="Secret" ' UNPROTECT SHEET WHEN ENTERING SUB
Application.EnableEvents = True
If Target.Column = 2 and Target.Validation.Type = 3 Then
Application.EnableEvents = False
Target.Offset(0, 1).ClearContents
End If
With Sheet2
Select Case .Range("B2")
Case "C-shuttle 150 core"
.Range("F4:Q4").Locked = True
.Range("B2").Locked = False
Case "C-shuttle 250 core"
.Range("F4:I4").Locked = False
.Range("B2").Locked = False
.Range("J4:Q4").Locked = True
Case "C-shuttle 250 core with platfrom for DB or TD"
.Range("B4:Q4").Locked = False
.Range("B2").Locked = False
Case "C-shuttle 350 core"
.Range("B4:Q4").Locked = False
.Range("B2").Locked = False
End Select
End With
ExitHandler:
Sheet2.Protect Password:="Secret" ' ALWAYS PROTECT SHEET AT END ERROR OR NOT
Application.EnableEvents = True
Exit Sub
ErrHandler:
MsgBox Err.Number & " - " & Err.Description, vbCritical
Resume ExitHandler
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.