XL 2016 Modification dans userform et sheet

  • Initiateur de la discussion Initiateur de la discussion KRUG WOO
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

KRUG WOO

XLDnaute Junior
Bonjour les amis,
Tout va bien pour vous? J'ai des gros problèmes sur mon userform.
J'ai un useform contenant plusieurs textbox à remplir, le bouton AJOUTER A NOUVEAU mis à jour les listes dans listbox de mon userform mais en même remplir mon sheet("JN"). Le bouton VALIDER: lorsque je clic une ligne dans mon listbox, les textbox se remplissent à nouveau et je peux modifier les textbox. Après que je modifie les textbox, je peux ensuite clic sur le bouton VALIDER et les données dans listbox changent ainsi que dans sheet("JN"). Le bouton SUPPRIMER: lorsque je clic une ligne dans mon listbox, je peux supprimer ce ligne dans listbox et aussi dans sheet("JN"). Voila les amis, j'ai la tête en l'air et boudé sur le code, j'arrive plus à voir plus claire. Merci de m'aider
 

Pièces jointes

Bonjour,
Dans votre USF, code Private Sub CommandButton2_Click() 'validation, vous pouvez déjà remplacer toutes les lignes qui précède la ligne Feuil1.Unprotect par ceci

VB:
Private Sub CommandButton2_Click() 'validation
Dim Lig As Integer
Dim ctrl As Control
 
For Each ctrl In Me.Controls
    If ctrl = vbNullString Then
       MsgBox "Saisie du " & Mid(ctrl.Name, 5) & " obligatoire", , "Saisie obligatoire": Me.Controls(ctrl.Name).SetFocus: Exit Sub
    End If
Next ctrl

Après il faudrait savoir quel est le bouton qui envoie sur la feuille parce que là on ne voit rien dans les codes
Ce que vous voulez faire c'est ajouter les nouvelles données dans la listbox puis les envoyer dans la feuille ou vous voulez envoyer les nouvelles données dans la feuille et que cela mette à jour la listbox ?
La deuxième solution parait mieux je pense
L'approche est différente d'où ma question

Crdlt
 
Dernière édition:
Bonjour

pourquoi recommencer de 0 ??

 
Bonjour

pourquoi recommencer de 0 ??

Bonjour vgendron, Oui cela semble identique, mais il y a des codes qui s'adaptent à autres choses et il y a des codes qui ne peuvent pas et là je suis bloqué et perdue et j'ai réfléchi que recommencer 0 peut aider. Enfin, je crois
 
hello

et bien non, ce n'est pas la bonne solution de reprendre à 0
ce post est intitulé "Modification dans Userform et feuille"

==> ca veut donc dire que tu veux pouvoir modifier une ligne de données dans le userform, et que ce soit enregistré dans la feuille ??

SAUF que la.. dans le fichier.. quand on lance le userform.. la listbox n'est meme pas remplie.. donc.. aucune chance de pouvoir modifier quoique ce soit.

dans l'autre post: la Listbox est remplie.. quand tu selectionnes une ligne, les textbox sont remplis..
il suffit de modifier et cliquer sur valider (ou je sais plus quel bouton), les modifications sont enregistrées sur la feuille..
donc à priori.. ca fait déjà ce que tu veux...

mais .. dans ce post.. on ne voit meme pas quelle est la question..?
 
Bonjour à tous,
@KRUG WOO
Voici une ébauche qui auras besoin d'être revue concernant la mise à jour du tableau.
J'initialise souvent les tableaux dans le module Factory. donc ici aussi.
Il faudrait ajouter la gestion des boutons de commande.
Bonsoir,
Merci Valtrase pour ton code et pour ton aide mais débogage insiste lorsque j'essaie de modifier les données dans listbox et textbox.
 
re,

@KRUG WOO --> Je rejoins ce que vgendron écrit.

Mais bon ici plus besoin de s'en occuper puisque Valtrase a fait tout le travail.

A voir si le demandeur va y piger quelque chose car il y avait moyen de faire plus simple.

Pour ma part, j'arrête de suivre ce fil

Cordialement
Bonsoir Dan,
Tu arrête de suivre le fil 😀. Valtrase m'a donné une idée, je vous partage ici ce que j'ai trouvé. Mon code marche à part le bouton suppression. je vais essayer aussi de trouvé le code qui supprime le listbox et en même temps les données dans sheet. Voici le code que j'utilise et qui marche:

Private Sub CommandButton_Ajouter_Click()
'Nouveau nom

Me.ListBox1.ListIndex = -1
Call efface
End Sub

Sub efface()
Me.TextClient = ""
Me.TextAgent = ""
Me.TextPays = ""
Me.TextDate = ""
Me.TextDescription = ""
Me.TextPf = ""
Me.TextStatut = ""
Me.TextDossier = ""
Me.TextPlateforme = ""
Me.TextBQ = ""
Me.TextEUR = ""
Me.TextUSD = ""
Me.TextMGA = ""
Me.CommandButton_supprimer.Locked = True

End Sub

Private Sub CommandButton_supprimer_Click()
'Le code permet donc de supprimer une ligne de tableau dans une feuille Excel
'à partir des données sélectionnées dans une ListBox d'un UserForm.

Dim Lig&
If Me.ListBox1 = "" Then Exit Sub
Lig = Me.ListBox1.ListIndex + 1

If MsgBox("Confirmer la suppression de la ligne selectionnée", 292, "Suppression") = 6 Then

Feuil1.Unprotect
[tableau1].Rows(Lig).Delete
Me.ListBox1.List = [tableau1].Value
Call efface
Feuil1.Protect


End If
Me.ListBox1.ListIndex = -1

End Sub

With Feuil1
Me.CommandButton_supprimer.Locked = True
Me.ListBox1.ColumnWidths = "100;150;110;100;70;50;50;50;50;50;50;90;90;90"
Me.ListBox1.List = [tableau1].Value

End With
End Sub

Private Sub CommandButton1_Click() 'Fermer
Unload Me
End Sub

Private Sub CommandButton2_Click() 'validation
Dim Lig
Dim ctrl As Control
Dim ChampsObligatoires As Variant
Dim i As Integer

'SAISIE AVEC TEXTBOX A REMPLIR OBLIGATOIREMENT

' Liste des TextBox obligatoires (à adapter selon vos besoins)
ChampsObligatoires = Array("textClient", "textAgent", "textEUR")

For i = LBound(ChampsObligatoires) To UBound(ChampsObligatoires)

Set ctrl = Me.Controls(ChampsObligatoires(i))

If Not ctrl Is Nothing Then ' Vérifier que le contrôle existe bien
If Trim(ctrl.Value) = vbNullString Then ' Trim enlève les espaces vides
MsgBox "Saisie du " & Mid(ctrl.Name, 5) & " obligatoire", , "Saisie obligatoire"
ctrl.SetFocus
Exit Sub ' Stoppe la vérification dès qu'un champ est vide
End If
Else
MsgBox "Erreur : Le champ '" & ChampsObligatoires(i) & "' n'existe pas sur le formulaire.", vbExclamation, "Erreur"
End If
Next i


Feuil1.Unprotect
With [tableau1].ListObject
If Me.ListBox1.ListIndex = -1 Then
Set Lig = .ListRows.Add: Lig = Lig.Index
Else
Lig = Me.ListBox1.ListIndex + 1
End If

.ListColumns("Client").DataBodyRange(Lig) = Me.TextClient.Value
.ListColumns("Agent").DataBodyRange(Lig) = Me.TextAgent.Value
.ListColumns("Pays").DataBodyRange(Lig) = Me.TextPays.Value
.ListColumns("Date").DataBodyRange(Lig) = Me.TextDate.Value
.ListColumns("Description").DataBodyRange(Lig) = Me.TextDescription.Value
.ListColumns("PF").DataBodyRange(Lig) = Me.TextPf.Value
.ListColumns("Statut").DataBodyRange(Lig) = Me.TextStatut.Value
.ListColumns("N°Dossier").DataBodyRange(Lig) = Me.TextDossier.Value
.ListColumns("Plateforme").DataBodyRange(Lig) = Me.TextPlateforme.Value
.ListColumns("BQ").DataBodyRange(Lig) = Me.TextBQ.Value
.ListColumns("Montant EUR").DataBodyRange(Lig) = Me.TextEUR.Value
.ListColumns("Montant USD").DataBodyRange(Lig) = Me.TextUSD.Value
.ListColumns("Montant MGA").DataBodyRange(Lig) = Me.TextMGA.Value

End With
Me.ListBox1.List = [tableau1].Value
Feuil1.Protect

End Sub

Private Sub ListBox1_Click()
If Me.ListBox1.ListIndex = -1 Then Exit Sub ' Vérifie qu'une ligne est bien sélectionnée

Me.TextClient = Me.ListBox1.Column(0)
Me.TextAgent = Me.ListBox1.Column(1)
Me.TextPays = Me.ListBox1.Column(2)
Me.TextDate = Me.ListBox1.Column(3)
Me.TextDescription = Me.ListBox1.Column(4)
Me.TextPf = Me.ListBox1.Column(5)
Me.TextStatut = Me.ListBox1.Column(6)
Me.TextDossier = Me.ListBox1.Column(7)
Me.TextPlateforme = Me.ListBox1.Column(8)
Me.TextBQ = Me.ListBox1.Column(9)
Me.TextEUR = Me.ListBox1.Column(10)
Me.TextUSD = Me.ListBox1.Column(11)
Me.TextMGA = Me.ListBox1.Column(12)

Me.CommandButton_supprimer.Locked = False
End Sub

Private Sub UserForm_Initialize()
Dim TabTS As Variant
Dim ws As Worksheet
Dim lo As ListObject

' Assurez-vous de référencer la bonne feuille et le bon tableau
Set ws = ThisWorkbook.Sheets("JN") ' Vérifiez que c'est bien la bonne feuille
Set lo = ws.ListObjects(1) ' Vérifiez que c'est bien le bon tableau

' Vérification si le tableau contient des données
If lo.DataBodyRange Is Nothing Then Exit Sub ' Si pas de données, on quitte

' Charger les données du tableau dans un tableau VBA
TabTS = lo.DataBodyRange.Value

' Définir le nombre de colonnes dans la ListBox
Me.ListBox1.ColumnCount = lo.ListColumns.Count

' Charger les données dans la ListBox
Me.ListBox1.List = TabTS
End Sub
 
Bonsoir
Bonsoir Dan,
Tu arrête de suivre le fil 😀
Effectivement je ne voyais pas d'intérêt vu la proposition de Valtrase
Vu que vous me citez et vos codes placés dans votre dernier post, si cela peut être utile le code Efface pourrait plutôt être plus court:

VB:
Sub efface()
Dim Ctrl As Control

For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then Ctrl.Text = vbNullString
Next
Me.CommandButton_supprimer.Locked = True
End Sub

Pour votre listbox, essayez --> Listbox1.clear

Pour le reste, je n'ai pas l'impression que vous avez repris ce que Valtrase vous a proposé ...

Crdlt
 
Bonjour à tous,
@KRUG WOO
Merci de mettre vos exemple de code entre balise </>
VB:
        [tableau1].Rows(Lig).Delete
        Me.ListBox1.List = [tableau1].Value
Comment peut-on voir encore une telle programmation ? A vouloir croire faire plus court vous obligez Excel à faire des recherches inutiles.
Voir ce sujet : Notation raccourcie d'une plage, une fausse bonne idée!
De plus utiliser un Pattern Factory vous facilitera la tache si vous renommer le tableau, vous n'aurez pas tout le code à vous peller.
Code:
    For i = LBound(ChampsObligatoires) To UBound(ChampsObligatoires)

        Set ctrl = Me.Controls(ChampsObligatoires(i))

        If Not ctrl Is Nothing Then              ' Vérifier que le contrôle existe bien
            If Trim(ctrl.Value) = vbNullString Then ' Trim enlève les espaces vides
                MsgBox "Saisie du " & Mid(ctrl.Name, 5) & " obligatoire", , "Saisie obligatoire"
                ctrl.SetFocus
                Exit Sub                         ' Stoppe la vérification dès qu'un champ est vide
            End If
        Else
            MsgBox "Erreur : Le champ '" & ChampsObligatoires(i) & "' n'existe pas sur le formulaire.", vbExclamation, "Erreur"
        End If
    Next i
Dans le code ci-dessus la boite de message est inclue dans la boucle, si les trois champs sont vide, l'utilisateur va devoir cliquer trois fois, il n'y a rien de plus exacerbant.
Le test des champs obligatoires devrait être une fonction, vous devez créer de petites fonctions qui n'ont qu'une tache à effectuer.
Code:
    With [tableau1].ListObject
        If Me.ListBox1.ListIndex = -1 Then
            Set Lig = .ListRows.Add: Lig = Lig.Index
        Else
            Lig = Me.ListBox1.ListIndex + 1
        End If
Dans ce code vous voulez faire quoi sur cette ligne : Set Lig = .ListRows.Add: Lig = Lig.Index ?
De plus si lig avait était correctement déclarée : Dim lig As Excel.ListRow une erreur serait remontée.
Si vous déclarer lig en Excel.listRow et que vous ajouter une ligne :
Code:
Set Lig = .ListRows.Add
Cette programation n'est pas bonne :
Code:
.ListColumns("Client").DataBodyRange(Lig) = TextClient.Value
.ListColumns("Agent").DataBodyRange(Lig) = TextAgent.Value
'...
'...
Vous devez travailler avec la nouvelle ligne :
Code:
        With Lig
            .Range(.Parent.ListColumns("Client").Index).Value = TextClient.Value
            .Range(.Parent.ListColumns("Agent").Index).Value = TextAgent.Value
            '...
            '...
        End With
Et pour finir :
Code:
Private Sub UserForm_Initialize()
    Dim TabTS As Variant
    Dim ws As Worksheet
    Dim lo As ListObject

    ' Assurez-vous de référencer la bonne feuille et le bon tableau
    Set ws = ThisWorkbook.Sheets("JN")           ' Vérifiez que c'est bien la bonne feuille
    Set lo = ws.ListObjects(1)                   ' Vérifiez que c'est bien le bon tableau

    ' Vérification si le tableau contient des données
    If lo.DataBodyRange Is Nothing Then Exit Sub ' Si pas de données, on quitte

    ' Charger les données du tableau dans un tableau VBA
    TabTS = lo.DataBodyRange.Value

    ' Définir le nombre de colonnes dans la ListBox
    ListBox1.ColumnCount = lo.ListColumns.Count

    ' Charger les données dans la ListBox
    ListBox1.List = TabTS
End Sub
Dans ce code la vérification du DataBodyrange devrait être une fonction.
Si Set lo = ws.ListObjects(1) renvoie Nothing (Si le tableau n'existe pas) alors : If lo.DataBodyRange Is Nothing Then Exit Sub renverra une erreur.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
16
Affichages
812
Retour