VBA ajouter supprimer via deux listbox

Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je travail sur une feuille Excel
Voici mon problème.
Je voudrais le même fonctionnement que sur Word comme dans les options de la barre d'accès rapide
une combobox à gauche avec un listing et une listbox à droite vide
avec le bouton ajouter on envoi un à un des noms vers la droite
et a droite on supprime se que l'on ne veut plus.
Cordialement

3 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Caillot, bonjour le forum,

    En pièce jointe un exemple avec deux ListBoxes.
    Deux options :
    1- tu double-cliques sur un élément et il est déplacé dans l'autre ListBox (ainsi que dans le tableau Excel)
    2 - Tu sélectionnes un ou plusieurs élément (avec la touche [CTRL]) puis tu cliques sur la flèche. L'ensemble est déplacé dans l'autre ListBox (ainsi que dans le tableau Excel)

    https://www.cjoint.com/c/GCDnvQcUERc
    0
    1. Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
       
      Je te remercie grandement pour ta solution que j'ai pu adapter à mon fichier.
      Pour aller plus loin je voudrais que la listbox de droite se remette à zéro quand je ferme le userform
      es ce possible?
      0
      1. ThauTheme Messages postés 1564 Statut Membre 160 > Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
         
        Re,

        Rajoute ces lignes au code de l'Userform :

        Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'à la fermeture de l'UserForm
        Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
        
        If CloseMode <> 0 Then Exit Sub 'si la fermeture se fait autrement qu'en cliquant dans la croix, sort de la procédure
        If O.Range("B2").Value = "" Then Exit Sub 'si la cellue B2 est vide, sort de la procédure
        Set DEST = O.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellue de destination DEST
        O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Cut DEST 'copy les données de la colonne B et les colle dans DEST
        Application.CutCopyMode = False 'supprime le clignotement lié au copier/coller
        O.Range("A1:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A1"), xlAscending 'tri ascendant de la colonne A
        End Sub
        
        0
      2. Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   > ThauTheme Messages postés 1564 Statut Membre
         
        je l"ai inséré mais rien!!! je te donne le code de ma page peux voir pour moi?


        Private O As Worksheet 'déclare la variable O (Onglet)
        Private NE As Integer 'déclare la variable NE (Nombre d'Élément)
        Private Sub CmdMessagerie_Click()

        Dim Plage As Range, R As Range
        Dim ListeMails As String
        Set Plage = Range("E2:E65536").SpecialCells(xlCellTypeConstants, 2)
        For Each R In Plage
        ListeMails = ListeMails & IIf(Len(ListeMails) > 0, ";", "") & R.Offset(0, -1).Text
        Next R
        ActiveWorkbook.FollowHyperlink "mailto:" & ListeMails
        End Sub


        Private Sub CmdQuitterEmail_Click()
        Dim Rep As Integer

        Rep = MsgBox("Voulez-vous QUITTER le formulaire d'impression ?", vbYesNo + vbQuestion, "microsoft excel")
        If Rep = vbYes Then

        Unload UserForm4
        UserForm1.Show
        Else
        End If
        End Sub

        Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
        Set O = Worksheets("Feuil12") 'définit l'onglet O (à adapter à ton cas)
        If O.Range("A3").Value = "" Then
        Me.ListBoxListing.AddItem O.Range("A2").Value
        Else
        Me.ListBoxListing.List = O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Value 'alimente la ListBoxListing
        End If
        If O.Range("B3").Value = "" Then
        Me.ListBoxEnvoi.AddItem O.Range("B2").Value
        Else
        Me.ListBoxEnvoi.List = O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Value 'alimente la ListBoxEnvoi
        End If
        End Sub

        Private Sub ListBoxListing_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-Clic dans la ListBoxListing
        Label1_Click 'lance la procédure Click du Label1
        End Sub

        Private Sub ListBoxEnvoi_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-Clic dans la ListBoxEnvoi
        Label2_Click 'lance la procédure Click du Label2
        End Sub

        Private Sub Label1_Click() 'au clic su la flèche vers la droite
        Dim I As Integer 'déclare la variable I (Incrément)
        Dim J As Integer 'déclare la variable J (incrément)
        Dim KA As Integer 'déclare la variable KA (incrément Ajout)
        Dim KS As Integer 'déclare la variable KS (incrément Suppression)
        Dim TA() As Variant 'déclare la variable TA (Tableau des Ajouts)
        Dim TS() As Variant 'déclare la variable TS (Tableau des Suppressions)
        Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

        NE = Me.ListBoxListing.ListCount - 1 'défini le nombre d'élément NE
        KA = 1 'initialise la variable KA
        KS = 1 'initialise la variable KS
        For I = 0 To NE 'boucle sur tous les éléments de la ListBox1
        If Me.ListBoxListing.Selected(I) Then 'condition : si l'élément est sélectionné
        ReDim Preserve TA(1 To KA) 'redimensionne le tableau des ajouts
        TA(KA) = Me.ListBoxListing.List(I) 'récupère l'élément sélectionné dans le tableau TA
        KA = KA + 1 'incrémente KA (ajoute une ligne au tableau des ajouts TA)
        J = J + 1 'incrémente J (pour compter le nombre d'éléments sélectionnés)
        Else 'sinon (l'élément n'est pas sélectionné)
        ReDim Preserve TS(1 To KS) 'redimensionne le tableau des suppressions
        TS(KS) = Me.ListBoxListing.List(I) 'récupère l'élément non sélectionné dans le tableau TS
        KS = KS + 1 'incrémente KS (ajoute une ligne au tableau des suppressions TS)
        End If 'fin de la condition
        Next I 'prochain élément de la boucle
        Set DEST = O.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (première cellule vide de la colonne B)
        'si KA est supérieure à 1, renvoie dans DEST redimensionnée le tableau TA transposé
        If KA > 1 Then DEST.Resize(UBound(TA, 1), 1).Value = Application.Transpose(TA)
        If KS > 1 Then 'condition : si KS est supérieure à 1
        O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Clear 'efface les données de la colonne A
        O.Range("A2").Resize(UBound(TS, 1), 1).Value = Application.Transpose(TS) 'renvoie dans A2 redimensionnée le tableau TS transposé
        End If 'fin de la condition
        'si tous les éléments ont été sélectionnés,efface les données de la colonne A
        If J - 1 = NE Then O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Clear
        O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A2"), xlAscending 'tri ascendant de la colonne A
        O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Sort O.Range("B2"), xlAscending 'tri ascendant de la colonne B
        Unload Me 'vide et ferme l'userform en cour
        UserForm4.Show 'affiche l'UserForm1
        End Sub

        Private Sub Label2_Click() 'au clic su la flèche vers la gauche
        Dim I As Integer 'déclare la variable I (Incrément)
        Dim J As Integer 'déclare la variable J (incrément)
        Dim KA As Integer 'déclare la variable KA (incrément Ajout)
        Dim KS As Integer 'déclare la variable KS (incrément Suppression)
        Dim TA() As Variant 'déclare la variable TA (Tableau des Ajouts)
        Dim TS() As Variant 'déclare la variable TS (Tableau des Suppressions)
        Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

        NE = Me.ListBoxEnvoi.ListCount - 1 'défini le nombre d'élément NE
        KA = 1 'initialise la variable KA
        KS = 1 'initialise la variable KS
        For I = 0 To NE 'boucle sur tous les éléments de la ListBox2
        If Me.ListBoxEnvoi.Selected(I) Then 'condition : si l'élément est sélectionné
        ReDim Preserve TA(1 To KA) 'redimensionne le tableau des ajouts
        TA(KA) = Me.ListBoxEnvoi.List(I) 'récupère l'élément sélectionné dans le tableau TA
        KA = KA + 1 'incrémente KA (ajoute une ligne au tableau des ajouts TA)
        J = J + 1 'incrémente J (pour compter le nombre d'éléments sélectionnés)
        Else 'sinon (l'élément n'est pas sélectionné)
        ReDim Preserve TS(1 To KS) 'redimensionne le tableau des suppressions
        TS(KS) = Me.ListBoxEnvoi.List(I) 'récupère l'élément non sélectionné dans le tableau TS
        KS = KS + 1 'incrémente KS (ajoute une ligne au tableau des suppressions TS)
        End If 'fin de la condition
        Next I 'prochain élément de la boucle
        Set DEST = O.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (première cellule vide de la colonne A)
        'si KA est supérieure à 1, renvoie dans DEST redimensionnée le tableau TA transposé
        If KA > 1 Then DEST.Resize(UBound(TA, 1), 1).Value = Application.Transpose(TA)
        If KS > 1 Then 'condition : si KS est supérieure à 1
        O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Clear 'efface les données de la colonne B
        O.Range("B2").Resize(UBound(TS, 1), 1).Value = Application.Transpose(TS) 'renvoie dans B2 redimensionnée le tableau TS transposé
        End If 'fin de la condition
        'si tous les éléments ont été sélectionnés,efface les données de la colonne A
        If J - 1 = NE Then O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Clear
        O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A2"), xlAscending 'tri ascendant de la colonne A
        O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Sort O.Range("B2"), xlAscending 'tri ascendant de la colonne B
        Unload Me 'vide et ferme l'userform en cour
        UserForm4.Show 'affiche l'UserForm1
        End Sub
        0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour, Caillot, ThauTheme

    Un exemple avec 2 listbox en aller-retour par cliquer-glisser de la souris

    A partir d'une demo de @+thierry sur XLD

    https://mon-partage.fr/f/iqEbxOo5/

    0
    1. Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
       
      bonjour Michel,
      J'ai regardé la démo de Thierry elle fonctionne parfaitement mais je vais rester sur celle de ThauTheme car j'ai réussi à tout intégrer.
      Je voudrais faire une modif;
      Quand je ferme mon superforme avec la croix ça rissette mon formulaire c'est la méthode que je voulais sauf que je voudrais un bouton quitter et ne pas faire fonctionner la croix
      Cordialement

      je vous donne ma page de code

      Private O As Worksheet 'déclare la variable O (Onglet)
      Private NE As Integer 'déclare la variable NE (Nombre d'Élément)
      Private Sub CmdMessagerie_Click()

      Dim Plage As Range, R As Range
      Dim ListeMails As String
      Set Plage = Range("E2:E65536").SpecialCells(xlCellTypeConstants, 2)
      For Each R In Plage
      ListeMails = ListeMails & IIf(Len(ListeMails) > 0, ";", "") & R.Offset(0, -1).Text
      Next R
      ActiveWorkbook.FollowHyperlink "mailto:" & ListeMails
      End Sub

      Private Sub CmdQuitterEmail_Click()
      Dim Rep As Integer

      Rep = MsgBox("Voulez-vous QUITTER le formulaire d'impression ?", vbYesNo + vbQuestion, "microsoft excel")
      If Rep = vbYes Then

      Unload UserForm4
      UserForm1.Show
      Else
      End If
      End Sub
      Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'à la fermeture de l'UserForm
      Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

      If CloseMode <> 0 Then Exit Sub 'si la fermeture se fait autrement qu'en cliquant dans la croix, sort de la procédure
      If O.Range("B2").Value = "" Then Exit Sub 'si la cellue B2 est vide, sort de la procédure
      Set DEST = O.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellue de destination DEST
      O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Cut DEST 'copy les données de la colonne B et les colle dans DEST
      Application.CutCopyMode = False 'supprime le clignotement lié au copier/coller
      O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A2"), xlAscending 'tri ascendant de la colonne A
      End Sub




      Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
      Set O = Worksheets("Feuil12") 'définit l'onglet O (à adapter à ton cas)
      If O.Range("A3").Value = "" Then
      Me.ListBoxListing.AddItem O.Range("A2").Value
      Else
      Me.ListBoxListing.List = O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Value 'alimente la ListBoxListing
      End If
      If O.Range("B3").Value = "" Then
      Me.ListBoxEnvoi.AddItem O.Range("B2").Value
      Else
      Me.ListBoxEnvoi.List = O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Value 'alimente la ListBoxEnvoi
      End If
      End Sub

      Private Sub ListBoxListing_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-Clic dans la ListBoxListing
      Label1_Click 'lance la procédure Click du Label1
      End Sub

      Private Sub ListBoxEnvoi_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-Clic dans la ListBoxEnvoi
      Label2_Click 'lance la procédure Click du Label2
      End Sub

      Private Sub Label1_Click() 'au clic su la flèche vers la droite
      Dim I As Integer 'déclare la variable I (Incrément)
      Dim J As Integer 'déclare la variable J (incrément)
      Dim KA As Integer 'déclare la variable KA (incrément Ajout)
      Dim KS As Integer 'déclare la variable KS (incrément Suppression)
      Dim TA() As Variant 'déclare la variable TA (Tableau des Ajouts)
      Dim TS() As Variant 'déclare la variable TS (Tableau des Suppressions)
      Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

      NE = Me.ListBoxListing.ListCount - 1 'défini le nombre d'élément NE
      KA = 1 'initialise la variable KA
      KS = 1 'initialise la variable KS
      For I = 0 To NE 'boucle sur tous les éléments de la ListBox1
      If Me.ListBoxListing.Selected(I) Then 'condition : si l'élément est sélectionné
      ReDim Preserve TA(1 To KA) 'redimensionne le tableau des ajouts
      TA(KA) = Me.ListBoxListing.List(I) 'récupère l'élément sélectionné dans le tableau TA
      KA = KA + 1 'incrémente KA (ajoute une ligne au tableau des ajouts TA)
      J = J + 1 'incrémente J (pour compter le nombre d'éléments sélectionnés)
      Else 'sinon (l'élément n'est pas sélectionné)
      ReDim Preserve TS(1 To KS) 'redimensionne le tableau des suppressions
      TS(KS) = Me.ListBoxListing.List(I) 'récupère l'élément non sélectionné dans le tableau TS
      KS = KS + 1 'incrémente KS (ajoute une ligne au tableau des suppressions TS)
      End If 'fin de la condition
      Next I 'prochain élément de la boucle
      Set DEST = O.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (première cellule vide de la colonne B)
      'si KA est supérieure à 1, renvoie dans DEST redimensionnée le tableau TA transposé
      If KA > 1 Then DEST.Resize(UBound(TA, 1), 1).Value = Application.Transpose(TA)
      If KS > 1 Then 'condition : si KS est supérieure à 1
      O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Clear 'efface les données de la colonne A
      O.Range("A2").Resize(UBound(TS, 1), 1).Value = Application.Transpose(TS) 'renvoie dans A2 redimensionnée le tableau TS transposé
      End If 'fin de la condition
      'si tous les éléments ont été sélectionnés,efface les données de la colonne A
      If J - 1 = NE Then O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Clear
      O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A2"), xlAscending 'tri ascendant de la colonne A
      O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Sort O.Range("B2"), xlAscending 'tri ascendant de la colonne B
      Unload Me 'vide et ferme l'userform en cour
      UserForm4.Show 'affiche l'UserForm1
      End Sub

      Private Sub Label2_Click() 'au clic su la flèche vers la gauche
      Dim I As Integer 'déclare la variable I (Incrément)
      Dim J As Integer 'déclare la variable J (incrément)
      Dim KA As Integer 'déclare la variable KA (incrément Ajout)
      Dim KS As Integer 'déclare la variable KS (incrément Suppression)
      Dim TA() As Variant 'déclare la variable TA (Tableau des Ajouts)
      Dim TS() As Variant 'déclare la variable TS (Tableau des Suppressions)
      Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

      NE = Me.ListBoxEnvoi.ListCount - 1 'défini le nombre d'élément NE
      KA = 1 'initialise la variable KA
      KS = 1 'initialise la variable KS
      For I = 0 To NE 'boucle sur tous les éléments de la ListBox2
      If Me.ListBoxEnvoi.Selected(I) Then 'condition : si l'élément est sélectionné
      ReDim Preserve TA(1 To KA) 'redimensionne le tableau des ajouts
      TA(KA) = Me.ListBoxEnvoi.List(I) 'récupère l'élément sélectionné dans le tableau TA
      KA = KA + 1 'incrémente KA (ajoute une ligne au tableau des ajouts TA)
      J = J + 1 'incrémente J (pour compter le nombre d'éléments sélectionnés)
      Else 'sinon (l'élément n'est pas sélectionné)
      ReDim Preserve TS(1 To KS) 'redimensionne le tableau des suppressions
      TS(KS) = Me.ListBoxEnvoi.List(I) 'récupère l'élément non sélectionné dans le tableau TS
      KS = KS + 1 'incrémente KS (ajoute une ligne au tableau des suppressions TS)
      End If 'fin de la condition
      Next I 'prochain élément de la boucle
      Set DEST = O.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (première cellule vide de la colonne A)
      'si KA est supérieure à 1, renvoie dans DEST redimensionnée le tableau TA transposé
      If KA > 1 Then DEST.Resize(UBound(TA, 1), 1).Value = Application.Transpose(TA)
      If KS > 1 Then 'condition : si KS est supérieure à 1
      O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Clear 'efface les données de la colonne B
      O.Range("B2").Resize(UBound(TS, 1), 1).Value = Application.Transpose(TS) 'renvoie dans B2 redimensionnée le tableau TS transposé
      End If 'fin de la condition
      'si tous les éléments ont été sélectionnés,efface les données de la colonne A
      If J - 1 = NE Then O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Clear
      O.Range("A2:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row).Sort O.Range("A2"), xlAscending 'tri ascendant de la colonne A
      O.Range("B2:B" & O.Cells(Application.Rows.Count, "B").End(xlUp).Row).Sort O.Range("B2"), xlAscending 'tri ascendant de la colonne B
      Unload Me 'vide et ferme l'userform en cour
      UserForm4.Show 'affiche l'UserForm1
      End Sub
      0
    2. ThauTheme Messages postés 1564 Statut Membre 160 > Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour le fil, bonjour le forum,

      Arf ! @+Thierry ! Mon maître ! Un grand comme Michel d'ailleurs. Le bon vieux temps... D'ailleurs sans même avoir vu sa proposition je te la recommande.
      Mais si tu veux que je continue sur ton projet avec mon code, je préfère que tu envoies le fichier plutôt que le code seul. Regarde avec par exemple : http://
      0
    3. ThauTheme Messages postés 1564 Statut Membre 160 > ThauTheme Messages postés 1564 Statut Membre
       
      Re,

      À télécharger, la version 3 avec un bouton pour fermer l'UserForm :
      https://www.cjoint.com/c/GCEk6aKviSc

      Je me demande si c'est vraiment nécessaire de faire suivre les données du tableau puisqu'en fermant tout se remet dans la colonne A ?!...
      0
    4. Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   > ThauTheme Messages postés 1564 Statut Membre
       
      Re ThauThème

      Si je t'envoi mon fichier pourra tu m'aider sur plusieurs points car la se n'est qu'une parti de ma demande cela fait 1 ans que je travail dessus et je ne sais pas programmer du vba se n'est que de de la recopie de ligne avec mes propres modifications mais une fois terminé cela devrait être pratique pour les futurs utilisateurs si tu ai d'accord on devrait communiquer par E-mail
      0
    5. ThauTheme Messages postés 1564 Statut Membre 160 > Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,

      Je ne peux pas m'engager avec toi. Ce n'est pas dans l'étique d'un forum d'entraide. D'une part, tu risques de perdre des réponses bien plus pertinentes que les miennes, et surtout, je réponds au gré de mes humeurs et selon mes compétences...
      Mais, je jetterai un œil si tu daignes mettre un fichier en téléchargement avec des explications claires de tes problèmes.

      Tu ne dis rien de la version 3 que je t'ai proposée ? Ni tu réponds à la question posée...
      0
  3. Caillot76 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
     
    Re ThauThème
    Désoler du retard pour la réponse
    Tu as raison la version 3 fonctionne très bien et elle est vraiment abouti
    je vais l'utiliser.
    Je retourne vers toi des que je l'ai adapté.
    et merci encore pour ton aide presieuse.
    0