Notifications
Clear all

Evitar Duplicidade (botao_Cadastrar)

10 Posts
2 Usuários
0 Reactions
3,043 Visualizações
(@bilokas)
Posts: 168
Reputable Member
Topic starter
 

Olá estimados amigos do fórum,
Preciso criar uma rotina para evitar/indicar através de msgbox ou algo do tipo que os dados que estão sendo cadastrados estão repetidos, porém são apenas três informações que validam se é repetido ou não: txt_Servidor, DTPicker_Ida e DTPicker_Volta.
Quando o usuário clicar no botão cadastrar, seja verificado na Planilha "dados" se já existem essas informações na mesma linha e indicar de alguma forma que já existe, cancelando o cadastro.

A rotina do meu botão CADASTRAR segue abaixo:

'INÍCIO ########## BOTÃO CADASTRAR ##########'
Private Sub botao_Cadastrar_Click()
'Trata erro, caso falha no sistema
On Error GoTo ErroNoSistema
    'Inicia processo de seleção de próxima linha vazia para gravação de dados do frmCadastro
    Dim Linha As Integer
    Linha = Sheets("dados").Range("A" & Rows.Count).End(xlUp).Row
    Linha = Linha + 1
    
     'Salva as informações dos objetos do frmCadastro na planilha "dados"
    Sheets("dados").Cells(Linha, 1).Value = txt_AnoReferencia.Value
    Sheets("dados").Cells(Linha, 2).Value = Remove_Acentos(ComboBox_MesReferencia.Value)
    Sheets("dados").Cells(Linha, 3).Value = txt_Processo.Value
    Sheets("dados").Cells(Linha, 4).Value = Remove_Acentos(txt_SetorDemandante.Value)
    Sheets("dados").Cells(Linha, 5).Value = Remove_Acentos(txt_Servidor.Value)
    Sheets("dados").Cells(Linha, 6).Value = Remove_Acentos(txt_CidadeDestino.Value)
    Sheets("dados").Cells(Linha, 7).Value = Format(DTPicker_Ida.Value, "dd/mm/yyyy")
    Sheets("dados").Cells(Linha, 8).Value = Format(DTPicker_Volta.Value, "dd/mm/yyyy")
    Sheets("dados").Cells(Linha, 9).Value = txt_QuantidadeDiaria.Value
    Sheets("dados").Cells(Linha, 10).Value = txt_ValorDiaria.Value
    'Fim do proceso de gravação

     'Salva a planilha
    ThisWorkbook.Save

    'Mensagem de confirmação ao usuário e reload do frmCadastro para nova inclusão
    MsgBox "Registro incluído no sistema com sucesso." & vbCrLf & vbCrLf & "Clique em OK para continuar.", vbInformation, "CONFIRMAÇÃO"
    Unload Me
    frmCadastro.Show
    
Exit Sub
    
'Tratando erro
ErroNoSistema:
        MsgBox "O sistema encontrou um Erro de execução." & vbCrLf & "Contate o desensolvedor do projeto." _
        & vbCrLf & vbCrLf & "Clique em OK para encerrar a aplicação.", vbCritical, "ERROR"
        
        Application.DisplayAlerts = False
        ThisWorkbook.Save
        Application.Quit
Resume Next
End Sub

Desde já agradeço quaisquer comentários ou ajudas.

 
Postado : 31/07/2014 6:36 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!

Tente isso! Adapte à sua necessidade

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim nLinComp, nLinFim As Integer

nLinFim = 1

Do While Not IsEmpty(Cells(nLinFim, 1))
nLinFim = nLinFim + 1
Loop

nLinComp = 1
Do While nLinComp <= nLinFim - 2
If Cells(nLinFim - 1, 1).Value = Cells(nLinComp, 1).Value Then
MsgBox "Cadastro já existe", vbCritical, "Cadastro!"
Cells(nLinFim - 1, 1).Activate
Cells(nLinFim - 1, 1).Interior.ColorIndex = 4
Exit Sub
Else
nLinComp = nLinComp + 1
End If
Loop
Cells(nLinComp + 1, 1).Activate
Cells(nLinFim - 1, 1).Interior.ColorIndex = xlNone
Cells(nLinFim, 1).Interior.ColorIndex = xlNone
End Sub

Obs:- Na linha do código "Cells(nLinFim - 1, 1).Interior.ColorIndex = 4"
a célula com o valor duplicado é pintada de verde... caso seja desnecessário pode ignorá-lo.

Att,

 
Postado : 31/07/2014 7:10 am
(@bilokas)
Posts: 168
Reputable Member
Topic starter
 

Marciel Silva, obrigado por responder.

A inputação de dados é via ação "Clique" em botão de um Userform, e não através da própria planilha.

 
Postado : 31/07/2014 7:15 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

bilokas,

Teria como disponibilizar um modelo do que você já tem pronto para ficar mais fácil adaptar?

Att,

 
Postado : 31/07/2014 7:18 am
(@bilokas)
Posts: 168
Reputable Member
Topic starter
 

Segue em anexo, conforme solicitado. (atente para frmCadastro)

 
Postado : 31/07/2014 7:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pq vc não cria uma planilha de apoio, separada da sua, onde vc criaria as células que definem a existência de um registro, por exemplo.
Daí, uma outra células que faria o Cont.Ses() olhando pra sua base.

Assim, antes de cadastrar na base, vc jogaria os valores nestas células e verificaria o resultado do cont.ses(). Se der 0, pode cadastrar, caso contrário, não.

O que vc acha ?

 
Postado : 31/07/2014 8:14 am
(@bilokas)
Posts: 168
Reputable Member
Topic starter
 

Amigos do fórum, agradeço a todos pela disponibilidade de tentatem ajudar. Acabei conseguindo resolver meu problema através do método Find (tinha esquecido dele) Hehehe

O código já adaptado e totalmente funcional ficou assim:

Private Sub botao_Cadastrar_Click()
On Error GoTo ErroNoSistema
    Dim Servidor, DataIda, DataVolta
    Dim Linha As Integer
    Dim Rng1, Rng2, Rng3 As Range
 
    Servidor = txt_Servidor.Value
    DataIda = Format(DTPicker_Ida.Value, "dd/mm/yyyy")
    DataVolta = Format(DTPicker_Volta.Value, "dd/mm/yyyy")
    
    Set Rng1 = Sheets("dados").Range("E:E").Find(Servidor)
    Set Rng2 = Sheets("dados").Range("G:G").Find(DataIda)
    Set Rng3 = Sheets("dados").Range("H:H").Find(DataVolta)
    
    If Not Rng1 Is Nothing And Not Rng2 Is Nothing And Not Rng3 Is Nothing Then
        MsgBox ("Já existe uma diária para o servidor '" & Rng1.Offset(, 0) & "' com essas datas de Ida e Volta cadastrados no sistema." _
        & vbCrLf & vbCrLf & "FAVOR VERIFICAR."), vbExclamation, ("AVISO DE DUPLICIDADE")
        Exit Sub
    Else
        Linha = Sheets("dados").Range("A" & Rows.Count).End(xlUp).Row
        Linha = Linha + 1
        
        Sheets("dados").Cells(Linha, 1).Value = txt_AnoReferencia.Value
        Sheets("dados").Cells(Linha, 2).Value = Remove_Acentos(ComboBox_MesReferencia.Value)
        Sheets("dados").Cells(Linha, 3).Value = txt_Processo.Value
        Sheets("dados").Cells(Linha, 4).Value = Remove_Acentos(txt_SetorDemandante.Value)
        Sheets("dados").Cells(Linha, 5).Value = Remove_Acentos(txt_Servidor.Value)
        Sheets("dados").Cells(Linha, 6).Value = Remove_Acentos(txt_CidadeDestino.Value)
        Sheets("dados").Cells(Linha, 7).Value = Format(DTPicker_Ida.Value, "dd/mm/yyyy")
        Sheets("dados").Cells(Linha, 8).Value = Format(DTPicker_Volta.Value, "dd/mm/yyyy")
        Sheets("dados").Cells(Linha, 9).Value = txt_QuantidadeDiaria.Value
        Sheets("dados").Cells(Linha, 10).Value = txt_ValorDiaria.Value
        
        ThisWorkbook.Save
        MsgBox "Registro incluído no sistema com sucesso." & vbCrLf & vbCrLf & "Clique em OK para continuar.", vbInformation, "CONFIRMAÇÃO"
        Unload Me
        frmCadastro.Show
    End If
    
Exit Sub
    
ErroNoSistema:
        MsgBox "O sistema encontrou um Erro de execução." & vbCrLf & "Contate o desensolvedor do projeto." _
        & vbCrLf & vbCrLf & "Clique em OK para encerrar a aplicação.", vbCritical, "ERROR"

        Application.DisplayAlerts = False
        ThisWorkbook.Save
        Application.Quit
Resume Next
End Sub

Problema resolvido.

 
Postado : 31/07/2014 8:27 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Nao... não está resolvido pq vc fez buscas independentes.
Tente cadastrar um "Servidor 2" com data que já existe cadastrada para um "Servidor 1"...

FF

 
Postado : 31/07/2014 8:30 am
(@bilokas)
Posts: 168
Reputable Member
Topic starter
 

Sim fernando,

Eu NÃO posso ter o MESMO servidor nas mesmas DATAS.

Agora

Eu posso ter SIM um servidor diferente nas mesmas DATAS.

Ou seja, o que não pode acontecer nunca, é o servidor e as datas serem iguais a uma linha (registro) na planilha "dados".
Só para embasar a explicação. Essa planilha controla diárias de servidores, ou seja, diversos servidors podem viajar na mesma data de ida e volta, mas não o mesmo.
Quer dizer, a planilha não pode aceitar o mesmo servidor na mesma data mais de uma vez. Porque além da planilha ficar errada, é impossível (no meu trabalho) um servidor viajar para dois lugares na mesma data de ida e volta.

 
Postado : 31/07/2014 8:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

A funcionalidade eu entendi.
Pelo que li no código, a busca não está amarrada. Ou seja, o código impedirá um servidor 1 de viajar na mesma data que um servidor 2, ou ainda, um servidor 1 viajar duas vezes.
É que o .Find() não está verificando se o item encontrado está na mesma linha...

Isso é pelo que eu entendi do código. Mas eu posso estar enganado e pelo que vc diz devo estar mesmo.

Então, segue o jogo.

Q bom que deu cerrto.

FF

 
Postado : 31/07/2014 12:03 pm