2016-02-03 71 views
2

根據我需要的特定單元格的值,可能取消工作表的保護,將範圍設置爲鎖定並重新保護工作表。相反,如果單元格的值(在這種情況下單元格B4等於「工作」),那麼我需要解除工作表的保護,解鎖單元,然後重新保護工作表。這是因爲當單元格B4不等於工作時,我想停止用戶對單元格A8:B19的製表符。當B4 =「工作」時,用戶可以將數字輸入到單元格A8:B19中。當B4 <>「work」時,輸入的選項有限,並且我只設置了僅在已鎖定的單元格之間選中的選項卡,從而使輸入更容易。保護工作表時出現錯誤400

目前我有這樣的:

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如果看它是否有任何區別。它沒有。

奇怪的是,我嘗試過類似的事情,證明在另一個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循環,我看不到上面的兩個代碼示例與解除保護,更改鎖定變量,保護過程之間的區別。

擋板,任何幫助非常感激。

回答

1

使用UserInterfaceOnly說法 - 這保護工作表,但仍允許無需取消保護並重新保護髮生任何方案變動:

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

可以使用Workbook_Open事件,以確保任何所需的紙張被鎖定通過這種方式,然後不需要在任何進一步的代碼中進行管理:

Private Sub Workbook_Open() 

For Each ws In ThisWorkbook.Sheets 
    ws.Protect UserInterfaceOnly:=True 
Next 

End Sub 
相關問題