2016-04-14 251 views
0

我有一個包含幾個vba子例程的woorkbook。其中一個例程在用戶選中複選框後對工作表進行更改。問題是,代碼運行後,所有單元格都被鎖定,即使未在「格式」單元格 - >「保護」菜單中標記爲鎖定。但是,如果我調出VBE並執行代碼msgbox Range(「C24」)。鎖定,解鎖的單元格可以再次編輯。vba excel鎖定所有單元格

的代碼如下:

Sub cbAcertos_Click() 

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Formulário") 

Call unProtectWindow 

If Me.cbAcrescimo Then 
'Caso tenhamos acrescentado o valor de acréscimo por refeição do AEV 
    If Me.cbAcertos Then 
    'E seja necessário efectuar algum acerto 
     Application.ScreenUpdating = False 
     'Desligamos a actualização do ecrã 
     With Range("F30") 
      .ClearContents 
      .Value = "Valor Acertos:" 
      .Borders.LineStyle = xlNone 
     End With 
     'Inserimos as etiquetas de texto 
     With Range("G30") 
      .Formula = "" 
      .NumberFormat = "$#,##0.00;[Red]$#,##0.00" 
      .Borders.LineStyle = xlNone 
     End With 
     'Preparamos a célula que receberá o valor do acerto 
     With Range("F31") 
      .Value = "Sub-Total:" 
      .Borders.LineStyle = xlNone 
     End With 
     'Mais uma etiqueta 
     With Range("G31") 
      .Formula = "=G29+G30" 
      .FormulaHidden = True 
      .Borders.LineStyle = xlNone 
     End With 
     'Preparamos a célula que efectua o cálculo da soma dos valores 
     'com o valor de acerto a efectuar 
     With Range("F32") 
      .Value = "Total (IVA):" 
      .Borders(xlEdgeTop).LineStyle = xlDouble 
      .Borders(xlEdgeTop).ColorIndex = 1 
     End With 
     'Etiqueta da célula com o total 
     'acrescido de IVA 
     With Range("G32") 
      .Formula = "=IF(Escola=""Dr. João Rocha - Pai"", G31, G31*1.23)" 
      .FormulaHidden = True 
      .NumberFormat = "$#,##0.00;[Red]$#,##0.00" 
      .Borders(xlEdgeTop).LineStyle = xlDouble 
      .Borders(xlEdgeTop).ColorIndex = 1 
     End With 
     'Preparamos a célula que efectua 
     'o cálculo do valor acrescido de IVA 
     Application.ScreenUpdating = True 
     'Activamos a actualização do ecrã 
    ElseIf Not Me.cbAcertos Then 
    'Caso não tenhamos de efectuar acertos 
     Application.ScreenUpdating = False 
     'Desligamos a actualização do ecrã 
     With Range("F30") 
      .Value = "Total (IVA):" 
      .Borders(xlEdgeTop).LineStyle = xlDouble 
      .Borders(xlEdgeTop).ColorIndex = 1 
     End With 
     'Preparamos a etiqueta do total 
     'acrescido de IVA 
     With Range("F31") 
      .ClearContents 
     End With 
     'Limpeza de células não actualizadas 
     With Range("G30") 
      .Formula = "=IF(Escola=""Dr. João Rocha - Pai"", G29, G29*1.23)" 
      .Borders(xlEdgeTop).LineStyle = xlDouble 
      .Borders(xlEdgeTop).ColorIndex = 1 
     End With 
     'Preparamos a célula que efectua, agora, 
     'o cálculo do total acrescido de IVA 
     With Range("G31") 
      .Formula = "" 
     End With 
     'Mais limpezas 
     With Range("F32") 
      .Value = "" 
      .Borders.LineStyle = xlNone 
     End With 
     With Range("G32") 
      .Formula = "" 
      .FormulaHidden = False 
      .NumberFormat = xlNone 
      .Borders.LineStyle = xlNone 
     End With 
     Application.ScreenUpdating = True 
    End If 
Else 
'Caso não tenhamos de acrescentar o acréscimo do AEV 
    If Me.cbAcertos Then 
     'Desligamos a actualização do ecrã 
     Application.ScreenUpdating = False 
     'Acrescentamos o texto 
     With Range("F28") 
      .Value = "Valor Acerto:" 
     End With 
     'Limpamos e desbloqueamos a célula que recebe o valor do acerto 
     With Range("G28") 
      .ClearContents 
     End With 
     'Acrescentamos a célula que recebe a soma 
     'entre o valor das refeições e o valor do acerto 
     With Range("F29") 
      .Value = "Sub-Total:" 
      .FormulaHidden = True 
     End With 
     With Range("G29") 
      .Formula = "=G27+G28" 
     End With 
     'Acrescentamos a célula que recebe o valor total 
     'acrescido de IVA 
     With Range("F30") 
      .Font.Size = 10 
      .Font.Bold = True 
      .HorizontalAlignment = xlRight 
      .VerticalAlignment = xlCenter 
      .Value = "Total (IVA):" 
     End With 
     'Acrescentamos o cálculo do IVA caso 
     'não sejam refeições do AEV 
     With Range("G30") 
      .FormulaHidden = True 
      .Font.Size = 10 
      .Formula = "=IF(Escola=""Dr. João Rocha - Pai"", G29, G29*1.23)" 
      .NumberFormat = "$#,##0.00;[Red]$#,##0.00" 
     End With 
     'Acrescentamos a border dupla para indicar a soma 
     Range("F30:G30").Borders(xlEdgeTop).LineStyle = xlDouble 
     Range("F30:G30").Borders(xlEdgeTop).ColorIndex = 1 
     'Activamos a actualização do ecrã 
     Application.ScreenUpdating = True 
     MsgBox Range("C24").Locked 
    ElseIf Not Me.cbAcertos Then 
    'Caso não existam acertos desactivamos o ecrã 
     Application.ScreenUpdating = False 
     'Alteramos o conteúdo da célula para indicar 
     'o total acrescido de IVA 
     With Range("F28") 
      .Value = "Total (IVA):" 
     End With 
     'Limpamos o conteúdo nas restantes células 
     With Range("F29") 
      .ClearContents 
     End With 
     'Alteramos a formula existente 
     With Range("G28") 
      .Formula = "=IF(Escola=""Dr. João Rocha - Pai"", G27, G27*1.23)" 
     End With 
     'Mais limpezas 
     With Range("G29") 
      .Formula = "" 
     End With 
     With Range("F30") 
      .ClearContents 
     End With 
     With Range("G30") 
      .Formula = "" 
     End With 
     With Range("F30:G30") 
      .Borders.LineStyle = xlNone 
     End With 
     'Activamos a actualização do ecrã 
     Application.ScreenUpdating = True 
    End If 
End If 

Call protectWindow 

End Sub 

這不應該發生,用戶應該能夠隨時修改鎖定單元的內部消除MSGBOX破解。 任何人都可以發現錯誤的代碼並提出更正?

我添加了protectWindow和unProtectWindow的代碼。保護是必要的,因爲一些單元格被鎖定。

Sub protectWindow() 
Dim wb As Workbook 
Dim ws As Worksheet 

Set wb = ThisWorkbook 
Set ws = wb.Worksheets("Formulário") 

wb.Protect pwd, Structure:=True, Windows:=True 
With ws 
    .Protect pwd 
    .EnableSelection = xlUnlockedCells 
End With 

End Sub 

Sub unProtectWindow() 

With ThisWorkbook 
    .Unprotect pwd 
    .Worksheets("Formulário").Unprotect pwd 
End With 

End Sub 

這可能是一些錯誤?

+0

您能分享'Call protectWindow'的代碼嗎? –

+0

添加了代碼@SiddharthRout –

回答

1

你想讓你的單元格保持解鎖狀態,對嗎?如果是這樣,那麼你不應該在你的Sub的結尾調用protectWindow。您可以通過使用取消保護方法將其鎖定屬性設置爲false或任何工作簿來解鎖任何範圍:

Sub UnlockingCells() 
    ActiveSheet.Range("A1:G37").Locked = False 
    ActiveSheet.Unprotect 
End Sub 
+0

實際上,保護是必要的。有一些鎖定的單元格。最奇怪的部分是MsgBox Range(「C24」)。Locked的結果是False,這意味着單元格沒有被鎖定。這不起作用有一個解決方案,但謝謝。 –