繁体   English   中英

如何在受保护的工作表中组合多个“worksheet_change 事件”? VBA

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM