Notifications
Clear all

VBA Celulas Mescladas

8 Posts
2 Usuários
0 Reactions
2,190 Visualizações
(@robri)
Posts: 5
Active Member
Topic starter
 

olá amigos,
se alguem puder me ajudar, fico grato!

estou com a VBA abaixo, na qual bloqueia a celula apos ser preenchida, acontece que minha planilha vai de A1 a Z115 e dentro da planilha tenho varias linhas mescladas e nessas linhas mescladas a VBA não funciona.
O que preciso fazer ?

Dim mRg As Range
Dim mStr As String

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Range("A1:Z115"), Target) Is Nothing Then
    Set mRg = Target.Item(1)
    mStr = mRg.Value
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRg As Range
    On Error Resume Next
    Set xRg = Intersect(Range("A1:Z115"), Target)
    If xRg Is Nothing Then Exit Sub
    Target.Worksheet.Unprotect Password:="123"
    If xRg.Value <> mStr Then xRg.Locked = True
    Target.Worksheet.Protect Password:="123" 
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("A1:Z115"), Target) Is Nothing Then
    Set mRg = Target.Item(1)
     mStr = mRg.Value
End If
End Sub
 
Postado : 20/11/2019 1:31 am
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

robri, poderia detalhar os passos que esta fazendo, ou até melhor, postar seu modelo com dados ficticios se for o caso, coloque em algum site de drive virtual tipo o SendSpace e poste o link aqui, ficará mais fácil e rápido obter o resultado.
Ressaltando, a principio as celulas mescladas são para estarem bloqueadas de acordo com a instrução, peço o modelo, por voce estar utilizando os Eventos da Aba, e só no Evento "Worksheet_Change" temos a proteção das celulas, ou seja, uma vez protegida, não será possivel utilizar os Eventos "BeforeDoubleClick e Worksheet_Change" sem antes desproteger.

[]s
Mauro Coutinho

 
Postado : 20/11/2019 7:24 am
(@robri)
Posts: 5
Active Member
Topic starter
 

Ola Coutinho,

vou tentar explicar melhor,

minha planilha é compartilhada com outros usuarios via Google Drive, as informações nela inseridas gostaria que fosse bloqueado assim que digitasse a sua respectiva célula, esta VBA foi perfeita pro meu caso, acontece que por excesso de capricho meu tenho varias células mescladas nesta planilha. Nas Células não Mescladas a VBA roda direitinho, após digitar quando muda de célula bloqueia no ato. Acontece que em células "que são muitas" onde a mesclagem a VBA não funciona, ou seja não bloqueia após digitar.
Obs. A planilha fica protegida, permitindo apenas inserir dados em celulas "desbloqueadas" . A VBA bloqueia as células "desbloqueadas" como eu realmente queria, só falta conseguir bloquear as células mescladas.

desde já agradeço a ajuda,

 
Postado : 20/11/2019 4:04 pm
(@robri)
Posts: 5
Active Member
Topic starter
 

Amigo Coutinho, boa noite

EXATAMENTE ISSO!!!

só tem um probleminha:

esta como eu queria, bloqueando até as células mescladas, só que ao clicar duas, ou uma sequencia de cliques na célula permite-se a alteração, inclusive em células previamente bloqueadas onde não era permitido alteração.

 
Postado : 21/11/2019 12:39 am
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

Robri, como citei anteriormente, trabalhar com 3 Eventos na mesma aba tem de ser bem amarrado, e como não conheço o seu modelo, os procedimentos, eu só me atentei ao Evento "Worksheet_Change" que é o que capta as alterações e bloqueia e protege a planilha.
Mas vai algumas considerações quanto a questão do que precisamos muitas vezes de um modelo e detalhes de todo o procedimento :

* O primeiro Evento a ser executado é o Worksheet_SelectionChange, onde você armazena na variável mStr o valor que se encontra na celula.
* Após isso, temos os outros 2 eventos, onde no Worksheet_BeforeDoubleClick tem as mesmas instruções, ou seja armazenado o valor da celula na variavel mStr.
* Por fim o evento Worksheet_Change, onde é armazenado na variável xRg o valor digitado e comparado com o que estava armazenado em mStr.

Seguindo essa sequencia temos na lógica que, pelas instruçõess na rotina, primeiro desprotegemos a planilha , depois é efetuado a comparação se o valor digitado é diferente ao armazenado na variavel mStr, e se for igual pulamos para o fim da rotina onde não protegemos a mesma.
Então fica algumas duvidas quanto aos procedimentos e utilização de seu arquivo, ou seja :
1) As celulas na planilha já tem algumas preenchidas ao abrir e já estão com proteção ?
2) Verificou se todas as celulas do range definido estão com a propriedade de Bloqueio definidas corretamente ?
3) Qual a sequencia dos procedimentos pelos usuários ? uma vez que diz que é feito o compartilhamento da mesma.

E por fim, e acredito que seja isso o que está ocorrendo, se a celula desbloqueada para digitação estiver VAZIA e dar o Duplo Clique e não fizer nenhuma alteração, na sequencia é passado para o evento "Worksheet_Change" onde irá acontecer o que citei acima, ou seja nada devido a comparação dos valores armazenados e digitados, ação essa que tem de ser tratada na instrução de comparação.

Espero ter conseguido me fazer entender, ou seja, precisamos de toda informação necessária para se construir uma resposta mais eficaz, e quando possivel, atraves do modelo, assim não ficamos por suposições, lembre-se sempre, em qualquer Forum as ajudas são voluntárias e geralmente analisadas em pouco espaço de tempo, algumas duvidas se consegue em analise somente da rotina, outras mais complexas demandam mais tempo tanto para a analise e entender o que a pessoa quer quanto tempo disponível para isso.
Procure verificar e analisar o que citei e qualquer duvida retorne.

[]s
Mauro Coutinho
Administrador

 
Postado : 21/11/2019 7:29 am
(@robri)
Posts: 5
Active Member
Topic starter
 

Boa noite,

mas uma vez obrigado Coutinho por dispor de seu tempo para ajudar um iniciante em VBA.

vamos lá.

anexo coloco uma pequena amostra da planilha,

1) as celulas tem sim algumas preenchidas e com proteção.
2) todas as celulas do range com as devidas propriedades de bloqueio.
3) os usuarios digitam informações de contas a pagar e outras coisas, conforme modelo.

o que esta acontecendo é que celulas vazias são permitidos inserir informações a qualquer hora, mesmo salvando a planilha e reabrindo (conforme eu queria) mas ao dar duplo click em qualquer célula bloqueada acaba permitindo a edição.

https://www.sendspace.com/file/kgqrtm

 
Postado : 21/11/2019 9:17 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

robri, é justamente o que eu citei, quando se da o Duplo Clique e a celula é vazia e não se digita nada, na rotina a instrução de desproteger está antes da verificação do conteudo da celula então ela é desprotegida e apos é feita a verificação do que foi digitado, e se não foi digitado nada é pulado para o fim da rotina sem proteger novamente, então temos de fazer o tratamento para verificar se a celula em questão é VAZIA(IsEmpty) e ajustarmos a demais instruções.
Com o modelo que enviou, se é igual ao original, eu não entendi porque em sua rotina está definindo o Range de ação "A1:Z115" se a digitação começa na linha 5 e vai até a coluna "S", então ajustei o Range na rotina que coloquei nesse exemplo, mas se for diferente é só alterar.
Veja como ficou, faça os testes e qualquer duvida retorne.

https://www.sendspace.com/file/20xo79

[]s
Mauro Coutinho
Administrador

 
Postado : 21/11/2019 10:42 pm
(@robri)
Posts: 5
Active Member
Topic starter
 

boa noite Coutinho,

deu certo, era isso mesmo que precisava, meu range estava de A1:Z115 porque o modelo que te mandei é apenas um esboço a planilha completa tem este range.

mais uma vez agradeço,

forte abraço,

 
Postado : 22/11/2019 10:35 pm