2016-04-14 284 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,这意味着单元格没有被锁定。这不起作用有一个解决方案,但谢谢。 –

相关问题