簡體   English   中英

VBA Excel鎖定所有單元格

[英]vba excel locks all cells

我有一本woorkbook,其中包含幾個vba子例程。 在用戶選中復選框后,其中一種例程會更改工作表。 問題在於,代碼運行后,所有單元格都被鎖定,即使未在“格式化單元格”->“保護”菜單中將其標記為已鎖定。 但是,如果我調出VBE並執行代碼msgbox Range(“ C24”)。Locked,則解鎖的單元格可以再次編輯。

代碼如下:

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 hack的情況下編輯未鎖定的單元格。 誰能發現代碼錯誤並提出更正建議?

我正在添加用於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。 您可以通過將其Locked屬性設置為false來解鎖任何范圍,也可以使用Unprotect方法來解鎖任何工作簿:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM