vba excel锁定所有单元格
问题描述:
我有一个包含几个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
这可能是一些错误?
答
你想让你的单元格保持解锁状态,对吗?如果是这样,那么你不应该在你的Sub的结尾调用protectWindow。您可以通过使用取消保护方法将其锁定属性设置为false或任何工作簿来解锁任何范围:
Sub UnlockingCells()
ActiveSheet.Range("A1:G37").Locked = False
ActiveSheet.Unprotect
End Sub
+0
实际上,保护是必要的。有一些锁定的单元格。最奇怪的部分是MsgBox Range(“C24”)。Locked的结果是False,这意味着单元格没有被锁定。这不起作用有一个解决方案,但谢谢。 –
您能分享'Call protectWindow'的代码吗? –
添加了代码@SiddharthRout –