Página 1 de 2

Impedindo Duplicidade ao Alterar Dados

Enviado: 19 Out 2018 às 22:38
por Zema
Boa noite galera,
Gostaria da ajuda pra seguinte situação:
Tenho uma Agenda em Excel VBA onde que inseri um código para que ao alterar um cadastro não permita duplicidade de registro. Só que quando tento alterar o telefone ou endereço etc de um cliente já cadastrado, ela me dá o aviso de que já existe aquele cadastro e não permite salvar pq já existe aquele cliente no BDados. Existe um código que percorra todos os campos do formulário de cadastro da minha Agenda e verifique todos os dados cadastrados do cliente assim que eu clicar no botão ALTERAR e faça aceitar a Alteração no cadastro, pois aí o sistema ao verificar campo a campo da Agenda verá que o telefone ou o endereço ou outro ítem foi modificado e assim permitirá eu salvar a alteração.

Obrigado
Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 00:17
por fcarlosc2018
Boa-noite Zema

Não sei como está seu projeto, mais segue exemplo:
Código: Selecionar todos
Private Sub TextBox1_AfterUpdate()

'código sai da macro caso seja atualizado o campo vazio
If Me.TextBox1 = "" Then
Exit Sub
End If
   
Dim Linha As Integer
Dim codigo As String

codigo = TextBox1.text

On Error GoTo nao_encontrado

'Localiza um registro
Linha = Sheets("Plan1").Range("A:A").Find(codigo).Row
                    
  TextBox2 = Sheets("Plan1").Cells(Linha, 2)
  TextBox3 = Sheets("Plan1").Cells(Linha, 3)
  TextBox4 = Sheets("Plan1").Cells(Linha, 4)
  TextBox5 = Sheets("Plan1").Cells(Linha, 5)
   
Exit Sub
 
nao_encontrado:

    'Limpar Controles
    TextBox1.text = ""
    TextBox2.text = ""
    TextBox3.text = ""
    TextBox4.text = ""
    TextBox5.text = ""
          
End Sub

Private Sub btnAtualizar_Click()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Plan1") 

Dim ultimalinha As Object
Dim codigo As Integer
Set ultimalinha = Plan1.Range("A6000").End(xlUp)

Linha = 2
codigo = TextBox1

ws.Select

Linha = ws.Range("A:A").Find(codigo).Row

With ws
           
     .Cells(Linha, 1) = TextBox1.text
     .Cells(Linha, 2) = TextBox2.text	
     .Cells(Linha, 3) = TextBox3.text
     .Cells(Linha, 4) = TextBox4.text
     .Cells(Linha, 5) = TextBox5.text
          
End With
     
    MsgBox ("Dados Atualizados Com Sucesso !"), vbInformation, "Atenção!"

    'Limpar Controles
    TextBox1.text = ""
    TextBox2.text = ""
    TextBox3.text = ""
    TextBox4.text = ""
    TextBox5.text = ""
    
End Sub

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 09:40
por Zema
Aí fcarlos, Bom dia,

Eu já agradeço a sua colaboração, mas como estou ainda sem muita experiência não consegui êxito. Seria possível vc dar uma analisada no meu código do botão SALVAR e me ajudar mais um pouco, por favor?
O botão SALVAR está perfeito em NOVO e EXCLUIR e legal tb no ALTERAR, mas como eu disse, o problema é que não deixa Salvar as alterações. Abaixo deixo o código que estou usando no botão SALVAR. Obrigado

Private Sub btnSalvar_Click()
txtDirecao_Chefia = TextConverte(txtDirecao_Chefia.Text)
txtSecretario_Supervisor = TextConverte(txtSecretario_Supervisor.Text)
txtEndereco = TextConverte(txtEndereco.Text)
txtCidade = TextConverte(txtCidade.Text)

Dim proximoId As Long


'Altera

If optAlterar.Value Then
Dim Result As VbMsgBoxResult
Result = MsgBox("Deseja salvar a alteração no registro nº " & txtCodigo.Text & " ?", vbYesNo, "Confirmação")

If Result = vbYes Then
End If

'Para verificar também na hora de SALVAR a Alteração se o nome já está cadastrado (Duplicidade)
Dim b As Range
Plan2.Select
Plan2.Range("B2").Select
With Worksheets("Secretaria_Educacao").Range("B:B")
Set b = .Find(txtNome.Value, LookIn:=xlValues, LookAt:=xlWhole)
End With
If Not b Is Nothing Then

MsgBox "Alteração não será completada pois já existe um cadastro com esse nome", vbInformation, "Agenda"

Else
Call SalvaRegistro(CLng(txtCodigo.Text), indiceRegistro)
'lblMensagem.Caption = "Registro salvo com sucesso"
MsgBox "Registro alterado com sucesso", vbInformation, "Confirmação"

'incluí essa linha de código


End If

End If

'Novo
If optNovo.Value Then
If txtSalaNum = Empty Or txtNome = Empty Or txtTel = Empty Or txtTel1 = Empty Or txtTel2 = Empty Or txtTel3 = Empty Or txtCel = Empty Or txtCel1 = Empty _
Or txtWhatsApp = Empty Or txtEmail = Empty Or txtEmail1 = Empty Or txtDirecao_Chefia = Empty Or txtSecretario_Supervisor = Empty Or txtEndereco = Empty Or txtCidade = Empty Or txtUF = Empty Or txtCEP = Empty Then

Result = MsgBox("Salvar o registro mesmo sem o preenchimento de todos os campos?", vbYesNo, "Confirmação")

If Result = vbNo Then

Call DesabilitaControles
Call CarregaDadosInicial
Call HabilitaBotoesAlteracao

Exit Sub

Else
If Result = vbYes Or txtSalaNum <> txtNome <> Empty And txtTel <> Empty And txtTel1 <> Empty And txtTel2 <> Empty And txtTel3 <> Empty And txtCel <> Empty And txtCel1 <> Empty _
And txtWhatsApp <> Empty And txtEmail <> Empty And txtEmail1 <> Empty And txtDirecao_Chefia <> Empty And txtSecretario_Supervisor <> Empty And txtEndereco <> Empty And txtCidade <> Empty And txtUF <> Empty And txtCEP <> Empty Then

End If

End If

End If

proximoId = PegaProximoId
'pega a próxima linha
Dim proximoIndice As Long
proximoIndice = wsCadastro.UsedRange.Rows.Count + 1
Call SalvaRegistro(proximoId, proximoIndice)
txtCodigo = proximoId
'lblMensagem.Caption = "Registro salvo com sucesso"
MsgBox "Registro incluido com sucesso", vbInformation, "Confirmação"

End If


'Excluir
If optExcluir.Value Then
'Dim result As VbMsgBoxResult
Result = MsgBox("Deseja excluir o registro nº " & txtCodigo.Text & " ?", vbYesNo, "Confirmação")

If Result = vbYes Then
wsCadastro.Range(wsCadastro.Cells(indiceRegistro, colCodigo), wsCadastro.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

'lblMensagem.Caption = "Registro excluído com sucesso"
MsgBox "Registro excluído com sucesso", vbInformation, "Confirmação"

Call CarregaDadosInicial

End If

End If

Call HabilitaBotoesAlteracao
Call DesabilitaControles

Exit Sub

End Sub

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 14:33
por fcarlosc2018
Boa-tarde Zema

Aqui no início do código para "Alterar" está perguntado se deseja salvar as alterações...se o resposta for "sim" termine o código.
ou seja:
Código: Selecionar todos

'Altera

If optAlterar.Value Then -> aqui pergunta se o botão de opções estiver "marcado"
Dim Result As VbMsgBoxResult
Result = MsgBox("Deseja salvar a alteração no registro nº " & txtCodigo.Text & " ?", vbYesNo, "Confirmação") -> aqui é para confirmar se sim ou não...!

If Result = vbYes Then -> aqui é a resposta...se for sim (if) então (then)
End If -> fim do código (End If)

deixe esse "End If" como comentário para ver o que acontece

'End If


Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 14:58
por Zema
Boa tarde, r fcarlos

Não mudou nada eu comentando aquele End If e colocando um outro End if no final do codigo

Temos alguma outra opção?

Obrigado

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 16:06
por fcarlosc2018
Tem como postar o arquivo vazio...!?

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 16:33
por Zema
Ok fcarlos

Aí vai o arquivo completo

Obrigado

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 17:22
por fcarlosc2018
Também tenho essa Agenda, você alterou boa parte do código, vou dar um olhada e retorno.

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 17:48
por Zema
Olá, realmente eu a mudei foi muita coisa, vi que a base dela era muito boa, mas faltava ainda muitas coisas para serem melhoradas como vc que conhece a original já viu aí.

Aguardo

Obrigado

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 19:56
por fcarlosc2018
Então, tira aquele "End If" que eu mencionei e antes do 'Novo...If optNovo.value Then...vc coloca mais um "End If"
Testa aí...!

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 21:23
por Zema
Boa noite,

Não alterou nada na retirada de um End If e entrada de outro no local indicado.
Vc conseguiu abrir a Agenda que te enviei?

Obrigado

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 21:59
por fcarlosc2018
Sim...após entrar com o "LOGIN" libera os botões e clico em "Alterar" abre outra tela para escolher, duplo clique e os dados vão para o formulário, faço alguma alteração e "Salvar"...vai de boa !
Um detalhe é quando clico em "Novo" abre um "inputbox" digito um nome para busca, só que existem alguns nomes com espaços "extras" logo tem que digitar conforme está na célula.
Ex.: IRINE GUIMAS ..... estava com um espaço a mais no final e não encontrava o nome, se não for digitado conforme estiver na célula, para o programa é um novo cadastro.

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 22:47
por fcarlosc2018
Segue arquivo alterado...testa ai !

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 22:52
por Zema
Mas vc fez alguma alteração no código?
Porque o que acontece é que mudei o conteúdo dos meus cadastros para te enviar, uma vez que todos os dados que tenho no meu cadastro são reais e na correria pra te enviar o arquivo deve ter causado esses problemas. No meu cadastro são 103 nomes.

Você está conseguindo cadastrar alterando outros dados fora o nome? Vc quer dizer que da forma que vc fez aí está funcionando o que te solicitei ajuda?
Se for envia a Agenda com as modificações que vc fez, por favor. Ou não é isso que vc quis dizer?

Obrigado

Zema

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 20 Out 2018 às 23:08
por Zema
Não funcionou não, deu a mesma mensagem que já existe um cadastro daquele nome.
Na realidade eu precisava de uma busca em todos os campos do banco de dados quando eu der o click no botão SALVAR e comparasse os campos do formulário com os campos correspondentes na planilha (BD) então o código identificaria que um determinado campo foi alterado, porque como está o código de alteração ele só compara o campo NOME, é específica a busca no BD na coluna B da linha 1 até a última ("B:B") ou seja se você alterar o CEP, Endereço, Tel, Cel ou qualquer outro campo menos o Nome o código só está comparando a coluna do Nome ou seja coluna B, se o código não compara os demis campos não adianta que ele não identificará que foi feita alguma alteração. Esse código é que não consigo montar.

Obrigado

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 21 Out 2018 às 00:19
por fcarlosc2018
Então, quando altera o nome se clicar em salvar ele aceita, porque o código vai fazer uma busca e não vai achar o nome "alterado"
Ex.: "Zema" ..... se você alterar para "Zema A" será alterado, porque o nome "Zema A" não existe !
Agora se você não alterar o nome e tentar alterar outros campos, o código vai entender que o nome não foi alterado aí cai na rotina:
MsgBox "Alteração não será completada pois já existe um cadastro com esse nome", vbInformation, "Agenda"

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 21 Out 2018 às 00:40
por Zema
Isso aí tá perfeito, funciona redondo.
Agora eu tenho o cadastro do Zema com o telefone 31 4356-3773 eu quero mudar o telefone para 32 4356-4737, conforme esse código só consulta o Nome para ver se já existe cadastrado ele vai ver que o Nome continua inalterado e vai dar a mensagem de que o cadastro já existe por isso não posso alterar e aí?
Como vou alterar o meu telefone? Nunca.
Eu quero uma rotina em que eu possa alterar qualquer campo diferente de nome e ele aceite, porque eu posso me mudar e ter que Alterar só o endereço e aí o código vai verificar meu nome e verá que o Nome não mudou, como ele não verifica os demais campos, não vai salvar meu novo endereço impedindo a atualização do cadastro. É aí que mora o problema.

Obrigado

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 21 Out 2018 às 06:53
por Reinaldo
Cross Post https://www.tomasvasquez.com.br/forum/v ... =20&t=6602
Não tem necessidade de verificar a existência do registro quando de alteração, SEMPRE terá esse registro cadastrado,
Uma verificação deve ser aplicada somente em registro NOVO.
Experimente:
Código: Selecionar todos
Private Sub btnSalvar_Click()
Dim proximoId As Long
Dim b As Range

txtDirecao_Chefia = TextConverte(txtDirecao_Chefia.Text)
txtSecretario_Supervisor = TextConverte(txtSecretario_Supervisor.Text)
txtEndereco = TextConverte(txtEndereco.Text)
txtCidade = TextConverte(txtCidade.Text)

'Altera

If optAlterar.Value Then
    Dim Result As VbMsgBoxResult
    Result = MsgBox("Deseja salvar a alteração no registro nº " & txtCodigo.Text & " ?", vbYesNo, "Confirmação")
    Result = vbYes
    
    Call SalvaRegistro(CLng(txtCodigo.Text), indiceRegistro)
End If
'Novo
If optNovo.Value Then

'Para verificar também na hora de SALVAR a Alteração se o nome já está cadastrado (Duplicidade)
Plan2.Select
Plan2.Range("B2").Select
With Worksheets("Secretaria_Educacao").Range("B:B")
'Set c = .Find(txtNome.Value, LookIn:=xlValues, LookAt:=xlWhole)
'Set c = Plan2.range("C:C").Find(Me.txtNome, LookIn:=xlValues, LookAt:=xlWhole)
Set b = .Find(txtNome.Value, LookIn:=xlValues, LookAt:=xlWhole)
End With
    If Not b Is Nothing Then
        MsgBox "Alteração não será completada pois já existe um cadastro com esse nome", vbInformation, "Agenda"
        Exit Sub
    Else
    '    Call SalvaRegistro(CLng(txtCodigo.Text), indiceRegistro)
       'lblMensagem.Caption = "Registro salvo com sucesso"
    '    MsgBox "Registro alterado com sucesso", vbInformation, "Confirmação"
        If txtSalaNum = Empty Or txtNome = Empty Or txtTel = Empty Or txtTel1 = Empty Or txtTel2 = Empty _
                              Or txtTel3 = Empty Or txtCel = Empty Or txtCel1 = Empty _
                              Or txtWhatsApp = Empty Or txtEmail = Empty Or txtEmail1 = Empty _
                              Or txtDirecao_Chefia = Empty Or txtSecretario_Supervisor = Empty _
                              Or txtEndereco = Empty Or txtCidade = Empty Or txtUF = Empty Or txtCEP = Empty Then
            
            Result = MsgBox("Salvar o registro mesmo sem o preenchimento de todos os campos?", vbYesNo, "Confirmação")
    
            If Result = vbNo Then
                Call DesabilitaControles
                Call CarregaDadosInicial
                Call HabilitaBotoesAlteracao
                Exit Sub
            ElseIf Result = vbYes Or txtSalaNum <> txtNome <> Empty And txtTel <> Empty And txtTel1 <> Empty _
                            And txtTel2 <> Empty And txtTel3 <> Empty And txtCel <> Empty And txtCel1 <> Empty _
                            And txtWhatsApp <> Empty And txtEmail <> Empty And txtEmail1 <> Empty And txtDirecao_Chefia <> Empty _
                            And txtSecretario_Supervisor <> Empty And txtEndereco <> Empty And txtCidade <> Empty _
                            And txtUF <> Empty And txtCEP <> Empty Then
            End If
        End If
    End If

    proximoId = PegaProximoId
    'pega a próxima linha
    Dim proximoIndice As Long
    proximoIndice = wsCadastro.UsedRange.Rows.Count + 1
    Call SalvaRegistro(proximoId, proximoIndice)
    txtCodigo = proximoId
    'lblMensagem.Caption = "Registro salvo com sucesso"
    MsgBox "Registro incluido com sucesso", vbInformation, "Confirmação"
End If


'Excluir
If optExcluir.Value Then
    'Dim result As VbMsgBoxResult
    Result = MsgBox("Deseja excluir o registro nº " & txtCodigo.Text & " ?", vbYesNo, "Confirmação")

    If Result = vbYes Then
        wsCadastro.Range(wsCadastro.Cells(indiceRegistro, colCodigo), wsCadastro.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

        'lblMensagem.Caption = "Registro excluído com sucesso"
        MsgBox "Registro excluído com sucesso", vbInformation, "Confirmação"

        Call CarregaDadosInicial
    End If
End If

Call HabilitaBotoesAlteracao
Call DesabilitaControles
    'Exit Sub
End Sub

Re: Impedindo Duplicidade ao Alterar Dados

Enviado: 21 Out 2018 às 08:11
por Zema
Bom dia galera do Guru do Excel,

Obrigado pela força na tentativa de me ajudar.
Reinaldo, o código que você modificou para que eu fizesse o teste, muito bom, ficou atendendo legal, dentro das suas alegações.
Mas, depois de muitas tentativas no sentido de fazer por mim mesmo, o que aqui pedi ajuda, até pensei que não haveria necessidade alerta e do impedimento de duplicidade para Alterar e pensei até mesmo se teria como fazê-lo, pois sou bem inexperiente no assunto, por isso sempre recorro à ajuda de vocês, inclusive há uns dias você me ajudou a resolver uma outra situação aqui nesse Forum.
Hoje pela manhã, testando o código que você modificou para mim, fiz o que já havia feito, ou seja:
Selecionei um nome a Alterar e como que distraidamente, pode acontecer realmente, eu digitei um outro nome já existente no cadastro, tipo vacilei e alterei o nome errado, por um outro nome já cadastrado e o que aconteceu, foi alterado normalmente, aliás sem o aviso também de que foi alterado com sucesso, ou seja tive que fazer uma consulta pra saber se realmente efetivou a alteração, mas isso é tranquilo de se resolver. Pensei eu, se isso acontece na vida real? Digamos que alguém, ou mesmo eu, quando for pesquisar o nome que foi apagado pela sobreposição do outro que digitei erroneamente ele não mais aparecerá para mim, porque os demais dados daquele nome estará no cadastro mas existirá um nome duplicado com os dados de outro. É aí que estou tentando também na alteração não permitir duplicidade, ok?

Desde já meu muito obrigado, e se puder continuar a me ajudar nessa empreitada ficarei muito grato

Zema

Impedindo Duplicidade ao Alterar Dados

Enviado: 21 Out 2018 às 10:36
por Reinaldo
Vamos lá:
Primeiro, em um projeto/aplicação é necessário definir qual/quais campos são relevantes e não devem ser alterados; esse modelo que utiliza considera, inicialmente, como relevante o Id, porem nada impede que seja elencado outros, como a denominação/nome; para isso basta na rotina que "libera" os campos para alteração excluir o nome (ou outro(s)), impedindo assim que esse campo seja modificado por usuário desatento.