Bouton_Modifier_selectionner_listBox

Résolu

Bonjour,

Je voudrais modifier une donnée dans un tableau excel à partir d'une listBox ,je m'explique, 

quand je selectionne une donnée sur la listBox, les textbox se remplissent , je modifie une textbox et je clique sur le bouton modifier ( pour modifier ma donnée) mais ça se modifie pas, ( c'est la premiere donnée du tableau qui se modifie) ) je voudrais modifier la donnée selectionnée sur la listBox !

pourriez vous m'aider à ecrire le code !

ci joint mon code actuel

Merci infiniment

Private Sub b_modif_Click()

 Dim ligne As Integer
 
   If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") <> vbYes Then

ligne = ListBox7.ListIndex + 2

MsgBox ligne

Range("A" & ligne) = T_Id.Value
Range("B" & ligne) = T_Designation.Value
Range("C" & ligne) = T_Code.Value
Range("D" & ligne) = T_Stock_Min.Value
Range("E" & ligne) = T_Nvx_Emplt.Value
Range("F" & ligne) = T_Fournisseur.Value
Range("G" & ligne) = T_Stock_Reel.Value
Range("H" & ligne) = T_Stock_Max.Value
Range("I" & ligne) = T_Ancien_Emplt.Value
Range("J" & ligne) = T_Machine.Value
Range("K" & ligne) = ComboBox1.Value
Range("L" & ligne) = ComboBox2.Value
Range("M" & ligne) = ComboBox3.Value
Range("N" & ligne) = ComboBox4.Value
Range("O" & ligne) = ComboBox5.Value
 
End If

End Sub


Windows / Firefox 102.0

11 réponses

Résumé de la discussion

Le besoin est de modifier une donnée dans un tableau Excel à partir d'une ListBox, en remplissant des TextBox lors de la sélection afin d'éditer puis enregistrer la ligne choisie. La meilleure réponse propose d'utiliser l'événement ListBox7_Click pour copier les valeurs de la ligne sélectionnée dans les contrôles du formulaire, afin que l'utilisateur puisse modifier et valider les données. Le code montre comment affecter T_Id, T_Designation, T_Code et les autres champs à partir de ListBox7.Column et de ListBox7.ListIndex, puis de remplir les combobox correspondants. En pratique, cette synchronisation permet de sélectionner une ligne dans la liste, d'éditer les valeurs dans les TextBox, puis d'appliquer les modifications sur la ligne correspondante.

Bobot (l’IA à votre service)
  1. Contributeur

    bonjour,

    peux-tu également montrer le code qui réagit quand tu selectionnes une donnée sur la listBox?

    1. Bonjour yg_be

      voici le code quand je clique sur la listbox

      merci beaucoup pour tes aides

      Private Sub ListBox7_Click()
      
        Me.T_Id = Me.ListBox7.List(Me.ListBox7.ListIndex)
        Me.T_Designation.Value = Me.ListBox7.Column(1, Me.ListBox7.ListIndex)
        Me.T_Code.Value = Me.ListBox7.Column(2, Me.ListBox7.ListIndex)
        Me.T_Stock_Min.Value = Me.ListBox7.Column(3, Me.ListBox7.ListIndex)
        Me.T_Nvx_Emplt.Value = Me.ListBox7.Column(4, Me.ListBox7.ListIndex)
        Me.T_Fournisseur.Value = Me.ListBox7.Column(5, Me.ListBox7.ListIndex)
        Me.T_Stock_Reel.Value = Me.ListBox7.Column(6, Me.ListBox7.ListIndex)
        Me.T_Stock_Max.Value = Me.ListBox7.Column(7, Me.ListBox7.ListIndex)
        Me.T_Ancien_Emplt.Value = Me.ListBox7.Column(8, Me.ListBox7.ListIndex)
        Me.T_Machine.Value = Me.ListBox7.Column(9, Me.ListBox7.ListIndex)
        Me.ComboBox1.Value = Me.ListBox7.Column(10, Me.ListBox7.ListIndex)
        Me.ComboBox2.Value = Me.ListBox7.Column(11, Me.ListBox7.ListIndex)
        Me.ComboBox3.Value = Me.ListBox7.Column(12, Me.ListBox7.ListIndex)
        Me.ComboBox4.Value = Me.ListBox7.Column(13, Me.ListBox7.ListIndex)
        Me.ComboBox5.Value = Me.ListBox7.Column(14, Me.ListBox7.ListIndex)
      End Sub
      1. Contributeur

        bonjour,

        Je ne comprends pas pourquoi "ListBox7.ListIndex" ne contient plus la bonne valeur dans "b_modif_Click()".
        Moi, j'ajouterais un contrôle, pour mémoriser sa valeur.  Supposons que ce contrôle ajouté s'appelle ListX.

        Alors, dans "ListBox7_Click()", j'ajouterais:

        Me.ListX = Me.ListBox7.ListIndex

        Et dans "b_modif_Click", j'ajouterais:

        ligne=ListX
    2. Bonjour yg_be,

      j'ai mis ligne = ListBox7.ListIndex + 2, parce que mes données commence à partir de la deuxieme ligne du tableau.

      je voudrais savoir s'il te plait la ListX que tu as ajouté est de quel type ? ( j'ai pas trop compris pourquoi tu as mis "Me.")

      quand je rajoute dans ListBox7_Click()",

      Me.ListX = Me.ListBox7.ListIndex

      Et dans "b_modif_Click", j'ajouterais:

      ligne=ListX

      ça m'affiche l'erreur au dessus

      Merci beaucoup d'avance

      1. Contributeur

        As-tu ajouté un contrôle nommé ListX?

      • Private Sub b_modif_Click()
        
         Dim ligne As Integer
         
           If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") <> vbYes Then
        ligne = ListX.Value
        'ligne = ListBox7.ListIndex + 2
        
        MsgBox ligne
        
        Range("A" & ligne) = Me.T_Id.Value
        Range("B" & ligne) = Me.T_Designation.Value
        Range("C" & ligne) = Me.T_Code.Value
        Range("D" & ligne) = Me.T_Stock_Min.Value
        Range("E" & ligne) = Me.T_Nvx_Emplt.Value
        Range("F" & ligne) = Me.T_Fournisseur.Value
        Range("G" & ligne) = Me.T_Stock_Reel.Value
        Range("H" & ligne) = Me.T_Stock_Max.Value
        Range("I" & ligne) = Me.T_Ancien_Emplt.Value
        Range("J" & ligne) = Me.T_Machine.Value
        Range("K" & ligne) = Me.ComboBox1.Value
        Range("L" & ligne) = Me.ComboBox2.Value
        Range("M" & ligne) = Me.ComboBox3.Value
        Range("N" & ligne) = Me.ComboBox4.Value
        Range("O" & ligne) = Me.ComboBox5.Value
         
        End If
        
        End Sub
      Private Sub ListBox7_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      If T_Fournisseur.Value = "" And T_Designation.Value = "" Then
      MsgBox "Introduisez un nom SVP!!"
      Exit Sub
      End If
      If T_Designation.Value <> "" Then
       Set cel = Feuil2.Columns(1).Find(what:=ListBox7.Value, LookIn:=xlValues, lookat:=xlWhole)
       If Not cel Is Nothing Then
       Me.SpinButton2 = cel.Row
       End If
       End If
      btncreer.Enabled = False
      End Sub
      
      Private Sub ListBox7_Click()
        Me.ListX = Me.ListBox7.ListIndex
        Me.T_Id = Me.ListBox7.List(Me.ListBox7.ListIndex)
        Me.T_Designation.Value = Me.ListBox7.Column(1, Me.ListBox7.ListIndex)
        Me.T_Code.Value = Me.ListBox7.Column(2, Me.ListBox7.ListIndex)
        Me.T_Stock_Min.Value = Me.ListBox7.Column(3, Me.ListBox7.ListIndex)
        Me.T_Nvx_Emplt.Value = Me.ListBox7.Column(4, Me.ListBox7.ListIndex)
        Me.T_Fournisseur.Value = Me.ListBox7.Column(5, Me.ListBox7.ListIndex)
        Me.T_Stock_Reel.Value = Me.ListBox7.Column(6, Me.ListBox7.ListIndex)
        Me.T_Stock_Max.Value = Me.ListBox7.Column(7, Me.ListBox7.ListIndex)
        Me.T_Ancien_Emplt.Value = Me.ListBox7.Column(8, Me.ListBox7.ListIndex)
        Me.T_Machine.Value = Me.ListBox7.Column(9, Me.ListBox7.ListIndex)
        Me.ComboBox1.Value = Me.ListBox7.Column(10, Me.ListBox7.ListIndex)
        Me.ComboBox2.Value = Me.ListBox7.Column(11, Me.ListBox7.ListIndex)
        Me.ComboBox3.Value = Me.ListBox7.Column(12, Me.ListBox7.ListIndex)
        Me.ComboBox4.Value = Me.ListBox7.Column(13, Me.ListBox7.ListIndex)
        Me.ComboBox5.Value = Me.ListBox7.Column(14, Me.ListBox7.ListIndex)
      End Sub

      Bonjour ,

      j'ai ajouté un textbox au userform, je l'ai nommée ListX,  ci joint mes deux codes du bouton modifier et du listbox. ainsi que la simulation.

      la listX qui entouré en bleu , elle affiche le numero de la ligne dans la listbox ( la ligne dans la listbox n'est pas la ligne sur le tableau excel !)  et dans donc je peux pas affecter la valeur de la listX à la variable ligne du code de mon bouton modifier !

      Merci beaucoup d'avance

      1. Je pense je vais utiliser la meme astuce que tu m'as montré sur ( le bouton supprimé ) tester les Id si sont egeaux et puis modifier à la place de supprimer , ça me une  parait bonne astuce

        1. Private Sub b_modif_Click()
          
           Dim ligne As Integer
           Dim i As Long, suppression As String, present As String
           
             If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") <> vbYes Then
             With ThisWorkbook.Sheets("Electrique")
              For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
               present = .Range("A" & i).Value
              If present = Me.T_Id.Value Then
              
          Range("A" & ligne) = Me.T_Id.Value
          Range("B" & ligne) = Me.T_Designation.Value
          Range("C" & ligne) = Me.T_Code.Value
          Range("D" & ligne) = Me.T_Stock_Min.Value
          Range("E" & ligne) = Me.T_Nvx_Emplt.Value
          Range("F" & ligne) = Me.T_Fournisseur.Value
          Range("G" & ligne) = Me.T_Stock_Reel.Value
          Range("H" & ligne) = Me.T_Stock_Max.Value
          Range("I" & ligne) = Me.T_Ancien_Emplt.Value
          Range("J" & ligne) = Me.T_Machine.Value
          Range("K" & ligne) = Me.ComboBox1.Value
          Range("L" & ligne) = Me.ComboBox2.Value
          Range("M" & ligne) = Me.ComboBox3.Value
          Range("N" & ligne) = Me.ComboBox4.Value
          Range("O" & ligne) = Me.ComboBox5.Value
          
          End If
          End With
           Next i
           End If
          End Sub

          je pense que ce code doit passer ! par contre je compile , àa m'affiche :

          end with sans with

          end if sans bloc if ...

          je comprend pas l'erreur

          merci beaucoup d'avance

        2. Contributeur
          @zouzou

          Il faut d'abord clôturer le dernier element ouvert.
          Puisque le code commence par 

          •  If ,
          • With, 
          • For, 
          • If,

          il doit se terminer par 

          • end if
          • next
          • end with
          • end if

          Par ailleurs, tu utilises deux variables, i et ligne, alors qu'une seule est suffisante.

      2. Merci beaucoup yg_be ,

        je partage avec toi mon code qui deverait marchait normalement, c'est la meme astuce que j'ai fait sur le bouton supprimé ! à ton avis pourquoi ça modifie pas la selection et ne montre aucune erreur ! le code est correct .

        je te remercie beaucoup d'avance

        Private Sub b_modif_Click()
        
        
         Dim i As Long, modification As String, present As String
         
           If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") <> vbYes Then
           With ThisWorkbook.Sheets("Electrique")
            For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
             present = .Range("A" & i).Value
             modification = Me.T_Id.Value
            If present = modification Then
            modification = modification + 1
            
        Range("A" & modification) = Me.T_Id.Value
        Range("B" & modification) = Me.T_Designation.Value
        Range("C" & modification) = Me.T_Code.Value
        Range("D" & modification) = Me.T_Stock_Min.Value
        Range("E" & modification) = Me.T_Nvx_Emplt.Value
        Range("F" & modification) = Me.T_Fournisseur.Value
        Range("G" & modification) = Me.T_Stock_Reel.Value
        Range("H" & modification) = Me.T_Stock_Max.Value
        Range("I" & modification) = Me.T_Ancien_Emplt.Value
        Range("J" & modification) = Me.T_Machine.Value
        Range("K" & modification) = Me.ComboBox1.Value
        Range("L" & modification) = Me.ComboBox2.Value
        Range("M" & modification) = Me.ComboBox3.Value
        Range("N" & modification) = Me.ComboBox4.Value
        Range("O" & modification) = Me.ComboBox5.Value
        
        End If
         Next i
         End With
         End If
        End Sub

        :

        1. Contributeur

          peut-être:

              For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
                  If .Range("A" & i).Value = Me.T_Id.Value Then
                      .Range("B" & i) = Me.T_Designation.Value
                      ' ...
      3. Je te remercie pour la proposition , je l'ai testé , il est correcte mais il donne rien comme resultat !

        Private Sub b_modif_Click()
        
        
         Dim i As Long, modification As String, present As String
         
           If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") <> vbYes Then
           With ThisWorkbook.Sheets("Electrique")
            For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
             If .Range("A" & i).Value = Me.T_Id.Value Then
        .Range("B" & i) = Me.T_Designation.Value
        .Range("C" & i) = Me.T_Code.Value
        .Range("D" & i) = Me.T_Stock_Min.Value
        .Range("E" & i) = Me.T_Nvx_Emplt.Value
        .Range("F" & i) = Me.T_Fournisseur.Value
        .Range("G" & i) = Me.T_Stock_Reel.Value
        .Range("H" & i) = Me.T_Stock_Max.Value
        .Range("I" & i) = Me.T_Ancien_Emplt.Value
        .Range("J" & i) = Me.T_Machine.Value
        .Range("K" & i) = Me.ComboBox1.Value
        .Range("L" & i) = Me.ComboBox2.Value
        .Range("M" & i) = Me.ComboBox3.Value
        .Range("N" & i) = Me.ComboBox4.Value
        .Range("O" & i) = Me.ComboBox5.Value
           '  present = .Range("A" & i).Value
           '  modification = Me.T_Id.Value
           ' If present = modification Then
           ' modification = modification + 1
            
        'Range("A" & modification) = Me.T_Id.Value
        'Range("B" & modification) = Me.T_Designation.Value
        End If
         Next i
         End With
         End If
        End Sub
        1. @yg_be

          Bonjour yg_be,

          le msgBox aprés le if ne marche pas et avant le if marche

          Private Sub b_modif_Click()
          
           Dim i As Long, modif As String, present As String
              If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Confirmation de modification") = vbYes Then
             
              
             With ThisWorkbook.Sheets("Electrique")
             For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
              If .Range("A" & i).Value = Me.T_Id.Value Then
               MsgBox ("modification confirmée")
        2. Contributeur
          @mzouali

          peut-être ajouter avant le premier "end if"

          else
              msgbox .Range("A" & i).Value & "|" & Me.T_Id.Value

          Cela devrait montrer les valeurs comparées, et confirmer qu'elles sont différentes.

        3. @yg_be

          oui effectivement, elles sont differentes

          voici le resultat en boucle 9|1 puis 8|1  7|1   6|1    5|1    4|1   3|1   2|1    1|1 :

        4. Contributeur
          @mzouali

          Bizarre que 1|1 soit aussi différent...

      4. Bonjour,

        je reviens vers pour resoudre le meme problme du bouton modifier, j'avais un deplacement qui m'a enmeché d'avancer.

        resultat : quand les deux valeurs Range("A" & i).Value et Me.T_Id.Value sont egaux il continue à comparer sans modifier la valeur de la cellule !

        Private Sub b_modif_Click()
        
         Dim i As Long, modification As String, present As String
        
            
           With ThisWorkbook.Sheets("Electrique")
            For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
                If Range("A" & i).Value = Me.T_Id.Value Then
          MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value
          Range("B" & i) = Me.T_Designation.Value
               Else
            MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value
            
        
        End If
         Next i
         End With
         'End If
        End Sub

        elle passe sur l'egalité et il continue à comprarer

        jusqu'à monté tout en haut

        avez une idée sur comment modifier un contenu de celulle

        je vous remercie d'avance

        1. Contributeur

          le plus intéressant, c'est que tu as réussi à faire deux msgbox qui ne te permettent pas de différencier les deux conditions.

      5. je te remercie pour tes remarques, j'ai garder que le 1er msgBox et j'ai rien ne s'affiche

           With ThisWorkbook.Sheets("Electrique")
            For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
                If Range("A" & i).Value = Me.T_Id.Value Then
          MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value
          Range("B" & i) = Me.T_Designation.Value
               Else
            'MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value
        1. Contributeur

          essaie plutôt:

          If Range("A" & i).Value = Me.T_Id.Value Then
            MsgBox   .Range("A" & i).Value & " = " & Me.T_Id.Value
            Range("B" & i) = Me.T_Designation.Value
          Else
            MsgBox   .Range("A" & i).Value & " <> " & Me.T_Id.Value
      6. ça donne le meme resultat :

        il continue à comparer jusqu'à comprarer tous le tableau ...

        1. Contributeur

          Je pense que la solution est en #21.

      7. Bonjour yg_be

        vous voulez dire quoi par #21 ?

        enfin j'ai reussi à modifier le tableau en passant par un bouton modifier :

        voici le code :

           
        With ThisWorkbook.Sheets("Electrique")  ' je definie la feuille où je travail 
            For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1  'une boucle qui traite toute les lignes de mon tableau.
            If Cells(i, 1) = Me.T_Id.Text Then    'comparaison de toute les lignes de ma premiere colonne  avec la valeur du textbox nommé " T_Id", si ils sont egaux alors il selectionne la cellule qui à coté du droite et il modifie la valeur de cette cellule par la valeur du T_Designation " textbox dont le userform" . 
        
            Cells(i, 1).Select
            Exit For
            End If
            Next i
            ActiveCell.Offset(0, 1) = Me.T_Designation.Value    ' modification 

        Je te remercie infiniment yr_be

        1. Contributeur

          #21, c'est la réponse faite le 27 juil. 2022 à 21:18.