Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
Avatar do usuário
Por albinosergio
Posts Avatar
#48175
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
Avatar do usuário
Por Jimmy
Avatar
#48176
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
Avatar do usuário
Por albinosergio
Posts Avatar
#48195
Segue abaixo o arquivo para melhor entendimento, preciso que pe4los menos 3 campos não possa ser registrado em duplicidade:
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#48322
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
Avatar do usuário
Por albinosergio
Posts Avatar
#48441
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
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord