Notifications
Clear all

Evitar Duplicidade (botao_Cadastrar)

10 Posts
2 Usuários
0 Reactions
3,054 Visualizações
(@bilokas)
Posts: 168
Estimable 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.


DGAF / DVGD - Divisão de Gestão de Documentos
Rafael A. Guimarães
[email protected]

 
Postado : 31/07/2014 6:36 am
Fernando Fernandes
(@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,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 31/07/2014 7:10 am
(@bilokas)
Posts: 168
Estimable 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.


DGAF / DVGD - Divisão de Gestão de Documentos
Rafael A. Guimarães
[email protected]

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

bilokas,

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

Att,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

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

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


DGAF / DVGD - Divisão de Gestão de Documentos
Rafael A. Guimarães
[email protected]

 
Postado : 31/07/2014 7:23 am
Fernando Fernandes
(@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 ?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 31/07/2014 8:14 am
(@bilokas)
Posts: 168
Estimable 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.


DGAF / DVGD - Divisão de Gestão de Documentos
Rafael A. Guimarães
[email protected]

 
Postado : 31/07/2014 8:27 am
Fernando Fernandes
(@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

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 31/07/2014 8:30 am
(@bilokas)
Posts: 168
Estimable 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.


DGAF / DVGD - Divisão de Gestão de Documentos
Rafael A. Guimarães
[email protected]

 
Postado : 31/07/2014 8:44 am
Fernando Fernandes
(@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

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 31/07/2014 12:03 pm