Notifications
Clear all

Adaptar código

5 Posts
2 Usuários
0 Reactions
1,187 Visualizações
(@tiago_luz)
Posts: 40
Eminent Member
Topic starter
 

Bom dia Pessoal,

Por favor, alguém sabe se é possível adaptar o código abaixo para travar as células alvo somente após o usuário salvar a planilha e não exatamente após a inserção de um dado. Da forma que está se for inserido um valor incorreto não será possível corrigir, porém se travar após salvar o usuário terá mais tempo para avaliar a informação e corrigi-la caso tenha cometido erro. A solução pode ser outra, mas que de um tempo para revisão e não dependa do usuário, como por exemplo é um botão, recomendo o "salvar", pois obrigatoriamente ele vai ter que salvar a planilha.

Private Sub Worksheet_Change(ByVal Target As Range)
Target.Select
If Target.Column = 1 Then ' O número se refere à coluna em que o código funcionará.
If IsDate(ActiveCell.Value) Then
Sheets("Plan1").Unprotect Password:="SENHA" ' Senha da planilha
Selection.Locked = True
Sheets("Plan1").Protect Password:="SENHA" 'Senha da planilha
End If
End If
End Sub

 
Postado : 20/01/2013 8:47 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Coloque a instrução para Salvar quando fechar o Arquivo :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Sheets("Plan1").Protect Password:="SENHA" 'Senha da planilha
    
    Application.DisplayAlerts = False
        ActiveWorkbook.Save
    Application.DisplayAlerts = True
    
End Sub

Elimine a instrução de proteção do evento Change.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/01/2013 9:04 am
(@tiago_luz)
Posts: 40
Eminent Member
Topic starter
 

Não entendi exatamente o procedimento, era remover a instrução que coloquei acima e adicionar a sua? Pelo que entendi ela só vai salvar a planilha. Fiz isto e não mudou muita coisa. Na verdade este código eu peguei da net, não foi feito por mim, não conheço muito VBA.
Eu preciso que depois que o usuário insira uma informação em algumas colunas que esta informação não possa ser apagada/alterada mais (é data, assim evito que eles troquem ela e pareça que estão dentro do prazo), o objetivo não é bloquear a planilha inteira, na verdade ela já está bloqueada, com estas estas células alvo não bloqueadas (serão após inserir a data). Esta instrução que postei funciona direitinho, mas se o usuário colocar a data errada não tem como voltar, o excel trava a célula, por isto eu queria que após inserir a informação que a célula não trave exatamente após o evento, mas sim que todas as células alteradas só travem depois que salvar a planilha e de forma automática.
Se era mais ou menos isto que ia ocorrer com seu código, me desculpe, mas ainda estou na fase copia/cola no VBA.

abs

 
Postado : 20/01/2013 2:18 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Tiago, na rotina que postou, a mesma está no Evento Change da Aba, então toda vez que alterar alguma celula as instruções abaixo farão o s eguinte :

1 ) - Sheets("Plan1").Unprotect Password:="SENHA" ' Senha da planilha - Desprotege a Aba
e depois :
2 ) - Sheets("Plan1").Protect Password:="SENHA" 'Senha da planilha - Protege novamente.

Para que se possa verificar se tem algum erro e modificar, precisa somente desabilitar a linha que protege em sua rotina, não precisa apagar sua rotina.

Minha sugestão foi de colocar no Evento Before_Close do Workbook, assim a Planilha será Salva sempre que fechar o arquivo.

Sua explicação está um pouco confusa, primeiro você diz :
Eu preciso que depois que o usuário insira uma informação em algumas colunas que esta informação não possa ser apagada/alterada mais

e depois :
por isto eu queria que após inserir a informação que a célula não trave exatamente após o evento, mas sim que todas as células alteradas só travem depois que salvar a planilha e de forma automática

Se quer que a Proteção seja aplicada somente apos salvar a planilha, você pode adicionar a instrução abaixo no evento do Workbook :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Sheets("Plan1").Protect Password:="SENHA" 'Senha da planilha
    
    Application.DisplayAlerts = False
        ActiveWorkbook.Save
    Application.DisplayAlerts = True
    
End Sub

Assim, toda vez que salvar, a mesma será protegida.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/01/2013 8:25 pm
(@tiago_luz)
Posts: 40
Eminent Member
Topic starter
 

Opa, entendi agora. Bom na verdade a planilha vai ser utilizada por outras pessoas que não devem saber qual é a senha para corrigir o erro. Bom, eu estava pensando aqui, se eu desproteger a planilha e proteger novamente só quando fechar, neste meio tempo o usuário poderá alterar outros dados da planilha, eu pensei que seria legal que depois que o usuário inserir a informação um "message box" perguntaria se a informação inserida está OK, se sim, entra active.cell locked e o evento "Protect Password". Bom como já estou meio grandinho, dei uma pesquisada na net e descobri um código para msg box e voilá... fiz este frankstein abaixo e deu cerinho, puts, fiquei feliz.

Bom, valeu pela ajuda, se não fosse sua sugestão eu não teria observado esta possibilidade. Bom, vou fechar esta dúvida e abrir "adaptar código 2", hehehe

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iRet As Integer
Dim strPrompt As String
Dim strTitle As String
Target.Select
If Target.Column = 9 Then ' O número se refere à coluna em que o código funcionará.
If IsDate(ActiveCell.Value) Then
Sheets("dasap_5.3.1_F1").Unprotect Password:="gosa" ' Senha da planilha
If ActiveCell.Validation.Value = True Then
strPrompt = "A data inserida está correta?"
' Dialog's Title
strTitle = "My Tite"

'Display MessageBox
iRet = MsgBox(strPrompt, vbYesNo, strTitle)

' Check pressed button
If iRet = vbYes Then
Selection.Locked = True
End If
Sheets("dasap_5.3.1_F1").Protect Password:="gosa" ' Senha da planilha
End If
End If
End If

End Sub

 
Postado : 22/01/2013 5:48 pm