Eviter saisie d'un doublon [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 28 juin 2012
Statut
Membre
Dernière intervention
30 juin 2012
-
Messages postés
5
Date d'inscription
jeudi 28 juin 2012
Statut
Membre
Dernière intervention
30 juin 2012
-
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

Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
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 !
Messages postés
115
Date d'inscription
dimanche 6 avril 2003
Statut
Membre
Dernière intervention
29 juin 2012

bonjour
If Me.UFormDesac_TextBoxNom = Range("D" & J) Then
If Me.UFormDesac_TextBoxNom = .Range("D" & J).value Then

@+JP
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
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 !
Messages postés
5
Date d'inscription
jeudi 28 juin 2012
Statut
Membre
Dernière intervention
30 juin 2012

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?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
5
Date d'inscription
jeudi 28 juin 2012
Statut
Membre
Dernière intervention
30 juin 2012

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!