UserF ne pas accepter 2 même texte dans une Col + mettre une valeur neg si

Bonsoir à toutes et a tous,

Je cherche désespérément une solution à mon problème.

Je m'explique j'aimerais utiliser mon UserForm de saisie pour remplir un tableau jusqu'à la tout est ok j'arrive a faire ce que je veux.

Problème 1 :
Dans ce tableau j'aimerais que la première colonne intitulée "Détails" qu'il ne puisse pas y avoir deux fois le même mot. (E9=Test donc Dans E10 on ne puisse pas mettre Test et que sa m'affiche un message box du genre "Attention détails déjà existant !"

Problème 2:
En sélectionnant ma Listbox dans mon UserForm j'ai le choix entre "Crédit" et "Débit". j'aimerais alors que si je sélectionne Débit la valeur de ma textbox2 soit introduite en négative.
(si je met 200.00 CHF dans la textbox2 et que je valide l'UserForm ça affiche -200.00 CHF dans la colonne "Montant")

Dans l'attente de solutions je vous souhaite une excellente soirée.
Merci d'avance.

Bonsoir bouzouk, bonsoir le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :

Private O As Worksheet 'déclare la variable O (Onglet)
Private TS As ListObject 'déclare la variable TS (Tableau Structuré)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Worksheets("Feuil1") 'définit l'onglet O
Set TS = O.ListObjects("Tableau3") 'définit le tableau structuré TS
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'à l'appui sur une touche dans la TextBox1
If KeyAscii = 46 Then KeyAscii = 44: Exit Sub 'emplace le point par une virgule et sort de la procédure
If KeyAscii < 47 Or KeyAscii > 58 Then KeyAscii = 8 'remplace tout aute caractère que {0, 1, 2, 3, 4, 5, 6, 7, 8 et 9] par l'effacement (backspace)
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 'avant la mise à jour de la TextBox1
Dim I As Integer 'déclare la variable I (Incrément)

For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du tableau structuré TS
    'condition : si la donnée ligne I colonne 1 de TS (convertie en majuscules) est égale à la valeur de la TextBox1 (convertie en majuscules)
    If UCase(TS.DataBodyRange(I, 1).Value) = UCase(Me.TextBox1.Value) Then
        'condition 2 : si "Non" au message
        If MsgBox("Attention détails déjà existant ! Voulez-vous utiliser ce détails malgré cela ?", vbYesNo) = vbNo Then
            With Me.TextBox1 'prend en compte la TextBox1
                'sélectionne le texte
                .SelStart = 0 'début de la sélection
                .SelLength = Len(.Value) 'longueur de la sélection
            End With 'fin de la prise en compte de la TextBox1
            Cancel = True 'empêche la sortie de la TextBox1
            Exit Sub 'sort de la procédure
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle
End Sub

Private Sub CommandButton1_Click() 'bouton "VALIDER"
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)

Set R = TS.ListColumns(1).Range.Find("") 'définit la recherche R (Recherche du vide dans la colonne 1 de TS)
If R Is Nothing Or TS.ListRows.Count = 0 Then 'condition : si aunue occurrence n'est trouvée ou si TS ne contient pas encore de ligne
    TS.ListRows.Add 'ajoute une ligne à TS
    LI = TS.ListRows.Count 'définit la ligne LI (dernière ligne de TS
Else 'sinon (au moins une occurrence est trouvée)
    LI = R.Row - TS.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée mois la ligne des en-têtes de TS)
End If 'fin de la condition
TS.DataBodyRange(LI, 1).Value = Me.TextBox1.Value 'renvoie la valeur de la TextBox1 dans la donnée ligne LI colonne 1 de TS
TS.DataBodyRange(LI, 2).Value = Me.ListBox1.Value 'renvoie la valeur de la ListBox1 dans la donnée ligne LI colonne 2 de TS
'renvoie la valeur de la TextBox2 dans la donnée ligne LI colonne 3 de TS (en positif si crédit, en négatif si débit)
TS.DataBodyRange(LI, 3).Value = IIf(Me.ListBox1.Value = "Crédit", CDbl(Me.TextBox2.Value), -CDbl(Me.TextBox2.Value))
Unload Me 'vide et ferme l'UserForm en cours
UserForm1.Show 'affiche l'UserForm1
End Sub

Le fichier :

ThauThème un génie d'Excel !

C'est exactement se que je voulais pouvoir faire et c'est juste GENIAL!

Merci aussi pour toutes les explications d'avoir pris le temps de faire ça c'est vraiment super!

A Bientôt pour de nouvelles question de débutant VBA

Merci encore!

Juste une petite question encore est-ce possible que l'ajout des lignes tableau se fassent en haut du tableau (Sur la première ligne) car dans la formule actuel l'introduction d'une nouvelle ligne se fait en bas du tableau (Dernière ligne).

Private Sub CommandButton1_Click() 'bouton "VALIDER"
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)

Set R = TS.ListColumns(1).Range.Find("") 'définit la recherche R (Recherche du vide dans la colonne 1 de TS)
If R Is Nothing Or TS.ListRows.Count = 0 Then 'condition : si aunue occurrence n'est trouvée ou si TS ne contient pas encore de ligne
    TS.ListRows.Add 'ajoute une ligne à TS
    LI = TS.ListRows.Count 'définit la ligne LI (dernière ligne de TS
Else 'sinon (au moins une occurrence est trouvée)
    LI = R.Row - TS.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée mois la ligne des en-têtes de TS)
End If 'fin de la condition
TS.DataBodyRange(LI, 1).Value = Me.TextBox1.Value 'renvoie la valeur de la TextBox1 dans la donnée ligne LI colonne 1 de TS
TS.DataBodyRange(LI, 2).Value = Me.ListBox1.Value 'renvoie la valeur de la ListBox1 dans la donnée ligne LI colonne 2 de TS
'renvoie la valeur de la TextBox2 dans la donnée ligne LI colonne 3 de TS (en positif si crédit, en négatif si débit)
TS.DataBodyRange(LI, 3).Value = IIf(Me.ListBox1.Value = "Crédit", CDbl(Me.TextBox2.Value), -CDbl(Me.TextBox2.Value))
Unload Me 'vide et ferme l'UserForm en cours
UserForm1.Show 'affiche l'UserForm1
End Sub

Merci d'avance

Re,

Essai avec ce code :

Private Sub CommandButton1_Click() 'bouton "VALIDER"
TS.ListRows.Add (1)
TS.DataBodyRange(1, 1).Value = Me.TextBox1.Value 'renvoie la valeur de la TextBox1 dans la donnée ligne LI colonne 1 de TS
TS.DataBodyRange(1, 2).Value = Me.ListBox1.Value 'renvoie la valeur de la ListBox1 dans la donnée ligne LI colonne 2 de TS
'renvoie la valeur de la TextBox2 dans la donnée ligne LI colonne 3 de TS (en positif si crédit, en négatif si débit)
TS.DataBodyRange(1, 3).Value = IIf(Me.ListBox1.Value = "Crédit", CDbl(Me.TextBox2.Value), -CDbl(Me.TextBox2.Value))
Unload Me 'vide et ferme l'UserForm en cours
UserForm1.Show 'affiche l'UserForm1
End Sub

ça marche comme sur des roulettes merci pour tout

A Bientôt

Rechercher des sujets similaires à "userf pas accepter meme texte col mettre valeur neg"