Transférer une donnée de combobox1 vers combobox2 par clic droit et vice-versa

Toine45

XLDnaute Junior
Bonjour à tous
Avec mon classeur actif : Dans un userform, j'ai 2 combobox (CBX1 et CBX2)
j'ajoute une feuille déterminée (example "donnee") dans Combobox2 avec la méthode :
me.combobox2.additem "donnee"

Je crée la liste de toutes les feuilles du classeur dans Combobox1 avec la méthode :
for each ws in worksheets --- me.combobox1.additem ws.name --- next ws

Toujours dans combobox1, je retire la feuille déjà dans combobox 2 avec la méthode :
me.combobox1.remove "donnee".
Jusque là, tout va bien

Je désire maintenant, en cliquant avec le bouton droit de la souris, envoyer les nom des feuilles sur les quelles je clique (une par une), dans la combobox 2 et les supprimer de combobox1 (possibilité de tout transférer, sauf une)
et, à l'inverse, si je clique droit sur un mot de la combobox2, l'envoyer dans la combobox1, en le supprimant de CBX2.
Je n'ai rien trouver de probant pour le déplacement par clic droit, ni pour le transfert.
j'ai tenté à tout hasard, des trucs avec mouve to et mouve at sans succès.
Avez vous une solution à mon problème ?
Merci d'avance
Cordialement
Toine45
 

Toine45

XLDnaute Junior
Bonjour job75 et tous les autres Excelliens

Merci pour tes fichiers, je vais étudier ça de près
Je n'ai pas encore eu le temps de regarder le 2 ème fichier
mais le 1er correspond déjà tout à fait à ce que je recherchais
Je vais donc étudier le 2ème en priorité pour essayer d'adapter ça à mon Userform en cours de construction.

Merci beaucoup pour ton temps passé sur mon problème

Bon week-end
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Toine, bonjour le forum,

Ton problème est relativement simple. Il te faut utiliser les mêmes méthodes AddItem et RemoveItem sur la procédure Double-Clic (ou Clic) de chaque ComboBox (la procédure Clic-du-Bouton-Droit n'existe pas pour ces contrôles).
Mais, si tu as utilisé l'alimentation de la Combobox1 à l'initialisation de l'UserForm, à la prochaine ouverture, les modifications n'apparaîtront pas... Aussi, il est préférable pour ce genre d'action d'utiliser des ListBoxes qui, au niveau visuel, sont mieux adaptées. Le problème reste à identifier, à la réouverture de l'UserForm, les onglets qui seront stockés dans la ListBox1 et ceux qui seront stockés dans la ListBox2. Il y a plein de possibilités (renseigner une cellule de l'onglet, couleur de l'onglet, etc).
Dans le code ci-dessous j'ai choisi de masquer la dernière colonne de l'onglet pour être identifié par le code. un Double-Clic dans l'une, renvoie l'onglet dans l'autre et lycée de Versailles comme disait Béru...
Le contexte :
Une UserForm1 avec deux ListBoxes, ListBox1 et ListBox2.
Les onglet sont ordonnés à chaque changement....

Le code :
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim O As Worksheet 'déclare la variable O (Onglet)

Me.ListBox1.ColumnCount = 2 'définit le nombre de colonnes de la ListBox1
Me.ListBox1.ColumnWidths = ";0" 'masque la seconde colonne de la ListBox1
Me.ListBox2.ColumnCount = 2 'définit le nombre de colonnes de la ListBox2
Me.ListBox2.ColumnWidths = ";0" 'masque la seconde colonne de la ListBox2
For Each O In Worksheets 'boucles sur tous les onglets O du classeur
    If O.Columns(Application.Columns.Count).Hidden = False Then 'condition : si la dernière colonne de l'onglet O est cachée
        Me.ListBox1.AddItem O.Name 'ajoute l'onglet à la ListBox1 (colonne 0)
        Me.ListBox1.Column(1, Me.ListBox1.ListCount - 1) = O.Index 'ajoute l'index de l'onglet à la ListBox1 (colonne 1 masquée)
    Else 'sinon
        Me.ListBox2.AddItem O.Name 'ajoute l'onglet à la ListBox2 (colonne 0)
        Me.ListBox2.Column(1, Me.ListBox2.ListCount - 1) = O.Index 'ajoute l'index de l'onglet à la ListBox2 (colonne 1 masquée)
    End If 'fin de la condition
Next O 'prochai onglet de la liste
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans la ListBox1
Dim TMP0 As String 'déclare la variable TMP0 (TeMPoraire 0)
Dim TMP1 As Integer 'déclare la variable TMP1 (TeMPoraire 1)

If Me.ListBox1.ListCount = 1 Then Exit Sub 'si la ListBox1 ne contient qu'un seul élémnent, sort de la procédure
With Me.ListBox2 'prend en compte la ListBox2
    .AddItem Me.ListBox1.Value 'ajoute l'onglet double-cliqué (en colonne 0)
    .Column(1, .ListCount - 1) = Sheets(Me.ListBox1.Value).Index 'ajoute l'index de l'onglet double-cliqué (en colonne 1 masquée)
    If .ListCount > 1 Then 'condition 1 : si la ListBox2 contient plus d'un seul élément
        'tri des onglets
        For I = 0 To .ListCount - 1 'boucle 1 : sur tous les éléments (onglets) de la ListBox2
            For J = 0 To .ListCount - 1 'boucle 2 : sur tous les éléments (Onglets) de la ListBox2
                'condition 2 : si l'index de l'onglet de la boucle 1 est inférieur à l'index de l'onglet de la boucle 2
                If CInt(.Column(1, I)) < CInt(.Column(1, J)) Then
                    TMP0 = .Column(0, J) 'récupère dans la variable TMP0 le nom de l'onglet de la boucle 2
                    TMP1 = CInt(.Column(1, J)) 'récupère dans la variable TMP1 l'index de l'onglet de la boucle 2
                    .Column(0, J) = .Column(0, I) 'l'onglet J de la ListBox2 devient l'onglet I
                    .Column(1, J) = CInt(.Column(1, I)) 'lindex J de la ListBox2 devient l'index I
                    .Column(0, I) = TMP0 'l'onglet I de la ListBox2 devient TMP0
                    .Column(1, I) = TMP1 'l'index I de la ListBox2 devient TMP1
                End If 'fin de la condition 2
            Next J 'prochain onglet de la boucle 2
        Next I 'prochain onglet de la boucle 1
    End If 'fin de la condition 1
End With 'fin de la prise en compte de la ListBox2
'masque la dernière colonne de l'onglet double-cliqué
Worksheets(Me.ListBox1.Value).Columns(Application.Columns.Count).Hidden = True
Me.ListBox1.RemoveItem (Me.ListBox1.ListIndex) 'supprime l'onglet double-cliquée de la listbox1
End Sub

Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans la ListBox1
Dim TMP0 As String 'déclare la variable TMP0 (TeMPoraire 0)
Dim TMP1 As Integer 'déclare la variable TMP1 (TeMPoraire 1)

With Me.ListBox1 'prend en compte la ListBox1
    .AddItem Me.ListBox2.Value 'ajoute l'onglet double-cliqué (en colonne 0)
    .Column(1, .ListCount - 1) = Sheets(Me.ListBox2.Value).Index 'ajoute l'index de l'onglet double-cliqué (en colonne 1 masquée)
    If .ListCount > 1 Then 'condition 1 : si la ListBox1 contient plus d'un seul élément
        'tri des onglets
        For I = 0 To .ListCount - 1 'boucle 1 : sur tous les éléments (onglets) de la ListBox2
            For J = 0 To .ListCount - 1 'boucle 2 : sur tous les éléments (Onglets) de la ListBox2
                'condition 2 : si l'index de l'onglet de la boucle 1 est inférieur à l'index de l'onglet de la boucle 2
                If CInt(.Column(1, I)) < CInt(.Column(1, J)) Then
                    TMP0 = .Column(0, J) 'récupère dans la variable TMP0 le nom de l'onglet de la boucle 2
                    TMP1 = CInt(.Column(1, J)) 'récupère dans la variable TMP1 l'index de l'onglet de la boucle 2
                    .Column(0, J) = .Column(0, I) 'l'onglet J de la ListBox2 devient l'onglet I
                    .Column(1, J) = CInt(.Column(1, I)) 'lindex J de la ListBox2 devient l'index I
                    .Column(0, I) = TMP0 'l'onglet I de la ListBox2 devient TMP0
                    .Column(1, I) = TMP1 'l'index I de la ListBox2 devient TMP1
                End If 'fin de la condition 2
            Next J 'prochain onglet de la boucle 2
        Next I 'prochain onglet de la boucle 1
    End If 'fin de la condition 1
End With 'fin de la prise en compte de la ListBox2
'AFFICHEla dernière colonne de l'onglet double-cliqué
Worksheets(Me.ListBox2.Value).Columns(Application.Columns.Count).Hidden = False
Me.ListBox2.RemoveItem (Me.ListBox2.ListIndex) 'supprime l'onglet double-cliquée de la listbox2
End Sub

[Édition]
Bonjour Job, nos posts se sont croisés...
 

Toine45

XLDnaute Junior
Bonjour Robert
Merci de ton aide et merci également à Job75
Je vais essayer d'adapter ça à mon fichier pendant la semaine (week-end oblige)
En fait, c'est pour essayer de contourner un problème d'un autre post au-quel je n'ai pas eu de réponse concluante pour mon problème.
(https://www.excel-downloads.com/threads/choisir-une-feuille-par-combobox-dans-un-userform.20009505/)

Si je ne peux pas choisir une feuille voulue, par contre, je sais comment exclure une ou des feuilles. je vais donc essayer de tout exclure sauf une ou plusieurs feuilles,en me servant de ces transfert de données contenues dans la combobox 2 et les feuilles de la combobox1 seront donc les feuilles dans lesquelles effectuer la recherche. ... si j'arrive à mes fins c'est pas gagné, mais je suis têtu. (Comme un Beauceron...) Il me faudra bien la semaine pour y arriver (et oui..., rigolez pas, je suis loin d'avoir votre niveau.)

Merci donc à vous
et bonne fin de week-end
 

Si...

XLDnaute Barbatruc
Re

Un doubleclic c’est un clic suivi d’un clic non ?
Pour l’éviter, il ne faut pas avoir le doigt lourd et on peut encore régler le paramètre d’attente entre les 2.

Je n’ai pas jugé le tri utile. D’ailleurs quel critère prendre ?
Par exemple, l’ordre alphabétique n’est pas intéressant quand on a les noms de mois.

Ce n’était qu’un exemple et je n’ai même pas essayé d’adapter cela au fichier indiqué car j’évite de corriger des codes de traitement proposés par quelqu’un d’autre.
 

job75

XLDnaute Barbatruc
Bonjour Toine45, Robert, Si..., le forum,

Moi je reste sur les ComboBox puisque c'est le sujet de ce fil.

Avec un complément dans ce fichier (4) pour que la liste reste déroulée après le transfert.

A+
 

Pièces jointes

  • ComboBox Clic droit(4).xlsm
    33.7 KB · Affichages: 31

job75

XLDnaute Barbatruc
Re,

Si les noms des feuilles sont des mois il suffit d'adapter la macro Quick sort :
Code:
Sub tri(a, gauc, droi)     ' Quick sort
Dim ref As Date, g, d, temp
ref = CDate("1 " & a((gauc + droi) \ 2, 0))
g = gauc: d = droi
Do
    Do While CDate("1 " & a(g, 0)) < ref: g = g + 1: Loop
    Do While ref < CDate("1 " & a(d, 0)): d = d - 1: Loop
    If g <= d Then
      temp = a(g, 0): a(g, 0) = a(d, 0): a(d, 0) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Fichier (4 bis).

A+
 

Pièces jointes

  • ComboBox Clic droit(4 bis).xlsm
    41.9 KB · Affichages: 37

Discussions similaires

Statistiques des forums

Discussions
312 316
Messages
2 087 178
Membres
103 491
dernier inscrit
bilg1