Notifications
Clear all

VBA - Como bloquear células após preenchimento obrigatório ?

17 Posts
3 Usuários
0 Reactions
4,325 Visualizações
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Olá,

Bom dia.

Possuo uma planilha onde determinadas células precisam ser preenchidas pelo usuário. Após os preenchimento de todas essas células, os valores não devem ser alterados ou excluídos.

Encontrei na internet um código que faz essa tarefa de bloqueio, só que de forma muito rígida. Ocorre que se o valor preenchido for errado, só pode ser alterado com "senha" do código, pois o bloqueio é automático.

Tentei usar na minha planilha, mas causava muita dificuldade, pois a cada preenchimento errado tinha que inserir a senha. A idéia é que, como existe uma obrigatoriedade para o preenchimento de determinadas células, então o bloqueio somente ocorra caso todas as células sejam preenchidas e ainda com confirmação do usuário.

O intervalo vai de A2 até I2, esse é o intervalo a ser preenchido e também bloqueado após a célula I2 ser preenchida. O preenchimento da célula I2 deve disparar a solicitação de confirmação do usuário. Caso "sim", bloqueia o intervalo A2:I2, caso "não", não bloqueia. Isso permitirá corrigir algum valor antes de bloquear.

Em anexo tem o código que utilizo e que faz o bloqueio de qualquer célula preenchida automaticamente.

O intervalo de toda a planilha é cerca de 3000 linhas.

Obrigado.

 
Postado : 25/05/2016 8:23 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Eu já demonstrei com fazer algo bem similar, use nossa base de dados!!

https://cse.google.com.br/cse?cx=partne ... %20celulas

Att

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

 
Postado : 25/05/2016 1:06 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Luiz, você irá digitar linha por linha ou é só o intervalo "A2 até I2" que quer o bloqueio ?
Veja, nesta rotina atraves do evento change ao alterarmos uma celula a aba é desprotegida a celula desbloqueada e no final Protege a aba e define a celula como bloqueada novamente.
Então, se for para deixar esta verificação só no final, todas as celulas vão estar desprotegidas e poderão ser alteradas.
Uma sugestão, se são sempre os mesmos ranges criar um Formulário para digitarem e depois lançar, assim fariamos a verificação se todos os campos estão preenchidos e lançamos na aba.

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

 
Postado : 25/05/2016 1:40 pm
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Fernando,

Boa tarde.

Verifiquei alguns dos posts sugeridos. Os que visualizei em geral utilizam a validação e essa forma não atende. Ainda que se proteja toda a planilha e assim evitar a alteração da validação, isso acarretaria um trabalho imenso. A planilha será utilizada por 8 usuários. O código que está na planilha anexa é o mais proximo do que pretendo, os pontos negativos é que após a digitação de qualquer valor em qualquer célula, esta fica bloqueada. É possível desbloquear com a fórmula, mas isso também ocasiona um trabalho imenso.

Obrigado

MAURO, olá novamente.

Boa tarde,

Pensei no formulário, até tenho um modelo e a verificação não seria problema. A questão é que, ao digitar diretamente na célula, cria-se uma base de dados que deve ficar a disposição do usuário. Assim, ainda se teria que bloquear alterações posteriores a digitação.

A planilha após ser preenchida, terá cerca de 3000 linhas preenchidas. A digitação é por linha. A medida que o usuário tiver a necessidade de inserir os dados em cada coluna. Como está no exemplo, o bloqueio funciona porque é feito após a confirmação em cada célula, o único problema é a rigidez desse processo. Daí vem a outra situação que pode resolver essa rigidez.

Cada usuário tem, obrigatoriamente que preencher todas as células da linha, e esse preenchimento só é válido se todas as células forem preenchidas, daí a idéia de pedir uma confirmação de que todas as células foram preenchidas corretamente, bloqueando em seguida após essa confirmação.

 
Postado : 25/05/2016 2:00 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Luiz, eu entendi o que quer, mas como eu citei o problema é em relação a:

Após os preenchimento de todas essas células, os valores não devem ser alterados ou excluídos.

A cada digitação a aba é DESPROTEGIDA e lógicamente a célula desbloqueada,e se for dar opção de se corrigir qualquer valor na linha, estaremos desprotegendo a aba por completa e isto não impedirá que se alterem as linhas anteriores.
Estou pensando em algumas possibilidades sem o formulário, tipo, capturar e armazenar em uma variável a linha digitada e se resolverem digitar em uma linha diferente receber mensagem que esta linha não pode ser alterada, e antes armazenar o valor que estava e utilizar o undo para devolve-lo.
Assim que tiver alguma coisa montada posto novamente, mas a idéia seria esta, vai pensando em algo tambem.

[]s

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

 
Postado : 25/05/2016 10:03 pm
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Olá Mauro,

Entendi suas considerações. A questão do UNDO estaria acarretando uso constante da memória certo?, é viável ?. Nesse caso o undo é apenas para a linha anterior no momento da digitação. Ocorre que a planilha se comportará como um "diário" e o UNDO funcionaria apenas naquele momento da digitação. Já que estamos implementando uma correção, o certo seria fazer essa correção independente do momento e não apenas durante a digitação.

Uma possibilidade seria um FORM, eu sei que já descartei isso antes mas nesse caso o uso seria apenas para corrigir tanto a digitação atual quanto a digitação de dias anteriores. No arquivo anexo tem um modelo de form. A dúvida seria como acioná-lo e como o usuário irá determinar qual linha será corrigida. As idéias são várias, tipo uma das teclas de função do teclado na linha selecionada. É possível ?.

Situação: Corrigir algum valor da linha 3. Ação: Selecionar a célula A3 e teclar F9. Reação: Chamar o form com as informações da linha selecionada.

Durante a execução do form, o acesso a planilha não deveria ser possível.

Isso elimina a idéia inicial de solicitar a confirmação no final da digitação de cada linha.

Acho que é por aí.

Um outro detalhe é que, as informações da duas ultimas células (Principal e Contrapartida) vem de uma lista utilizada dentro de uma validação. O "%" é s ou n e os demais são valores.

 
Postado : 26/05/2016 6:53 am
(@osvaldomp)
Posts: 858
Prominent Member
 

Veja se ajuda.
1. proteja a planilha manualmente antes de iniciar e deixe desbloqueadas as células liberadas para receber dados
2. funcionamento - após preencher o intervalo 'An:In', em qualquer ordem, se for clicado "SIM" na caixa de mensagem o intervalo será bloqueado, se for clicado "NÃO" o intervalo será pintado para indicar que foi preenchido mas não foi bloqueado.

 Private Sub Worksheet_Change(ByVal Target As Range)
 If Application.CountA(Cells(Target.Row, 1).Resize(, 9)) = 9 Then
  ActiveSheet.Protect userinterfaceonly:=True
  If MsgBox("deseja bloquear a linha " & Target.Row & "?", vbYesNo + vbQuestion) = vbYes Then
   Cells(Target.Row, 1).Resize(, 9).Locked = True
   Cells(Target.Row, 1).Resize(, 9).Interior.ColorIndex = xlNone
  Else: Cells(Target.Row, 1).Resize(, 9).Interior.ColorIndex = 6
  End If
 End If
 End Sub

Osvaldo

 
Postado : 26/05/2016 7:57 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oswaldomp,

Boa noite.

Passei um bom tempo testando seu código e é muito bom. Apenas um detalhe me chamou a atenção. Na sequencia, eu selecionei o intervalo que deveria receber o bloqueio, A2:I10 e desmarquei o bloqueio. Em seguida eu fiz o bloqueio manual da planilha, inseri uma senha. Quando digito a primeira linha, antes de perguntar se bloqueia ou não, é solicitada a senha. Informando ou não dá um erro. Após interromper o código, volto e desbloqueio a planilha, volto a bloquear e finalmente funciona normalmente a partir daí.

Minha dúvida é se não seria necessário inserir a senha de bloqueio no próprio código.

 
Postado : 26/05/2016 7:42 pm
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oswaldomp,

Outro detalhe, veja se aocntece com você. Quando eu protejo a planilha, uso uma senha. Caso eu feche o arquivo e reabra, ocorre o descrito acima, ou seja, antes de perguntar se bloqueia, pede a senha.

Obrigado.

 
Postado : 26/05/2016 8:02 pm
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oswaldopm,

Mais uma observação. Após fechar e abrir a planilha, a senha inserida para proteger a planilha desaparece mesmo.

Peço que verifique estas informações. O código funciona bem, apenas estes detalhes precisam ser verifcados.

Muito obrigado.

Fico no aguardo.

 
Postado : 26/05/2016 8:12 pm
(@osvaldomp)
Posts: 858
Prominent Member
 

Desculpe, Luiz, passei batido em relação à senha :oops:

Veja se melhora com a alteração abaixo.

substitua esta linha

ActiveSheet.Protect UserInterfaceOnly:=True

por esta (altere a senha se quiser)

ActiveSheet.Protect "senha", UserInterfaceOnly:=True

Osvaldo

 
Postado : 27/05/2016 6:53 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oswaldomp,

A alteração funcionou! Obrigado.
Apenas uma dúvida. O arquivo que anexei é um modelo. No arquivo definitivo o preenchimento do intervalo é feito com validação com lista, isso pode interferir no funcionamento do código?. Inseri o código nesse arquivo e não funcionou...

Obrigado.

 
Postado : 27/05/2016 8:38 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oswaldomp

Desconsidere a ultima mensagem. A falha foi minha, pois uma das células não estava preenchida.

Obrigado.

 
Postado : 27/05/2016 8:47 am
(@osvaldomp)
Posts: 858
Prominent Member
 

No arquivo definitivo o preenchimento do intervalo é feito com validação com lista, isso pode interferir no funcionamento do código?
O código deveria funcionar igualmente em intervalo com VD.

Inseri o código nesse arquivo e não funcionou...
Sem ver o seu arquivo fica difícil sugerir algo. Disponibilize uma amostra dele e descreva com exatidão o que você quer dizer com "não funcionou".

Enquanto eu respondia você postou nova mensagem... ;)
Que bom que funcionou... :P

Osvaldo

 
Postado : 27/05/2016 8:55 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Parabéns!

O código ficou muito bom. Já dei por concluído, mas queria sua opinião ainda a respeito desse código. Feito o bloqueio, digamos que seja necessário uma alteração em alguma linha, então podemos desproteger a planilha e fazer a alteração. Nesse momento toda a planilha estaria descoberta. Eu estava tratando dessa possibilidade com o Mauro e minha sugestão seria um FORM que seria acionado pela combinação da linha selecionada e uma tecla, no caso, F9. O FORM solicitaria a senha e recuperaria as informações da linha para que o usuário fizesse a alteração. Depois de confirmada a atualização, a planilha seria protegida novamente.

O que acha ?

 
Postado : 27/05/2016 10:05 am
Página 1 / 2