Ir ao conteúdo
  • Cadastre-se

Código Vba Excel - Células Relacionadas


Ir à solução Resolvido por Wendell Menezes,

Posts recomendados

Olá, pessoal. Boa noite.

 

Estou criando uma planilha no Excel e me deparei com um problema que, por não conhecer os fundamentos de programação Vba, não consegui dar sequencia na criação da mesma e dessa forma, estou pedindo uma ajuda nesse sentido.

 

A situação é a seguinte: tenho quatro colunas A, B, C, D de certa forma relacionadas entre si, as quais estão dispostas abaixo:

 

        A             B              C             D

1  LIGUE   RELIGUE   LACRE   CORTE

2   Ativo

3   Ativo

4   Ativo

5   Ativo

 

Na coluna A, todas as células iniciam preenchidas com a palavra "Ativo" e as colunas B, C e D estão vazias.

 

Em uma determinada situação, caso precise efetuar um LACRE (Coluna C), deverei digitar na célula C2 a expressão "Executado". Fazendo isto, C2 = "Executado" e,  A2 = "", B2 = "" e D2 = "". O preenchimento da célula C2 deve deletar o conteúdo da célula A2 (ficar em branco).

 

Em outra situação, caso precise efetuar um CORTE (Coluna D), deverei digitar na célula D2 a expressão "Executado". Feito isto, D2 = "Executado" e, A2 = "", B2 = "" e C2 = "". O preenchimento da célula D2 deve deletar o conteúdo da célula A2 (ficar em branco).

 

Por outro lado, caso seja necessário efetuar um RELIGUE (Coluna D ), deverei digitar na célula B2 a expressão "Executado". Feito isto, B2 = "Executado"; A2 = "Ativo", C2 = "" e D2 = "". O preenchimento da célula B2 deve deletar o conteúdo das células C2 ou D2, caso existam valores em alguma e reatribui o valor "Ativo" para a célula A2.

 

Desde já, agradeço ao Fórum e a todos aqueles que me ajudem a resolver este problema.

 

Grato,

Link para o comentário
Compartilhar em outros sites

Olá,

 

Clique com o botão direito do mouse sobre o nome da sua aba (Como se fosse renomeá-la) e depois clique em Exibir Código.

 

Cole isso no editor de texto e feche e janela, em seguida teste se funciona como deseja.

Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Row > 1 And UCase(Target.Value) = "EXECUTADO" Then        Application.EnableEvents = False            Select Case Target.Column                Case 2                    Target.Offset(0, -1) = "Ativo"                    Range(Target.Offset(0, 1), Target.Offset(0, 2)).ClearContents                Case 3, 4                    Cells(Target.Row, 1).ClearContents            End Select        Application.EnableEvents = True    End IfEnd Sub
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá, Wendell

 

bom dia.

 

Obrigado pela ajuda com o código enviado. Está quase funcional, porém em duas situações acaba ocorrendo um erro.

 

Condições:

 

1  Se A = Ativo, então B = "". C="" e D="" ----- Está funcionando.

 

2  Se C = Executado, então A="", B="" e D="" ---- Está funcionando.

                                ou

3  Se D =Executado, então A= "", B="" e C =""---- Está funcionando.

 

4  Se B = Executado, então A=Ativo, B="", C="" e D="" ---- Está funcionando.

 

Entretanto, em 4 ocorre um problema. B = Executado, quando deveria ficar vazio.

Isto porque, se formos atribuir valor a C ou D (Condição 2 ou 3) novamente na mesma linha, o sistema

reporta erro, ou seja, C ou D (dependendo da escolha) = Executado, e B=Executado (resultado da condição 4) não fica vazio, o que tem gerado um erro.

 

A simulação abaixo está sendo feita como se fosse em uma mesma linha.

 

Ligue       Religue       Corte          Lacre

 

Ativo                                                                  Situação inicial

 

                                Executado                         Cliente está inadimplente e cortamos o serviço, ficando A="", B="". C=Executado e D=""

Ativo                                                                  Cliente apresente pagamento e restauramos o serviço B=Executado, ficando A=Ativo, B="", C="" e D=""

 

                                                Executado         Cliente solicita cancelamento do serviço e lacramos o ponto, ficando A="", B="", C="" e D="Executado" 

 

Neste quadro, se eu tentar religar o cliente, fazendo B=Executado, então A=Ativo, B=Executado (deveria ficar Vazio quando A ficasse Ativo), C ="" e D="".

Se após, eu efetuar um Corte (C=Executado) ou um Lacre (D=Executado), o código exibe uma mensagem de erro.

 

Grosseiramente falando:

 

A=Ativo => B="", C="", D=""

C=Executado => A="", B="" e D=""

D=Executado => A="", B="" e C=""

B=Executado => A=Ativo, B="", C="" e D="" ---> Só colocaremos valor em B (Executado), quando C ou D estiverem como Executado, o que fará com que A = Ativo. Ou seja,

                                                                              B é um defensor de A, já que C e D são os vilões (rsrsrsrs).

 

 

Esta é a situação.

 

Grato pela ajuda.

 

Luiz Alberto

 

 

Obs. Tentei colocar parte da planilha em Anexo, mas recebo msg de erro aqui no fórum.

 

Grato,

 

Luiz Alberto

Link para o comentário
Compartilhar em outros sites

Wendell, boa tarde.

Tudo bem contigo?

Isso mesmo. Vou tentar me explicar melhor.

As condições abaixo, como teste, refere-se apenas a linha 2 nas colunas em questao.

1) Condicao inicial: o cliente esta ativo, então, as celulas ficarao com A=Ativo, B=vazia, C=vazia e D=vazia

2) Caso o cliente seja inadimplente, então digitarei em C2=Executado. As celulas A2=vazio, B2=vazio, C2=Executado e D2=vazio.

Ou

3) O cliente não deseja mais o servico, então eu Lacro o servico. As celulas A2=vazio, B2=vazio, C2=vazio; e D2=Executado.

Observe que ou eu Corto ou Lacro.

4) Nesta opção o cliente me pede para religar o servico (coluna B ). então, eu faco B2=Executado e, apos digitar em B2, A2=Ativo (Estava vazia em funcao da opcao 2 ou 3), B2=vazio, C2=vazio e D2=vazio

Como voce pode perceber, tudo pode acontecer em uma mesma linha nestas 4 colunas. O cliente esta ativo; podemos cortar; podemos lacrar; e podemos religar o servico.

Esta situacao é dinamica e pode acontecer para todos os clientes nas 286 linhas da estrutura.


Grato,

Luiz Alberto
 

Link para o comentário
Compartilhar em outros sites

Assim?

Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Row > 1 And UCase(Target.Value) = "EXECUTADO" Then        Application.EnableEvents = False            Select Case Target.Column                Case 2                    Target.Offset(0, -1) = "Ativo"                    Range(Target, Target.Offset(0, 2)).ClearContents                Case 3                    Range(Target.Offset(0, -2), Target.Offset(0, -1)).ClearContents                    Target.Offset(0, 1).ClearContents                Case 4                    Range(Target.Offset(0, -3), Target.Offset(0, -1)).ClearContents            End Select        Application.EnableEvents = True        Target.Copy    End IfEnd Sub
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Feche todas as planilhas, abra de novo e experimente esse;

Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Count = 1 Then        If Target.Row > 1 And UCase(Target.Value) = "EXECUTADO" Then            Application.EnableEvents = False                Select Case Target.Column                    Case 2                        Target.Offset(0, -1) = "Ativo"                        Range(Target, Target.Offset(0, 2)).ClearContents                    Case 3                        Range(Target.Offset(0, -2), Target.Offset(0, -1)).ClearContents                        Target.Offset(0, 1).ClearContents                    Case 4                        Range(Target.Offset(0, -3), Target.Offset(0, -1)).ClearContents                End Select            Application.EnableEvents = True            Target.Copy        End If    End IfEnd Sub
Link para o comentário
Compartilhar em outros sites

Wendel,

 

beleza. Vou testar agora.

 

 

Apenas para tirar uma dúvida: Na planilha final, LIGUE, RELIGUE, CORTE e LACRE estão, respectivamente nas colunas E, F, G e H. O código que você me passou e que eu estava testando, encontravam-se nas colunas A, B, C e D.

 

Há algo que possa ser modificado no código para que as novas colunas sejam identificadas?

 

Sds,

 

Luiz

Link para o comentário
Compartilhar em outros sites

  • Solução

Para funcionar nessas colunas utilize esse:

Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Count = 1 Then        If Target.Row > 1 And UCase(Target.Value) = "EXECUTADO" Then            Application.EnableEvents = False                Select Case Target.Column                    Case 6                        Target.Offset(0, -1) = "Ativo"                        Range(Target, Target.Offset(0, 2)).ClearContents                    Case 7                        Range(Target.Offset(0, -2), Target.Offset(0, -1)).ClearContents                        Target.Offset(0, 1).ClearContents                    Case 8                        Range(Target.Offset(0, -3), Target.Offset(0, -1)).ClearContents                End Select            Application.EnableEvents = True            Target.Copy        End If    End IfEnd Sub
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Wendell,

 

Executei o novo código e, sem dúvida, está perfeito.

 

Apenas fiquei na dúvida quanto ao reposicionamento das colunas da planilha final em relação a esta de teste com apenas 4 colunas que estava usando.

 

Parabéns pelo código!!!!

 

:D

 

Luiz

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...