Francimar,
Este exemplo fica mais fácil de entender. Imagune que eu criei uma lista em X1: X3, por exemplo, com 3 valores: 1, 2 e 3. Selecionei a coluna A inteira e em Validação de Dados escolhi Lista e selecionei a lista que eu criei em X1:X3.
Agora qualquer entrada diferente de 1, 2 ou 3 será impedida, a menos que o usuário escreva, por exemplo, 5 em alguma célula e Copie e Cole em qq célula da coluna A, Isto faz com que a VD não funcione, e, pior, apaga a VD anteriormente criada, né mesmo?
Para evitar issto, coloca-se o seguinte código no evento Worksheet_Change da planilha
Private Sub Worksheet_Change(ByVal Target As Range)
Dim VT1 As Long
'Verifica se a entrada foi na coluna A
If Not Intersect(Range("A:A"), Target) Is Nothing Then
'Verifica se a Entrada é válida
On Error Resume Next
VT1 = Range("A:A").Validation.Type
If Err.Number <> 0 Then
'Desfaz a operação
Application.Undo
'Alerta o usuário
MsgBox "Operação cancelada" & vbCrLf _
& "Violação de regras de validação de Dados", vbCritical
'Sai da Rotina
Exit Sub
End If
End If
End Sub
Esta rotina faz o seguinte:
1) cria uma variável VT1 de tipo Long porque os critérios de validação, internamente, são representados por números
- Os comentários na rotina esclarecem o que cada parte faz
Em resumo, se não houver erro não faz nada, e qdo identifica o erro, porque a variável VT1 perdeu a validação pelo copia e cola, desfaz a operação (recuperando a validação da célula afetada), dá uma mensagem de erro, e qdo o usuário clica ok no quadro de
mensagem sai da rotina.
Espero ter sido claro.
É fundamental primeiro limpar todos os erros da Coluna A anteriormente entrados.
Para isso, no meu exemplo, seleciono toda a coluna A e em Dados>Validação de Dados escolho Circular Dados Inválidos. E aí corrijo os dados errados. Vc deve fazer isso na área (range) que vc usou a VD.
abraços,
M.