Eviter saisie d'un doublon

Résolu
Bobbyjack Messages postés 5 Date d'inscription jeudi 28 juin 2012 Statut Membre Dernière intervention 30 juin 2012 - 28 juin 2012 à 22:02
Bobbyjack Messages postés 5 Date d'inscription jeudi 28 juin 2012 Statut Membre Dernière intervention 30 juin 2012 - 29 juin 2012 à 23:34
Bonjour,

Cela fait deux jours que je me suis lancé dans le développement d'un outil de suivi avec VBA et excel dans le cadre d'un stage.

Je dispose d'un bouton "Ajout client" qui m'ouvre un premier useform qui me donne la possibilité entre deux boutons "désactivations" et "conquête inactive"

en cliquant sur "désactivations" on a un deuxieme useform qui s'ouvre et qui permet de renseigner des informations sur le client.

Dans ce useform je galère à éviter la saisie de doublons.
Je lance une série de contrôles lorsque l'on appuie sur le bouton "valider", tout fonctionne sauf le code qui est censé éviter les doublons...(en bleu)

Je remercie par avance les personnes qui pourront m'éclairer

Private Sub UFormDesac_Valider_Click()
'Variables
 Dim J As Long
    Dim Lg As Long

'Contrôles

'Contrôle Nom
    If Me.UFormDesac_TextBoxNom = "" Then
        MsgBox "Saisir un nom!"
        Me.UFormDesac_TextBoxNom.SetFocus
    Exit Sub
    End If
    
    If IsNumeric(UFormDesac_TextBoxNom) Then
        MsgBox "Nom incorrecte!", vbCritical, "ATTENTION !"
        UFormDesac_TextBoxNom = ""
        UFormDesac_TextBoxNom.SetFocus
    Exit Sub
    End If
    
    With Sheets("AJOUT")
    Lg = .Range("D" & Rows.Count).End(xlDown).Row
        For J = 4 To Lg
           If Me.UFormDesac_TextBoxNom = Range("D" & J) Then
            MsgBox "Ce Nom existe déjà!"
            Exit Sub
            End If
        Next J
    End With
    

'Contrôle NDC
    If Me.UFormDesac_TextBoxNDC = "" Then
        MsgBox "Saisir NDC!"
        Me.UFormDesac_TextBoxNDC.SetFocus
    Exit Sub
    End If
    
'Contrôle Nature de la désactivation

    If Me.UFormDesac_NatureDesac = "" Then
        MsgBox "Choisir type de désactivation!"
        Me.UFormDesac_NatureDesac.SetFocus
    Exit Sub
    End If
    
    Select Case Me.UFormDesac_NatureDesac
        Case Is = ["Non évitable"]
        Case Is = ["Evitable"]
        Case Else
            MsgBox "Type de désactivation invalide!"
            Me.UFormDesac_NatureDesac.SetFocus
    Exit Sub
    End Select
    
    


Sheets("AJOUT").Range("C65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxNom
Sheets("AJOUT").Range("D65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxNDC
Sheets("AJOUT").Range("E65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxDateEntree
Sheets("AJOUT").Range("F65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_NatureDesac

Unload Me
End Sub

7 réponses

MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
29 juin 2012 à 02:18
Bonjour,   n'aurais-tu pas oublié le point devant le Range ? ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
3
mjpmjp Messages postés 115 Date d'inscription dimanche 6 avril 2003 Statut Membre Dernière intervention 29 juin 2012
29 juin 2012 à 06:30
bonjour
If Me.UFormDesac_TextBoxNom = Range("D" & J) Then
If Me.UFormDesac_TextBoxNom = .Range("D" & J).value Then

@+JP
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 07:34
Bonjour,
cette boucle est de toutes manières malheureuse :
For J = 4 To Lg
If Me.UFormDesac_TextBoxNom = .Range("D" & J) Then
MsgBox "Ce Nom existe déjà!"
Exit Sub
End If
Next J

L'utilisation d'un dictionnaire ferait gagner un temps significatif.
Mais même sans dictionnaire : la simple utilisation de la méthode Find serait plus rapide que cette boucle.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
29 juin 2012 à 09:06
pour le Find ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bobbyjack Messages postés 5 Date d'inscription jeudi 28 juin 2012 Statut Membre Dernière intervention 30 juin 2012
29 juin 2012 à 11:34
Merci pour vos réponses !

J'avais effectivement oublié un point...
Pour info je débute en VBA, mais j'ai déja fait de la programmation Java et C++ mais as trop poussée non plus

Gagné en rapidité d'exécution m'intéresse je vais donc essayer avec un Find et je reviens vers vous!

En attendant j'ai un autre petit soucis: que le useform remplisse la ligne suivante à chaque fois.

Dans le même code j'utilise ça :
Sheets("AJOUT").Range("C65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxNom
Sheets("AJOUT").Range("D65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxNDC
Sheets("AJOUT").Range("E65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_TextBoxDateEntree
Sheets("AJOUT").Range("F65535").End(xlUp).Offset(1, 0) = Me.UFormDesac_NatureDesac


Mais ca ne me plaît pas puisque par exemple si la ligne 1 est remplie sauf la colonne A, alors au prochain remplissage de formulaire, l'information se mettra en ligne 1 colonne A au lieu de en ligne 2 colonne A, vous me suivez ?

Donc je me suis lancé dans le code d'un autre useform pour l'instant à ce que toutes les infos aillent dans une même ligne peut importe s'il y a une cellule vide dans la ligne précédente, voici mon code :


Dim derligne As Integer
    Dim lignecr As Integer
   
    Selection.End(x1Down).Select
    derligne = ActiveCell.Row
    lignecr = derligne + 1
    
    Sheets("SUIVI").Range("A" & lignecr + 1) = Me.USuiviPretsCHF_TextBoxDate
    Sheets("SUIVI").Range("B" & lignecr + 1) = Me.USuiviPretsCHF_choixConcurrent
    Sheets("SUIVI").Range("C" & lignecr + 1) = Me.USuiviPretsCHF_ChoixTypePret
    Sheets("SUIVI").Range("D" & lignecr + 1) = Me.USuiviPretsCHF_TextBoxPret
    Sheets("SUIVI").Range("E" & lignecr + 1) = Me.USuiviPretsCHF_ComboBoxAg
    Sheets("SUIVI").Range("F" & lignecr + 1) = Me.USuiviPretsCHF_TextBoxC



Mais ça ne marche pas... sachante que j'ai trois lignes d'entête.

des idées?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 11:54
On ne traite en général pas plusieurs questions sur ce forum. Evite donc de le faire.
Ce n'est pas une appli, que l'on traite, mais une question technique spécifique et isolée (et une seule par discussion).
Exceptionnellement : intéresse-toi donc à Specialcells(xlCellTypeLastCell)
Bien obligé puisque tu nous parles de la possibilité d'avoir un blanc en colonne A, mais que tu ne nous parles pas de cette même possibilité sur d'autres colonnes (quelle que soit la ligne) !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Bobbyjack Messages postés 5 Date d'inscription jeudi 28 juin 2012 Statut Membre Dernière intervention 30 juin 2012
29 juin 2012 à 23:34
Bon voilà j'ai réussi avec le find

J'ai également réglé mon deuxième problème en utilisant Find pour trouver la dernière ligne remplie!

Merci Ucfoutu!
0
Rejoignez-nous