none
Evitar Duplicidade RRS feed

  • Pergunta

  • Boa Tarde.

    Minha dúvida acredito ser bem simples. Porém sou bem inexperiente em VBA, o que sei é apenas por fuçar no VBA.

    Tenho um banco de dados no Excel e o manipulo por formulários criados no VBA. O banco de dados é bem simples, se trata de um controle de estoque.

    Minha grande dúvida é a seguinte: na hora de cadastrar, já fiz um botão funcional que me cadastra qualquer item digitado da textbox no meu banco de dados, porém quero fazer com que, se houver uma duplicidade entre o textbox e a coluna A do banco de dados, ele não faça e me mostra uma msgbox.

    Estou tentando usar a condição IF...porém não consigo fazer uma, nem pensar como me retornar o valor duplicado.

    Agradeço a ajuda desde já

    quinta-feira, 3 de dezembro de 2015 18:35

Respostas

  • Bom dia Diego, adaptei o código conforme sua necessidade e aproveitei pra alterar algumas outras coisinhas também.

    Basicamente o que fiz foi um laço de repetição (Next... For), para percorrer toda a coluna A e verificar se já existe o cadastro.

    Outra possível solução seria você utilizar o auto filtro para buscar o valor de caixa_cad, caso encontre não cadastra de novo. Você pode usar o gravador de macro para obter esse código.

    Sub cadastro()
    
    'Declaração de variáveis
    Dim lngLastRow As Long
    
    'Seleção da Planilha para cadastro dos itens
    Worksheets("Entrada").Select
    
        'Verificação se existem dados para inclusão
        If caixa_cad = "" Then
            MsgBox "Por Favor Insira um Item para Cadastro!"
            Exit Sub
        End If
    
    'Seleção da primeira linha em branco da coluna para cadastro do item
    lngLastRow = Range("A1").End(xlDown).Row
    
    'Aqui percorremos toda a coluna A para verificar se já existe o cadastro
    For i = 2 To lngLastRow
        If Cells(i, 1).Value = caixa_cad Then
            MsgBox "Este valor já se encontra cadastrado na linha: " & i, vbInformation + vbOKOnly
            Cells(i, 1).Select
            Exit Sub
        End If
    Next i
    
    'Inclusão da textbox no banco de dados
    Cells(lngLastRow, 1).Value = caixa_cad
    
    'Rotina final para limpar textbox
    caixa_cad = ""
    
    MsgBox "Item Cadastrado!", vbInformation + vbOKOnly
    
    caixa_cad.SetFocus
    
    ActiveWorkbook.Save
    
    End Sub
    

    • Marcado como Resposta Diego.Tj sexta-feira, 4 de dezembro de 2015 15:30
    sexta-feira, 4 de dezembro de 2015 11:14
  • Forma alternativa:

    Option Explicit
    
    Dim caixa_cad
    
    Private Sub salvar_Click()
        Dim RecordRow As Long
        
        If Not IsDataValid Then GoTo Quit
        
        With ThisWorkbook.Worksheets("Entrada")
            RecordRow = GetMatchIndex(caixa_cad, .Columns("A"))
            If RecordRow = 0 Then
                'Registro novo
                RecordRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
            End If
            .Cells(RecordRow, "A") = caixa_cad
        End With
        
        ClearUserForm
        ActiveWorkbook.Save
        MsgBox "Item Cadastrado!", vbInformation
    Quit:
    End Sub
    
    Private Function IsDataValid() As Boolean
        If caixa_cad = "" Then
            MsgBox "Por Favor Insira um Item para Cadastro!"
            GoTo Quit
        End If
    
        IsDataValid = True
    Quit:
    End Function
    
    Private Function GetMatchIndex(pSearchValue As Variant, pRange As Range) As Long
        On Error Resume Next
        GetMatchIndex = WorksheetFunction.Match(pSearchValue, pRange, 0)
    End Function
    
    Private Sub ClearUserForm()
        caixa_cad = ""
        caixa_cad.SetFocus
    End Sub
    

    sexta-feira, 4 de dezembro de 2015 13:20
    Moderador

Todas as Respostas

  • Por favor, poste o código do botão que efetua o salvamento para sugerirmos um código.

    http://www.ambienteoffice.com.br - http://www.clarian.com.br

    quinta-feira, 3 de dezembro de 2015 19:01
    Moderador
  • Segue:

    --------------------------------------------------------------------------------------------------

    Private Sub salvar_Click()

    'Seleção da Planilha para cadastro dos itens
    Worksheets("Entrada").Select

    'Verificação se existem dados para inclusão
        If caixa_cad = "" Then
            MsgBox "Por Favor Insira um Item para Cadastro!"
            Exit Sub
        Else
        End If

    'Seleção da primeira linha em branco da coluna para cadastro do item

    Range("a1048576").End(xlUp).Offset(1, 0).Select

    'Inclusão da textbox no banco de dados

    ActiveCell.FormulaR1C1 = caixa_cad

    'Rotina final para limpar textbox

    caixa_cad = ""

    MsgBox "Item Cadastrado!"

    caixa_cad.SetFocus

    ActiveWorkbook.Save

    End Sub

    sexta-feira, 4 de dezembro de 2015 11:03
  • São linhas de comando bem simples.

    Eu gostaria que antes de achar a primeira linha (ou célula) para inserir o dado da textbox, existisse uma rotina para verificar os dados já inserido na coluna A do banco de dados, e se for igual a da textbox ele me retornaria uma msgbox, caso contrario ele já iria para a rotina de inserir no banco de dados ate o fim das rotinas.

    Num sei se estou conseguindo ser claro, mas é isso...kkkk

    Obrigado desde já pela ajuda.


    • Editado Diego.Tj sexta-feira, 4 de dezembro de 2015 11:08
    sexta-feira, 4 de dezembro de 2015 11:07
  • Bom dia Diego, adaptei o código conforme sua necessidade e aproveitei pra alterar algumas outras coisinhas também.

    Basicamente o que fiz foi um laço de repetição (Next... For), para percorrer toda a coluna A e verificar se já existe o cadastro.

    Outra possível solução seria você utilizar o auto filtro para buscar o valor de caixa_cad, caso encontre não cadastra de novo. Você pode usar o gravador de macro para obter esse código.

    Sub cadastro()
    
    'Declaração de variáveis
    Dim lngLastRow As Long
    
    'Seleção da Planilha para cadastro dos itens
    Worksheets("Entrada").Select
    
        'Verificação se existem dados para inclusão
        If caixa_cad = "" Then
            MsgBox "Por Favor Insira um Item para Cadastro!"
            Exit Sub
        End If
    
    'Seleção da primeira linha em branco da coluna para cadastro do item
    lngLastRow = Range("A1").End(xlDown).Row
    
    'Aqui percorremos toda a coluna A para verificar se já existe o cadastro
    For i = 2 To lngLastRow
        If Cells(i, 1).Value = caixa_cad Then
            MsgBox "Este valor já se encontra cadastrado na linha: " & i, vbInformation + vbOKOnly
            Cells(i, 1).Select
            Exit Sub
        End If
    Next i
    
    'Inclusão da textbox no banco de dados
    Cells(lngLastRow, 1).Value = caixa_cad
    
    'Rotina final para limpar textbox
    caixa_cad = ""
    
    MsgBox "Item Cadastrado!", vbInformation + vbOKOnly
    
    caixa_cad.SetFocus
    
    ActiveWorkbook.Save
    
    End Sub
    

    • Marcado como Resposta Diego.Tj sexta-feira, 4 de dezembro de 2015 15:30
    sexta-feira, 4 de dezembro de 2015 11:14
  • Forma alternativa:

    Option Explicit
    
    Dim caixa_cad
    
    Private Sub salvar_Click()
        Dim RecordRow As Long
        
        If Not IsDataValid Then GoTo Quit
        
        With ThisWorkbook.Worksheets("Entrada")
            RecordRow = GetMatchIndex(caixa_cad, .Columns("A"))
            If RecordRow = 0 Then
                'Registro novo
                RecordRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
            End If
            .Cells(RecordRow, "A") = caixa_cad
        End With
        
        ClearUserForm
        ActiveWorkbook.Save
        MsgBox "Item Cadastrado!", vbInformation
    Quit:
    End Sub
    
    Private Function IsDataValid() As Boolean
        If caixa_cad = "" Then
            MsgBox "Por Favor Insira um Item para Cadastro!"
            GoTo Quit
        End If
    
        IsDataValid = True
    Quit:
    End Function
    
    Private Function GetMatchIndex(pSearchValue As Variant, pRange As Range) As Long
        On Error Resume Next
        GetMatchIndex = WorksheetFunction.Match(pSearchValue, pRange, 0)
    End Function
    
    Private Sub ClearUserForm()
        caixa_cad = ""
        caixa_cad.SetFocus
    End Sub
    

    sexta-feira, 4 de dezembro de 2015 13:20
    Moderador
  • Muito Obrigado!

    Entendi a logica dos comandos que você executou, com certeza me ajudou muito, pois agora além de ter concluído a parte de cadastro do banco de dados, aumentei meus conhecimentos com coisas que nem conhecia e até mesmo coisas que estava usando que vi não serem necessárias como no caso Else que eu achava ser necessário para concluir a rotina do IF.

    Vlw muito pela ajuda André e Felipe .


    • Editado Diego.Tj sexta-feira, 4 de dezembro de 2015 15:30
    sexta-feira, 4 de dezembro de 2015 15:07