Notifications
Clear all

Validação de célula

6 Posts
2 Usuários
0 Reactions
95 Visualizações
(@mnascimento1)
Posts: 3
Active Member
Topic starter
 

Olá pessoALL!

Estou criando uma tabela em Excel pra controlar o upgrade de SSD de equipamentos do meu cliente.

N tabela criei uma coluna chama S/N que fica na coluna D e na E fica o serial dos SSD.

Todos os equipamentos tem serial de 9 dígitos, alfanumérico... Já os SSD tem serial que começa com "1401-" seguido de 15 dígitos numéricos, totalizando 20 caracteres.

Criei uma VBA para validar estes dados, onde na coluna D ele de forma simples verifica se tem nove dígitos, caso tenha salva o número caso tenha menos da uma MSG de erro e caso tenha mais ele salva só os primeiros 9 digito, que são os que eu preciso.

Já na Coluna "E" fiz uma verificação de se o valor digita começa com 1401- e em seguida tem os 15 dígitos, se sim salva o numero e se não tiver o 1401- ou não tiver os 15 dígitos depois ele da msg de erro.

Em ambos os casos ele deleta os espaços em branco antes ou depois do valor digitado e caracteres especiais.

Porém na coluna D funcionou perfeitamente... já na coluna E dá a msg de erro em anexo e aceita salvar qualquer valor digitado.

Sou leigo no assunto, e criei o código com ajuda de exemplos do Google e dicas do Chat GPT, mas mesmo assim travei neste erro e não consegui resolver, abaixo coloco o código que criei, então se alguém puder me ajudar, pediria para ser lúdico ou mostrar as alterações que deveria fazer de forma mais pratica... por que se for técnico não vou entender... rsrsrsrs

Desde já obrigado pela atenção de todos.

 

 

Marcelo Nascimento


Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range
Dim valor As String

' Desativa eventos para evitar loops infinitos
Application.EnableEvents = False

' Verifica se a alteração ocorreu no intervalo D5:D500
If Not Intersect(Target, Me.Range("D5:D500")) Is Nothing Then
For Each cel In Target
If Not IsEmpty(cel.Value) Then
' Remove espaços extras no início e no fim
valor = Trim(cel.Value)

' Remove espaços internos extras
valor = Replace(valor, " ", "")

' Mantém apenas os primeiros 9 dígitos
If Len(valor) > 9 Then
valor = Left(valor, 9)
End If

' Verifica se o valor tem exatamente 9 caracteres numéricos
If Len(valor) <> 9 Or Not IsNumeric(valor) Then
MsgBox "Valor inválido!", vbExclamation
cel.ClearContents ' Limpa o conteúdo da célula
Else
' Atualiza a célula com o valor formatado
cel.Value = valor
End If
End If
Next cel
End If

' Verifica se a alteração ocorreu no intervalo E5:E500
If Not Intersect(Target, Me.Range("E5:E500")) Is Nothing Then
For Each cel In Target
If Not IsEmpty(cel.Value) Then
' Remove espaços extras no início e no fim
valor = Trim(cel.Value)

' Remove espaços internos extras
valor = Replace(valor, " ", "")

' Verifica se o valor tem exatamente 20 caracteres, começa com "1401-" e tem 15 caracteres numéricos após
If Len(valor) <> 20 Or Left(valor, 5) <> "1401-" Or Not IsNumeric(Mid(valor, 6, 15)) Then
MsgBox "Valor inválido! O valor deve começar com '1401-' e conter exatamente 15 caracteres numéricos após.", vbExclamation
cel.ClearContents ' Limpa o conteúdo da célula
End If
End If
Next cel
End If

' Reativa eventos
Application.EnableEvents = True
End Sub


 

 
Postado : 08/02/2025 8:54 pm
(@osvaldomp)
Posts: 874
Prominent Member
 

Postado por: @mnascimento1

Porém na coluna D funcionou perfeitamente... já na coluna E dá a msg de erro em anexo e aceita salvar qualquer valor digitado.

Olá, @mnascimento1

Embora o seu código possa ser melhorado, aparentemente o erro citado não tem relação com o código e sim com a Validação de Dados existente naquela coluna.

Se você não conseguir resolver, então disponibilize o seu arquivo Excel com a macro, imagens não servem.

dica - ao postar códigos utilize o ícone Código (<>) disponível na barra de ferramentas da caixa de resposta.

Osvaldo

 
Postado : 09/02/2025 6:57 am
(@mnascimento1)
Posts: 3
Active Member
Topic starter
 

Bom dia @osvaldomp !!!!

Não tenho duvidas que meu código possa ser melhorado... e muito... pq como disse... é minha primeira vez... rsrsrss

Então meu caro... fiquei ontem até tarde tentando entender este código, o erro e o por que na Coluna F ele não funciona. Não faz o TRIM não faz a verificação de formato de inicio do código... ou seja nada... 😖 
Vou te enviar o arquivo... e o código da maneira que vc falou... quem sabe vc consegue me ajudar

Att,

Marcelo.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cel As Range
    Dim valor As String
    
    ' Desativa eventos para evitar loops infinitos
    Application.EnableEvents = False
    
    ' Verifica se a alteração ocorreu no intervalo D5:D500
    If Not Intersect(Target, Me.Range("D5:D500")) Is Nothing Then
        For Each cel In Target
            If Not IsEmpty(cel.Value) Then
                ' Remove espaços extras no início e no fim
                valor = Trim(cel.Value)
                
                ' Remove espaços internos extras
                valor = Replace(valor, " ", "")
                
                ' Mantém apenas os primeiros 9 dígitos
                If Len(valor) > 9 Then
                    valor = Left(valor, 9)
                End If
                
                ' Verifica se o valor tem exatamente 9 caracteres numéricos
                If Len(valor) <> 9 Or Not IsNumeric(valor) Then
                    MsgBox "Valor inválido!", vbExclamation
                    cel.ClearContents ' Limpa o conteúdo da célula
                Else
                    ' Atualiza a célula com o valor formatado
                    cel.Value = valor
                End If
            End If
        Next cel
    End If

    ' Verifica se a alteração ocorreu no intervalo E5:E500
    If Not Intersect(Target, Me.Range("E5:E500")) Is Nothing Then
        For Each cel In Target
            If Not IsEmpty(cel.Value) Then
                ' Remove espaços extras no início e no fim
                valor = Trim(cel.Value)
                
                ' Remove espaços internos extras
                valor = Replace(valor, " ", "")
                
                ' Verifica se o valor tem exatamente 20 caracteres, começa com "1401-" e tem 15 caracteres numéricos após
                If Len(valor) <> 20 Or Left(valor, 5) <> "1401-" Or Not IsNumeric(Mid(valor, 6, 15)) Then
                    MsgBox "Valor inválido!", vbExclamation
                    cel.ClearContents ' Limpa o conteúdo da célula
                End If
            End If
        Next cel
    End If
    
    ' Reativa eventos
    Application.EnableEvents = True
End Sub
 
Postado : 09/02/2025 10:02 am
(@osvaldomp)
Posts: 874
Prominent Member
 

1. o erro ocorre porque ao inserir um conteúdo em qualquer célula que tenha Validação de Dados, a Validação é disparada antes da macro.

Para corrigir basta remover a Validação.

 

2. o conteúdo da célula não é corrigido pela macro porque falta inserir na célula o conteúdo da variável valor.

Para corrigir, acrescente a linha conforme abaixo.

If Len(valor) <> 20 Or Left(valor, 5) <> "1401-" Or Not IsNumeric(Mid(valor, 6, 15)) Then
MsgBox "Valor inválido!", vbExclamation
cel.ClearContents ' Limpa o conteúdo da célula
Else: cel.Value = valor 'acrescente esta linha
End If

Se você tiver interesse eu posso simplificar/melhorar o seu código.

Osvaldo

 
Postado : 09/02/2025 2:31 pm
(@mnascimento1)
Posts: 3
Active Member
Topic starter
 

@osvaldomp 

Entendi!

O que me causa estranheza e que a validação na célula D, apesar de ser simples, funciona... mas enfim... coisas que a gente vai aprendendo com o tempo.

Quanto a sua ajuda, como seria?
Você faria para mim? Teria algum custo??? Se sim, qual o valor?

Pergunto por que estou fazendo por conta própria e não tenho verba para isso, e a empresa  não irá me reembolsar.

 
Postado : 09/02/2025 3:51 pm
(@osvaldomp)
Posts: 874
Prominent Member
 

Postado por: @mnascimento1

Teria algum custo?

Em troca da ajuda recebida aqui, ajude alguém que esteja precisando.

 

Experimente o código abaixo no lugar do existente.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
On Error GoTo fim
Application.EnableEvents = False

If Not Intersect(Target, Range("D5:D500")) Is Nothing Then
Target.Value = Replace(Target.Value, " ", "")
If Len(Target.Value) <> 9 Or Not IsNumeric(Target.Value) Then
MsgBox "Valor inválido!", vbExclamation
Target.Value = ""
End If
ElseIf Not Intersect(Target, Range("E5:E500")) Is Nothing Then
Target.Value = Replace(Target.Value, " ", "")
If Len(Target.Value) <> 20 Or Left(Target.Value, 5) <> "1401-" Or Not IsNumeric(Mid(Target.Value, 6, 15)) Then
MsgBox "Valor inválido!", vbExclamation
Target.Value = ""
End If
End If

fim:
Application.EnableEvents = True
End Sub

dicas:

1. para acessar a ajuda do VBA coloque o cursor sobre o comando e aperte F1

2. para executar o código no modo Depurar, marque um ponto de interrupção, insira algum conteúdo no intervalo de interesse e a partir daí execute o código via tecla F8. Ajuste o tamanho e a posição da janela do VBA assim você poderá ver na planilha o efeito de cada comando executado.

Osvaldo

 
Postado : 09/02/2025 7:07 pm