保护工作表时出现错误400

根据我需要的特定单元格的值,解除工作表的保护,设置范围locking并重新保护工作表。 相反,如果单元格的值(在这种情况下单元格B4等于“工作”),那么我需要取消保护工作表,解锁单元格,然后重新保护工作表。 这是因为当单元格B4不等于工作时,我想停止用户对单元格A8:B19的Tab键。 当B4 =“工作”时,用户可以将数字input到单元格A8:B19中。 当B4 <>“工作”时,input的选项是有限的,而且我只设置了在被locking的单元格之间的选项卡,这使得input更容易。

目前我有这个:

Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B4")) Is Nothing Then If Range("B4").Value = "work" Then Shapes("Rectangle 1").Visible = False Application.EnableEvents = False ActiveSheet.Unprotect ActiveSheet.Range("A8:B19").Locked = True ActiveSheet.Protect 'When the code hits this line it throws error 400 Application.EnableEvents = True End If If Range("B4").Value <> "work" Then Shapes("Rectangle 1").Visible = True Application.EnableEvents = False ActiveSheet.Unprotect ActiveSheet.Range("A8:B19").Locked = True ActiveSheet.Protect 'When the code hits this line it throws error 400 Application.EnableEvents = True End If End If End Sub 

很明显,它取决于单元格B4的值,而“ActiveSheet.Protect”会导致错误发生,但总是这样。 注释掉有问题的行允许VBA代码按预期的方式运行,但是它将工作表解锁。 我已经尝试移动“ActiveSheet.Protect”行来进一步下降,调用它在不同的子等,没有运气,总是导致错误400.我知道Elseif无疑是更好的做法,但我改变了从If,ElseIf End如果看是否有任何区别。 它没有。

奇怪的是,我尝试了类似的事情来certificate另一个Excel工作表中的原则与下面的代码:

  Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1")) Is Nothing Then Dim i As Integer If Cells(1, 1) = "unlock" Then i = 1 Shapes("Oval 1").Visible = False Application.EnableEvents = False ActiveSheet.Unprotect For i = 1 To 5 Cells(i, 2) = i Next i ActiveSheet.Range("C1:C5").Locked = False ActiveSheet.Protect ElseIf Cells(1, 1) <> "unlock" Then i = 1 Shapes("Oval 1").Visible = True Application.EnableEvents = False ActiveSheet.Unprotect For i = 1 To 5 Cells(i, 2) = "" Cells(i, 3) = "" Next i ActiveSheet.Range("C1:C5").Locked = True ActiveSheet.Protect End If Application.EnableEvents = True End If End Sub 

这和我所期望的完全一样,并且做了类似的事情。 除了不同的单元格和一个for循环,我看不到上面两个代码样本之间的任何区别,关于解除保护,更改lockingvariables,保护过程。

挡了,任何帮助非常赞赏。

使用UserInterfaceOnly参数 – 这将保护工作表,但仍允许进行任何编程式更改,而无需取消保护和重新保护:

 Sheets("Some Sheet").Protect Password:="Pass123", UserInterfaceOnly:=True Sheets("Some Sheet").Range("A1").Value = "Foo" '// code runs without error 

您可以使用Workbook_Open事件来确保所有必需工作表都以这种方式被locking,然后不需要在任何进一步的代码中进行pipe理:

 Private Sub Workbook_Open() For Each ws In ThisWorkbook.Sheets ws.Protect UserInterfaceOnly:=True Next End Sub