Contrôle textbox pour interdire doublon

Bonjour,

J'ai produit un formulaire qui une fois renseigné on appuie sur "Créer" et cela vient incrémenter des cellules puis envoyer un mail, j'ai inscrit ce bout de code lorsque je clique sur le bouton créer pour éviter tout doublon :

Private Sub btcreer_click()
With Sheets("La demande")
If Me.ComboBox1 & Me.ComboBox2 & Me.ComboBox3 & Me.TextBox1 = .Range("C3") & .Range("C4") & .Range("C10") & .Range("C8") Then
MsgBox "Enregistrement existant"
Exit Sub
End If
End With
End Sub

Le problème ce situe au niveau de ma TextBox1 qui correspond à .Range("C8), en gros le contenu de la textbox est comparé à celui de la cellule C8, s'ils sont identiques un message apparaît "Enregistrement existant" et annule l'envoie du mail.

Le problème et que cela ne vérifie que la première ligne de ma textbox (c'est une MultiLine avec EnterKeyBehavior : True), si je tape du texte sur les lignes suivantes le code n'en tient pas compte et ne vérifie pas.

J'espère avoir été assez clair. Le problème est très gênant et je souhaitais combler cette faille (la dernière qu'il me reste à combler).

Merci pour votre aide et bonne soirée.

Bonjour,

testes de cette façon pour voir :

Private Sub btcreer_click()

    Dim Chaine1 As String
    Dim Chaine2 As String

    Chaine1 = Me.ComboBox1.Text & Me.ComboBox2.Text & Me.ComboBox3.Text & Replace(Me.TextBox1.Text, Chr(13) & Chr(10), " ")

    With Sheets("La demande")

        Chaine2 = .Range("C3").Value & .Range("C4").Value & .Range("C10").Value & .Range("C8").Value

    End With

    If Chaine1 = Chaine2 Then

        MsgBox "Enregistrement existant"
        Exit Sub

    End If

End Sub

Bonjour Theze,

Merci pour ta réponse, malheureusement elle ne fonctionne pas.

Ni pour la première ligne de renseignée, ni pour les suivantes.

J'ai pourtant bien copié ton code en vérifiant toutes les correspondances (combobox, textbox et cellules), pas d'erreur, tout fonctionne hormis la restriction que je souhaite appliquer.

Une alternative ?

Bonjour,

Est-ce vraiment nécessaire d'utiliser la touche Entrée, en mettant la propriété multi-lignes à vrai ne suffit pas ?

Sinon, postes ton fichier pour qu'on puisse faire des tests car normalement, le retour à la ligne est composé de Chr(13) et Chr(10) et en effectuant un remplacement de ces deux caractères par un espace, chez moi ça fonctionne :

Replace(Me.TextBox1.Text, Chr(13) & Chr(10), " ")

Salut Theze,

Je souhaitais simplifier le retour à la ligne.

Si j’enlève EnterKeyBehavior, il faudra maintenir Alt + Entrée pour aller à la ligne (moins simple).

Si je dis des bêtises n’hésite pas à me le dire (un peu novice en userform).

Dans tous les cas, je ferai l’essai lundi et je reviens poster ici (je n’ai pas le fichier avec moi).

Merci encore.

Tu as la propriété "MultiLine" dans les propriétés d'un TextBox, il te faut la mettre à True et quand tu écris, en arrivant au bord droit, la phrase continue à la ligne sans avoir besoin de faire quoi que ce soit et avec ça, tu as aussi la propriété "ScrollBars" qui te permet, dans le cas où tu dépasses le bas ou la droite (à voir ce que tu préfères) du TextBox d'avoir l'ascenseur vertical ou horizontal ou même les deux (voir les arguments proposés pour cette propriété)

Re,

Je vois ces options, je les ai expérimentées.

Elles ne me conviennent pas. Ma textobox est bridée (nombre de caractères limité et retours à la ligne aussi).

L’option EnterKeyBehavior, j’y tiens. Cela permet d’aérer la rédaction sans attendre le retour automatique à la ligne arrivé en bout de course (texte monobloc peu digeste).

Bonjour,

Dans ce cas, postes un fichier exemple sans données confidentielles !

Bonjour Sk8Strong,

Bonjour Theze,

Le souci vient du caractère espace qui par inadvertance peut être ajouté en fin de ligne avant retour chariot et Entrée.

Private Sub btcreer_click() With Sheets("La demande") ValText = Replace(.[C8], " ", "") TextVal = Replace(Me.TextBox1.Text, Chr(13) & Chr(10), "") If Me.ComboBox1 & Me.ComboBox2 & Me.ComboBox3 & Replace(TextVal, " ", "") = .Range("C3") & .Range("C4") & .Range("C10") & ValText Then MsgBox "Enregistrement existant" Exit Sub End If End With End Sub

Bons tests, bonne continuation.

Bonsoir,

Merci X Cellus pour la solution que tu proposes, j'essais ça dès que possible !

Merci Theze également pour ton intérêt, comme je l'ai dit plus haut, je n'ai pas le fichier avec moi et il n'est pas facile de le reproduire pour partage.

Je vois ça à partir de lundi et au besoin je partagerai ce fichier.

Bonne soirée à vous.

25test.xlsm (117.27 Ko)

bonjour,

X Cellus, j'ai tenté ta solution, ça ne fonctionne pas.

Je joins mon fichier comme tu me l'as demandé Theze.

Pour le faire fonctionner il y a des répertoires à modifier à trois reprises dans le code (la partie "C:\Users\username\Documents\") et l'adresse mail à renseigner (j'en ai mis une bidon). Pour les pièces jointes qu'il est possible d'ajouter j'ai mis comme répertoire par défaut : "C:\".

J'ai laissé mon code d'origine pour le reste.

Pour info, une fois le formulaire renseigné, on clique sur créer, le code va permettre de renseigner deux feuilles du classeur excel, une feuille va s'enregistrer au format .pdf dans un dossier défini, l'autre feuille comporte un tableau qui est renseigné automatiquement avec des liens hypertexte puis un mail est envoyé avec les mêmes liens hypertexte pour finir. J'imagine que vous comprendrez le code aisément (c'est du code récupéré un peu partout, désolé pour les puristes).

Merci à vous !

Bonjour Sk8Strong,

Pour info, une fois le formulaire renseigné, on clique sur créer, le code va permettre de renseigner deux feuilles du classeur excel,

Le code renseigne de toute façon ces feuilles même s'il existe un enregistrement existant identique. Puisque le message d'avertissement n'est pas suivi d'une correction RAZ de données entrées ou de certaines de ces données.

Comment est comparée la nouvelle demande par rapport aux données existantes? Si je prends exemple pour le demandeur Paul, il en existe 5 avec le même lieu, même secteur et des descriptions diverses. Existe-il un code qui permet de lister toutes ces demandes passées avec la nouvelle demande?

Et comment faire la différence entre fuite d'eau (ex-demande) d'une manière générale avec fuites d'eaux (nouvelle demande). Il se peut aussi qu'une ancienne demande soit traitée tel jour (ex: fuite d'eau) mais que pour diverses raisons une nouvelle fuite survient. Pourquoi interdire un doublon?

En fait le code ajouté ne convient pas, non pas seulement d'un point de vue technique (VBA). Mais aussi d'un point de vue logique métier (Conceptuelle). Il vaudrait mieux comparer une nouvelle demande par rapport à un numéro de demande (devis...) afin de vérifier que l'on a affaire à du nouveau et non une demande déjà traitée auparavant.

Imagine si ce formulaire était actif dans un hôpital... Le patient Sk8Strong est déjà venu pour une opération du pouce main droite. Mais il revient plus tard, encore pour ce pouce main droite. Et là le chirurgien refuse car cette demande a déjà eu lieu. Si cela avait été main gauche cette demande serait validée... Absurde!

J'ai été un peu long mais cette question sur le TextBox1 et l'interdiction par doublon mérite un peu plus d'explications sur la logique métier et sur le lien avec la base de données pour comparaison. Car en cellule C8 il faudrait une boucle (sur la base) de comparaison pour avertir ou non qu'il y ait doublon. La feuille "La demande" n'étant que la récupération des données du formulaire.

A suivre...

Bonjour,

Quand tu veux faire un retour à la ligne dans ton TextBox1, tu utilises seulement la touche Entrée, ce qui correspond à Chr(13)+Chr(10) alors que quand tu fais un retour à la ligne dans la cellule C8, tu utilises la combinaison de touches Alt+Entrée ce qui correspond à Chr(10) donc, il te faut adapter de façon à ce que les chaînes correspondent pour une saisie identique :

Dim Chaine1 As String
Dim Chaine2 As String

With Sheets("La demande")

    'ici, on remplace les caractères Chr(13) & Chr(10) par un espace !
    Chaine1 = Me.ComboBox1.Text & Me.ComboBox2.Text & Me.ComboBox3.Text & Replace(Me.TextBox1.Text, Chr(13) & Chr(10), " ")

    'et ici, on remplace seulement le caractère Chr(10) par un espace !
    Chaine2 = .Range("C3").Value & .Range("C4").Value & .Range("C10").Value & Replace(.Range("C8").Value, Chr(10), " ")

    End With

    If Chaine1 = Chaine2 Then

        MsgBox "Enregistrement existant"
        Exit Sub

    End If
'...
'...
'...

Bonjour tout le monde,

Un grand merci Theze ça fonctionne !

X Cellus, la version du fichier que je vous ai transmise a été préalablement épurée de toutes informations personnelles.

Comme je le disais, le fichier est fonctionnel est correspond à mes besoins en version complète. Je souhaitais seulement le brider au maximum pour éviter les erreurs, les doublons dans le cas présent et c'est chose faite !

Merci dans tous les cas pour votre intérêt en espérant que cela puisse aider d'autres personnes !

Bonne soirée !

Content de t'avoir aidé

Rechercher des sujets similaires à "controle textbox interdire doublon"