VBA ajouter supprimer via deux listbox
Caillot76
Messages postés
28
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 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
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
A voir également:
- VBA ajouter supprimer via deux listbox
- Supprimer rond bleu whatsapp - Guide
- Supprimer une page word - Guide
- Supprimer pub youtube - Accueil - Streaming
- Fichier impossible à supprimer - Guide
- Deux ecran pc - Guide
3 réponses
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
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
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/
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/
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
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
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://
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://
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 ?!...
À 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 ?!...
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
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
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...
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...
Pour aller plus loin je voudrais que la listbox de droite se remette à zéro quand je ferme le userform
es ce possible?
Rajoute ces lignes au code de l'Userform :
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