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 :

[VBA-E] réaliser un glisser-déplacer dans une listbox [Trucs & Astuces]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut [VBA-E] réaliser un glisser-déplacer dans une listbox
    Je travaille actuellement avec deux listbox et je souhaite faire passer des informations de l'une a l'autre. Pour cela j'utilise deux boutons ajouter et retirer qui fonctionnent parfaitement. Je souhaite maintenant améliorer ce fonctionnement en utilisant des glisser-déplacer d'une liste à l'autre. cela marche avec la fonction listbox1_BeforeDropOrPaste et MouseMove et les add.item.

    Cependant le libellé selectionné est toujours rajouté a la fin de la liste (ce qui est logique avec additem).

    J'en arrive a ma demande : est t'il possible avec un glisser-déplacer d'inserer un item au milieu d'une liste ? ( sous windows par exemple on peut dans un dossier, déplacer les fichiers en les faisant glisser a la place souhaitée)

    Est t'il possible de forcer le numéro de list index par exemple pour modifier l'ordre des items?? (pour l'instant je n'ai pas trouvé)

    Si quelqu'un a une piste ou une solution je suis preneuse.
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    En effet j'avais deja vu cet exemple mais ne marche t'il pas uniquement sous vb6??

    Car sous vba je ne trouve pas les fonctions dragdrop et dragover, cependant j'ai before dragover et beforedroporpaste, je suppose qu'elles ont a peu près les meme fonctionnalités??


    Voici donc le code que j'utilise :
    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
    27
    28
    29
    30
    31
     
    Private Sub listbox1_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 listbox1_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
        Me.ListBox1.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 Me.ListBox1.Value
        Effect = MyDataObject.StartDrag
        Me.ListBox1.RemoveItem Me.ListBox1.ListIndex
      Else
        If Me.ListBox1.ListCount > 0 Then
          Me.ListBox1.ControlTipText = "Transfert <- possible par glisser-déplacer !"
        End If
      End If
    End Sub
    mais comme je le disais, ca me rajoute mon item en fin de liste

    je viens de vois ceci dans le code de la FAQ : List1.AddItem List2.List(List2.ListIndex) que je ne comprends pas trè bien que j'ai essayé en l'adaptant a mon programme sans changement.
    Moi je souhaiterais pouvoir rajouter mon item a l'emplacement pointé par ma souris...
    Est ce possible?
    merci d'avance

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par L'aide
    RemoveItem : Cette méthode supprime un ou plusieurs éléments d'une zone de liste ou d'une zone de liste modifiable.
    J'ai bien peur que tu ne sois contraint de reconstituer ta liste en repérant l'index de la donnée se trouvant sous le curseur de la souris.
    Juste une idée

    A+

    Edit
    Je viens de voir la fin de ton message qui donne un espoir...
    List1.AddItem List2.List(List2.ListIndex)
    Si cette syntaxe s'adapte à ton besoin, pour info, ListIndex correspond à l'index de la donnée pointé par ta souris. Mais pour le trouver, il lui faut un événement et je ne sais pas si List2_MouseMove est adapté. Peut-être bien qu'il faudra un MouseUp sur la donnée en dessous de l'endroit où tu veux insérer ta donnée... Tu vérifies.

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    9a vas avec les getX et Getx (api win32) mais le problèmes et de savoir si l'utilisateur lache ou non l'objet en cours de route.

    et là je recherche toujours un moyens de détecter les clicks hors programme.....
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    javance pas très vite, je n'arrive pas encore vraiment a bien exploiter MouseUp.

    J'aurais voulu savoir si l'on peut connaitre l'index d'un item sans qu'il soit sélectionné, le pointeur de la souris étant juste positionnée dessus?

    Car pour utiliser ListIndex il faut que l'item soit sélectionné, or dans mon cas j'ai deja un item selectionné (celui que je déplace) et je voudrais connaitre l'index de celui qui sera juste en dessous de mon curseur pour le nouvel emplacement...

    merci d'avance

  7. #7
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    pour l'instant j'ai contourné le problème : j'ai constaté que chacun de mes items avait une "épaisseur" de 9, (j'ai utilisé la valeur Y de la position du curseur de la souris), j'ai donc réalisé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub listbox1_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)
    Dim place As Integer
        Cancel = True
        Effect = 1
        MsgBox Y
        place = Int(Y / 9)
        MsgBox place
        Me.ListBox1.AddItem Data.GetText, place
    End Sub
    en intrégrant ca au reste du programme( que j'ai posté plus haut) jarrive donc a déplacer mes items en fonction de la position de la souris.
    Cependant je trouve cette solution pas très propre et bricolé car si la largeur de mes items change, la position ne sera plus bonne...

    Je garde cette solution en réserve, mais jamais quelqu'un a une solution plus propre et plus unviverselle, faites moi signe
    merci beaucoup

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    1) Je ne sais pas si VBA connait :
    les événements MouseDown et MouseUp et s'il gère l'objet Clipboard (presse-papier)... :
    parce que si oui ...
    2)
    or dans mon cas j'ai deja un item selectionné (celui que je déplace) et je voudrais connaitre l'index de celui qui sera juste en dessous de mon curseur pour le nouvel emplacement...
    ben ... il est facile de connaître l'index decelui qui est sélectionné et donc facile de connaitre cet index + 1 !...

  9. #9
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    vba_e gère les évenement mousDown et mouseUp par contre je n'ai pas l'impression qu'il connaisse l'objet clipboard. en revanche il connait l'objet Dataobject (qui a l'air d'offrir quelques possibilités similaires non?)



    ben ... il est facile de connaître l'index decelui qui est sélectionné et donc facile de connaitre cet index + 1 !...
    en effet, mais mon problème est que une fois mon item sélectionné, je souhaite le déplacer parfois de plusieurs places (a l'aide de glisser-déplacer) au nouvel endroit pointé par ma souris, je peux donc me retrouver avec un écart de plusieurs index qui n'est pas prévisible à l'avance... et c'est donc l'index pointé par ma souris qui m'intéresse afin de pouvoir positionner mon item sélectionné à ce nouvel emplacement

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Juste une indication sur clipboad, si ça peut aider... Tu dois déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function CloseClipboard Lib "user32" () As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Pour le vider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        OpenClipboard 0
        EmptyClipboard
        CloseClipboard
    A toi jemefe

    Psst - J'ai renoncé mais je suis...

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Alors (et à toi de nous montrer ta volonté de chercher à faire un peu) :
    Quand je presse (sans le relacher) le bouton gauche de la souris, se déclenche un événement MouseDown dont je profite pour mettre ce que je décide de mettre dans le presse-papier (relire Ouskel'n'or si tu n'as pas dans VBA l'objet clipboard).
    Je promène ma souris jusqu'où je veux, sans relacher mon bouton et, quand elle a atteint son but, je relâche le bouton, déclenchant ainsi l'évènement Mouse-up du contrôle où elle se trouve et profite de ce grand événement pour exécuter une autre instruction (par exemple celle d'utiliser ce que j'ai mis dans le presse-papier.
    A toi, maintenant, bandit !
    PS : quand tu auras passé cette 1ère étape, on pourra reparler de ton problème d'indexes

  12. #12
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Allez !
    Bonsoir !
    J'avais besoin de rire un peu, la veille du 1er avril !
    Passons quand même aux choses sérieuses :
    Tu n'as, ami Bandit, nul besoin d'utiliser le presse papier (ni clipboard, ni son substitut par API)
    Je te laisse réfléchir un tout petit peu et, si tu ne vois pas comment d'ici demain, tout seul, je reviendrai !

    EDIT : que personne ne "souffle" la solution à Bandit avant demain, SVP !

  13. #13
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    en effet, pas besoin d'api si c'est dans une eule listbox (je pensait que c'étais d'une listbox à l'autre).
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    que ce soit dans une seule litbox ou entre deux, voire n listboxes : kif kif !
    mais.... chut ....

  15. #15
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    non car si on veut gérer un évenement du type un petit label qui suis la souris indiquant qu'on fait un dropdown, c'est mieux que de devoir passer le relais à la frame puis à la seconde listbox.

    cependant, le problème reste le relachement intermédiaire.

    enfin, ce n'est pas vraiment le problme de notre ami.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  16. #16
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    ce n'est pas vraiment le problme de notre ami.
    en effet ! Pas du tout, même !
    Et il ne fera pas un dragdrop du tout, non plus ! !!!

  17. #17
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Et alors ?
    Où est passé notre bandit ?
    Plus là ?
    C'est dommage car, de mon côté, j'ai "travaillé"... et je sais que d'autres sont intéressés !...
    Qui relance donc à la place de Bandit ?
    Méphisto ? :

  18. #18
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Désolé d'avoir mis si longtemps a répondre mais le week end étant passé, me revoila!
    Cependant pas très fier car je n'ai toujours pas trouvé de solution me convenant parfaitement... J'avoue que vendredi je me suis perdu dans toutes vos pistes mais au moins j'ai appris des trucs

    Maintenant je suis toute ouie pour vos solutions ou vos conseils


    Et merci de vous etre intéressé a mon problème

  19. #19
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Là, c'est moi qui vais devoir m'absenter pour environ 2 heures ...
    Ce que tu peux faire en attendant :
    un petit projet acomposé d'une Form contenant :
    une textbox nommée depart avec propriété multiline = true
    une textbox nommée arrivee avec propriété multiline = true
    un tout petit cadre nommé copie - propriété invisible = true
    voilà, nous verrons à mon retour quel code va permettre de faire un glisser-déposer d'une textbox vers l'autre.
    Une fois franchie cette étape, nous passerons au cas de listboxes...
    A bientôt

  20. #20
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    ok tout est en place, j'attends ton retour avec impatience
    pret a écouter et a apprendre !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/05/2014, 10h43
  2. [VBa-E] Object Ole "image bitmap" dans une Userform?
    Par gootsu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/07/2006, 14h24
  3. [VBA-E]Comment faire pour écrire dans une page excel existante ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 13h54
  4. [VBA][OLE] insertion d'un graph dans une diapo Powerpoin
    Par Nexussmb dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/10/2005, 16h22
  5. [MFC] Glisser/Déposer dans une CView
    Par octopus984 dans le forum MFC
    Réponses: 2
    Dernier message: 26/04/2005, 10h15

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