IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Drag and Drop entre 2 ListBox Multicolonnes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    841
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 841
    Par défaut Drag and Drop entre 2 ListBox Multicolonnes
    Bonsoir le forum,

    Dans un UserForm j'ai 2 Listbox, j'effectue un glisser déplacer entre les 2.

    Jusqu'ici ça va, pas de souci.

    En revanche là où ça se complique, c'est que mes ListBox sont multicolonnes et je n'arrive pas à glisser déplacer l'ensemble de la ligne.

    Bien sûr si je crée un premier Tableau1 de 2 colonnes et un deuxième Tableau2 d'une colonne qui contient la concaténation des 2 colonnes du Tableau1 et que j'alimente la ListBox1 avec le Tableau1, ça peut-être une solution.

    Existe-t-il une autre méthode qui permet d'éviter cette astuce.

    Merci par avance pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Salut,

    Avec un listbox multicolumn, la propriété ListIndex te donne l'index de la ligne sélectionnée, tu peux l'utiliser pour transmettre:
    1) Soit l'intégralité des des données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub MyListBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim DataObject As msforms.DataObject
     
        If Button = xlPrimaryButton Then
            With MyListBox
                If (.ListIndex >= 0) Then
                        '// construit une chaîne JSON avec l'intégralité des données
                    Dim Json As String
                    Json = "{"
     
                    Dim i As Long
                    For i = 0 To .ColumnCount - 1
                        Json = Json & """Column" & i & """: "
                        Json = Json & """" & .List(.ListIndex, i) & """"
                        If (i < (.ColumnCount - 1)) Then
                            Json = Json & ", "
                        End If
                    Next
                    Json = Json & "}"
                    Set DataObject = New msforms.DataObject
                    DataObject.SetText Json
                    DataObject.StartDrag fmDropEffectMove
                End If
            End With
        End If
    End Sub
    2) Soit le minimum vital, a charge du contrôle ciblé de reconstruire les données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub MyListBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim DataObject As msforms.DataObject
     
        If Button = xlPrimaryButton Then
            With MyListBox
                If (.ListIndex >= 0) Then
                        '// construit une chaîne JSON le minimum vital (la propriété ListIndex)
                    Dim Json As String
                    Json = "{""Index"" : " & .ListIndex & "}"
                    Set DataObject = New msforms.DataObject
                    DataObject.SetText Json
                    DataObject.StartDrag
                End If
            End With
        End If
    End Sub
    Les exemples passent par une chaîne Json pour représenter les données, ce n'est pas obligatoire, fait ce qui te convient le mieux.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    841
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 841
    Par défaut
    Bonjour deedolith,

    J'ai intégré vos 2 solutions de code dans l'UserForm qui contient 2 ListBox de 2 colonnes mais lors du Drag and Trop il se passe rien dans la deuxième ListBox ??

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Faute de code, ca va être difficile de t'aider.

    De plus, je n'ai donné que des exemples, en aucun cas tu ne dois les copier / coller sans réfléchir, mais les adapter à ton cas particulier dont, au vue des informations que tu nous as donné, on ne sais pas grand chose.

    Si je reformule la question que tu as posé: "Comment connaitre les données du contrôle source ?"
    La réponse est: "Via la propriété ListIndex".
    Le mode de transmission (encodeage / décodage) est complètement à ton initiative.

    Visiblement, tu sais déjà comment implémenter du drag & drop, traiter les données sur les évènements du contrôle cible ne devrait pas te poser de problème.
    S'il te faut un parser Json, j'en ai un en beta-test sur mon GitHub: https://github.com/Deedolith/JSON-VBA

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement, je n'ai aucun problème pour délacer plusieurs colonnes d'un ListBox à l'autre mais j'utilise des CommandButton
    Sans publier le code que vous utilisez avec succès sur une liste à une colonne, on ne pourra pas vous aider.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    841
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 841
    Par défaut
    Bonsoir P. TULLIEZ, deedolith,

    Voici le code de mon UserForm sur la base du lien https://learn.microsoft.com/en-us/of...t-methods-exam
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub UserForm_Initialize()
        Me.ListBox1.List = Range("Tableau1").Value
    End Sub
     
    Private Sub ListBox2_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, _
        ByVal X As Single, ByVal Y As Single, ByVal DragState As Long, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
        Cancel = True
        Effect = 1
    End Sub
     
    Private Sub ListBox2_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As Long, ByVal _
        Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
        Cancel = True
        Effect = 1
        ListBox2.AddItem Data.GetText
    End Sub
     
    Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim MyDataObject As DataObject
        If Button = 1 Then
            Set MyDataObject = New DataObject
            Dim Effect As Integer
            MyDataObject.SetText ListBox1.Value
            Effect = MyDataObject.StartDrag
        End If
    End Sub
    Ma première ListBox1 contient de 2 colonnes et comme je l'explique dans mes précédents messages je souhaiterai faire un Drag and Drop dans la ListBox2 de la ligne complète.

    Avec mon code le Drag and Drop dans la ListBox2 ne copie que la première colonne du tableau structuré.

Discussions similaires

  1. [XL-2010] Aide sur Drag and drop entre x ListBox
    Par jacky72 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2014, 23h32
  2. [VBA-E]drag and drop entre deux listbox
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/06/2012, 14h37
  3. Drag and drop entre deux ListBox
    Par simoinfonet dans le forum Langage
    Réponses: 0
    Dernier message: 18/04/2008, 18h53
  4. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 01h10
  5. Drag and Drop entre listbox
    Par zwoke dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/07/2004, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo