glisser déposer un objets dans un userform (VBA)

A2H

XLDnaute Nouveau
Bonsoir
Je veux savoir s'il est possible de créer un code VBA pour glisser déposer un objet (Text, image) dans un userform), comme la cas d'un puzzle
exemple j'ai 3 textes et 3 TextBox et je veux deplacer avec la souris le text1 dans le textBox 3 , le texte2 dans le textbox1 …
Merci d'avance
 

Dranreb

XLDnaute Barbatruc
Mais non. Regarde comment est fait le module de classe LabelGlissable du Temp.xlsm joint poste #21 et fait à peu près pareil, mais en plus simple parce qu'il n'y a qu'une instruction à mettre dans la Property Set et ensuite tes deux Sub _BeforeDragOver et _BeforeDropOrPaste
Et s'il y a quelque chose que tu ne comprends pas au passage pose moi des questions.
 

Lone-wolf

XLDnaute Barbatruc
Re

Je n'ai pas regardé le post #21. En attendant ton message, j'ai créé 2 modules de classe un nommé TextBoxCible et l'autre LabelGlissable.

Mais je ne sais pas comment modifier la boucle For i par For each.
 

Pièces jointes

  • Classeur exemple-V3.xlsm
    22.9 KB · Affichages: 20

Dranreb

XLDnaute Barbatruc
À mon avis il n'y a pas de raison de nommer GroupLabel le contrôle central du module de classe. Beaucoup le font et c'est complètement absurde parce que cette propriété représente une seul Label propre à l'exemplaire de l'objet et pas un groupe de Label ou je ne sais quoi.
J'avais demandé à ce que l'UserForm_Initialize telle que je l'avais écrite fonctionne avec tes modules de classe.
Alors s'il te plait appelle la propriété Label Lab et dans l'autre la TextBox TBx, c'est tout.
Il n'est pas utile que les variables LabelGlissable et TextBoxCible soient globales dans l'UserForm: elles ne sont utilisées que dans l'UserForm_Initialize et elles peuvent donc y être des variables locales.
Le module de classe LabelGlissable tel que je l'avais écrit, avec glissement visible, ça aussi j'y tiens :
VB:
Option Explicit
Private WithEvents LabI As MSForms.Label, Left As Single, Top As Single, X0 As Single, Y0 As Single
Public Property Set Lab(ByVal Lab As MSForms.Label)
   Set LabI = Lab
   Left = LabI.Left: Top = LabI.Top
   End Property
Private Sub LabI_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   X0 = X: Y0 = Y
   End Sub
Private Sub LabI_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   If Button = 0 Then Exit Sub
   LabI.Left = LabI.Left + X - X0
   LabI.Top = LabI.Top + Y - Y0
End Sub
Private Sub LabI_Click()
   LabI.Left = Left: LabI.Top = Top
   With New MSForms.DataObject: .SetText LabI.Caption: .StartDrag: End With
   End Sub
 

Dranreb

XLDnaute Barbatruc
Eh ben voilaaaaaa !
Bon je l'avais écrite comme ça parce que je ne vois pas l'utilité que la propriété TBx soit en lecture/écriture, mais ce n'est qu'un détail :
VB:
Option Explicit
Private WithEvents TBxI As MSForms.TextBox
Public Property Set TBx(ByVal TBx As MSForms.TextBox)
   Set TBxI = TBx
   End Property
Private Sub TBxi_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 TBxI_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, 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
   TBxI.Text = Data.GetText
   End Sub
En tout cas ça marche comme tu l'as écrit :)
 

Lone-wolf

XLDnaute Barbatruc
Re

Encore une fois, merci Dranreb. ;)

Au faite, si au lieu du texte on utilise la propriété BackColor comme dans l'exemple que j'ai montré au post #20(ici il inscrit le numéro de la couleur, si je ne dis pas de bétises), comment faudrait procéder?
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonsoir Lone-wolf
Bonsoir Dranreb

juste une question
je ne comprends pas l'utilisation du
VB:
With New MSForms.DataObject:
Je comprends que cela a une relation avec les TextBox , mais je ne vois nulle part de référence a ces Trois TextBox.
Pourrais tu (Dranreb ou lone-wolf) m'expliquer l'utilisation de cette procédure .
Merci par avance
jean marie
 

Dranreb

XLDnaute Barbatruc
@Lone-wolf Oui ben je traiterais la couleur en la transmettant en même temps que le texte derrière un séparateur peu usité, au .SetText, que je récupèrerais sûrement au Data.GetText et décomposerais en 2 parties avec la fonction Split pour le texte et la couleur.
@ChTi160 C'est qu'à vrai dire je ne sais toujours pas comment ça marche.
Je sais seulement que c'est la même chose en plus court que de déclarer une variable locale As MSForms.DataObject, faire un Set dessus et travailler avec set méthodes SetText et StartDrag. C'est cette dernière qui est importante, je crois, mais je ne sais ce qu'elle fait. Enfin les deux sont importantes sûrement mais la SetText je la connaissais déjà: Suivie d'un PutInClipboard elle copie le texte dans le presse papier.
 

Discussions similaires

Réponses
12
Affichages
393

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390