Private sub sur des bouton perso appelé dans userform_initialize

Résolu/Fermé
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 - Modifié par Orbital38 le 2/08/2015 à 19:27
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 - 2 août 2015 à 21:26
Bonjour,

Désolé pour le titre à rallonge c'est difficile d'exposer le problème.

Bon déjà je me complique peut-être la vie et je pourrais juste implanter des boutons persos comme ça dans mon userform mais je suis avide de connaissance.


Qu'est-ce que j'appelle "bouton perso" ? 2 images superposées (une visible en arrière plan, une invisible en premier plan) + du texte centré au même endroit et par-dessus les 2 images. J'utilise les private sub mousemove sur l'image visible et sur le userform pour rendre visible l'image qui était invisible et pour la re-rendre invisible.

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   Image2.Visible = True
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   If Me.Image2.Visible Then Me.Image2.Visible = False
End Sub

Image1 et Image2 constituent un même bouton.

Avant dans mon UserForm_initialize je mets ça pour automatiser le centrage des 2 images + le texte pour un même bouton (2 images + label qui sont fait dans le userform graphique avec la boite à outils) :
Image1.top = y_c1 - Image1.Height / 2
Image1.left = x_c - Image1.Width / 2
Image2.top = y_c1 - Image2.Height / 2
Image2.left = x_c - Image2.Width / 2

Label2.top = y_c1 - Label2.Height / 2
Label2.left = x_c - Label2.Width / 2


Seulement voilà je voudrais simplifier tout ça et me créer une fonction "bouton" pour ajouter 2 images et un label dans le userform :
Private Function bouton(K As Integer, Nom_bouton As String, top As Double, left As Double)

Dim lblCs(200) As MSForms.Label
Dim imgCs(200) As MSForms.Image

Dim L, M As Integer

L = K * 2 - 1
M = K * 2


Set imgCs(L) = Me.Controls.Add("Forms.Image.1", "Image" & L) 'image foncée, toujours visible, en arrière plan
With imgCs(L)
.Name = "Image" & L
.top = top
.left = left
.BackStyle = fmBackStyleTransparent
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture("D:\bouton1 pour userform.gif")
.AutoSize = True
.Visible = True
End With

Set imgCs(M) = Me.Controls.Add("Forms.Image.1", "Image" & M) 'image claire, invisible, en premier plan
With imgCs(M)
.Name = "Image" & M
.top = top
.left = left + 10
.BackStyle = fmBackStyleTransparent
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture("D:\bouton2 pour userform.gif")
.AutoSize = True
.Visible = False
End With

Set lblCs(M) = Me.Controls.Add("Forms.Label.1", "Label" & M)
With lblCs(M)
.Name = "Label" & M
.top = top
.left = left
.BackStyle = fmBackStyleTransparent
.BorderStyle = fmBorderStyleNone
.Caption = Nom_bouton
.Font.Name = "Tahoma"
.Font.Size = 10
.Font.Bold = True
.ForeColor = Val("&H" & "FFFFFF")
'.Backcolor ="vbBlue"
.AutoSize = True
End With

End Function


Seulement voilà, quand j'appelle le bouton avec l'ID 5 par exemple (donc je crée Image9, Image10, Label10) :
bouton 5, "test 2", 230, 20
, les private sub de mousemove ne fonctionnent plus pour ces boutons.


Tout marche bien pour les 3 premiers boutons car j'ai rajouter les images et les labels avec la boite à outils du userform. Mais pour test1 et test2 je créer tout avec du code et là ça ne marche plus.

Si quelqu'un à une solution/explication je suis preneur. ^^

Merci d'avance.

Edit :
J'oubliais aussi : dans ma private sub userform_mousemove, la ligne pour rendre à nouveau invisible l'image au premier plan me fait planter la macro. Donc je met la ligne en remarque, mais le mousemove sur l'image 9 (celle qui est visible) ne marche quand même pas :
Private Sub Image9_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   Image10.Visible = True
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   If Me.Image2.Visible Then Me.Image2.Visible = False
   If Me.Image4.Visible Then Me.Image4.Visible = False
   If Me.Image6.Visible Then Me.Image6.Visible = False
   'If Me.Image8.Visible Then Me.Image8.Visible = False
   'If Me.Image10.Visible Then Me.Image10.Visible = False
End Sub


A voir également:

1 réponse

Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 2/08/2015 à 21:51
Bon, j'arrive à faire marcher un bouton avec ma Function Bouton avec un WithEvents :

Public WithEvents oImage1 As MSForms.Image
Public WithEvents oImage2 As MSForms.Image
Public WithEvents oLabel As MSForms.Label

+

Set oImage1 = Me.Controls.Add("Forms.Image.1", "Image" & L)
With oImage1
dans ma fontion bouton.

Et à la fin avec le MouseMove :
Private Sub oImage1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   oImage2.Visible = True
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   If Me.oImage2.Visible Then Me.oImage2.Visible = False
End Sub

sauf qu'il me le fait sur mon dernier bouton que je créer avec ma fonction (logique).
J'aimerai savoir comment définir mes images.

Avant cette modif' j'avais :
Dim lblCs(200) As MSForms.Label
Dim ImgCs(200) As MSForms.Image

Là je n'ai pas le withevents mais j'ai un moyen de différencier chaque controls.

Etant novice en VB je voulais savoir si il y avait un moyen de définir des variables dans une boucle et créer de cette manière oImage1, oImage2, oImage3, etc....

Merci


Edit :
Je ne sais pas si ça peut être ça mais est-ce que je dois créer un module de classe pour faire mes boutons ?
En fait je dois créer des objets Imagei où i s'incrémente à chaque création de bouton afin de l'utilise dans les private sub mousemove. Sauf que ces Imagei doivent être définies avec un WithEvents.
Du coup je ne sais absolument pas quoi faire.

J'arrive à bidouiller VBA mais là c'ets la première fois que je bloque autant. J'ai besoin de conseils et d'aide. x)
0