Página 1 de 1

Impedir duplicidade de cadastro

Enviado: 14 Set 2019 às 15:40
por albinosergio
Boa tarde senhores,
Estou desenvolvendo um cadastro de relatórios com VBA (sou leigo nesse assunto) e até agora está indo muito bem, mas preciso de um comando que impeça o registro quando houver duplicidade, criei o comando abaixo e até aparece a informação: "ATENÇÃO!! Este registro já existe na base de Dados"
Linha = 2
Do Until Sheets(6).Cells(Linha, 1) = ""
If Sheets(6).Cells(Linha, 2) = Sheets(5).Range("U10") And Sheets(6).Cells(Linha, 4) = Sheets(5).Range("AX10") Then
MsgBox "Este registro já existe na Base de Dados.", vbExclamation, "ATENÇÃO!"
Exit Sub
End If
Loop

Peço, por favor se possível, de me ajudarem em acertar o que está faltando para que a informação repetida seja bloqueada na BD, OK?
Meus agradecimentos pelas suas costumeira ajudas

Impedir duplicidade de cadastro

Enviado: 14 Set 2019 às 16:48
por Jimmy
Olá,

Pra ficar mais fácil pra gente analisar e dar a resposta, sempre é desejável que a planilha seja postada. No seu caso, não estamos vendo as demais rotinas, e fica difícil dizer o melhor local pra impedir o cadastramento.

Jimmy Sa Juan

Re: Impedir duplicidade de cadastro

Enviado: 15 Set 2019 às 16:23
por albinosergio
Segue abaixo o arquivo para melhor entendimento, preciso que pe4los menos 3 campos não possa ser registrado em duplicidade:

Re: Impedir duplicidade de cadastro

Enviado: 18 Set 2019 às 10:36
por Jimmy
Olá Albino,

Desculpe a demora em responder.

Alterei a rotina que grava, como abaixo
Código: Selecionar todos
Sub gravar()
    Dim Linha As Double
    Dim busca As Double
   
    busca = Sheets(2).Range("Bl5")
    Locais1 = Split(" T10 AB10 AK10 T12 AO12 AT12 BE12 T14 V21 V22 V23 " & _
                    "AB14 AK14 AT14 R16 AD17 AL17 V19 V20 V24 V25 V26 V27") 'Define locais das informações
    
    On Error Resume Next
'Procura no cadastro
    Linha = Application.WorksheetFunction.Match(busca, Sheets(3).Range("a:a"), 0)
    Set Erro = Err
    On Error GoTo 0

    If Erro.Number = 1004 Then                                          'Adicionar um novo cadastro
        Linha = Sheets(3).Cells(Rows.Count, 1).End(xlUp).Row + 1        'Descobrir a nova linha
        Sheets(3).Range("A" & Linha) = Sheets(2).Range("BL5")           'Inserir o código no banco de dados
        For Idx = 2 To 24           'GRAVAR os dsdos do registro no banco de dados: AL22 AS22 AD24 AH24 AP24
            Sheets(3).Cells(Linha, Idx) = Sheets(2).Range(Locais1(Idx - 1))
        Next
    
        MsgBox "Cadastro gravado com sucesso. clique em ATUALIZAR", vbInformation, "Concluido"
        Sheets(2).Range("limparGrav") = ""                              'Limpa campos
    Else

        If Range("BL5") = "" Or Range("AB10") = "" Or Range("AK10") = "" Or Range("R16") = "" Then 'Verificar se todos campos estão preenchidos:
            MsgBox "Preencha os campos obrigatórios com (*) e verifique se o(a) cliente foi contatado(a).", vbExclamation, "Atenção Lindinha!!"
        Else
            Sheets(3).Range("A" & Linha) = Sheets(2).Range("BL5")       'Inserir o código no banco de dados
            For Idx = 2 To 24                                           'ALTERAR os dados do registro no banco de dados
                Sheets(3).Cells(Linha, Idx) = Sheets(2).Range(Locais1(Idx - 1))
            Next
            MsgBox "Cadastro Alterado com sucesso. clique em ATUALIZAR", vbInformation, "Concluido" 'Emite mensagem
            Sheets(2).Range("limparGrav") = ""
        End If
    End If
'Limpar o valor da célula (T10)
End Sub


Funcionalmente está igual, mas, na minha visão, está mais compacta e mais simples. Modifiquei a análise da variável ERR, porque desviar para o início da SUB sempre que houver um erro é perigoso, pois há chance de provocar um loop.

Você usa a mesma rotina para gravar um registro novo, e para alterar um existente, logo, se bloquearmos a gravação de registros duplicados, estaremos matando a funcionalidade de alterar registros, porque isso é o mesmo que gravar sobre um registro existente. O que podemos fazer (apenas uma ideia no meio de muitas outras soluções) é emitir uma mensagem do tipo "VOCÊ ESTÁ ALTERANDO UM REGISTRO JÁ EXISTENTE. DESEJA CONTINUAR?" para evitar uma inclusão em cima de um existente. Outra alternativa é ligar um flag após cada busca (com o número buscado), e esse flag permitiria a atualização somente desse número. Assim, ao tentar gravar um número repetido, e que não tenha sido buscado, a macro não permitiria e emitiria uma mensagem.

O botão de atualização aciona a macro "copiarColuna", mas não entendi a finalidade.

Aguardo teus comentários para prosseguirmos.

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan

Re: Impedir duplicidade de cadastro

Enviado: 20 Set 2019 às 18:01
por albinosergio
Boa tardde jimmy,
Desculpe a demora em verificar, é que estou com alguns problemas relacionados a saude.
Mas gostei demais da simplicidade do comando "GRAVAR" bem mais prático, só que infelizmente deu um erro, eu copiei e colei o comando substituindo todo o comando Sub Gravar do meu arquivo e fiz o teste, apareceu a msg:
"Erro de compilação:
Variável não definida"

Tem como você aplicar direto no arquivo que enviei,
Obrigado pela ajuda