arthur0201
Messages postés55Date d'inscriptionsamedi 19 mars 2005StatutMembreDernière intervention19 octobre 2006
-
1 oct. 2006 à 22:44
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
3 oct. 2006 à 23:06
Bonjour,
J'aimerai savoir comment créer une commande qui lance mon userform sans avoir besoin de fermer et ré-ouvrir mon fichier excel...
Voici ce que Mpi m'a proposé:
"Soit tu l'ouvres d'une autre façon, une fois le classeur ouvert,
soit tu peux le cacher pendant l'exécution de la session (UserForm1.Hide) et tu le réaffiches au besoin(UserForm1.Show)
À ce moment, plutôt que de fermer avec le X en haut à droite ou Unload dans le code, tu peux mettre un bouton sur l'Userform qui lance le Hide et pour le réafficher, à toi de voir comment tu veux procéder. Ça pourrait être au changement de feuille (WorkSheet_Activate) ou un popupmenu (click droit sur une cellule) ou un bouton sur chaque feuille..."
Le pop menu m'interresse plus car j'ai pas mal de feuille excel dans mon fichier(plus de 100).
Cependant, si c vraiment plus facile je me contenterai d'un bouton sur chaque feuille excel...mais comment faire?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 1 oct. 2006 à 23:28
Salut,
Pour avoir un menu contextuel sur Click droit, il faut agir dans
l'événement BeforeRightClick de chaque feuille où on veut voir
apparaître ce menu. Comme tu as ±100 feuilles, ça peut être long à
copier du code partout. Donc créer le menu dans WorkBook_Open pourrait
être préférable dans ton cas.
S'il y a des feuilles où tu ne veux pas voir apparaître le menu, il suffit de le "détruire" dans son événement BeforeRightClick.
Dans la procédure que je te donne, je détruit ce menu avant de le
recréer. Ce n'est probablement pas la seule (ou meilleure) façon d'y
arriver, mais il faut éviter que le menu se crée en double ou plus.
Et il faut comprendre que CommandBars fait partie de Application donc
de Excel et non pas seulement de ton classeur. Le menu créé fait partie
d'Excel dorénavant jusqu'à ce qu'il soit "détruit" par ton code ou,
s'il est Temporary, jusqu'à la fermeture d'Excel.
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Menu
'Détruire le menu s'il existe
For Each Menu In Application.CommandBars("cell").Controls
If Menu.Tag = "MonMenu" Then Menu.Delete
Next Menu
'Création du menu contextuel
'Before = 1 indique que ce sera le premier item de la liste du menu
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 2 oct. 2006 à 12:16
Salut,
Une autre solution consisterais à mettre un menu dans ton application et pas un popup.
Ceci t'éviteras de réécrire X fois les procédures dans chaque feuilles.
En premier lieu tu dois supprimer les lignes de codes qui appelent ton UserForm au démarage du classeur.
ensuite tu colles ce code dans ThisWorkBook
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call delMenu
End Sub
Private Sub Workbook_Open()
Call MakeMenu
End Sub
Ensuite tu crée un module et tu colles ce code dedans
Bien sur tu peux reparamétrer le nom du menu et du sous-menu pour qu'il colle à ton application
'****************************************************************
' CE CODE EST A METTRE DANS UN MODULE
'****************************************************************
Sub MakeMenu()
Dim monmenu As CommandBarControl, sousmenu1 As CommandBarControl
'Dim sousmenu2 As CommandBarControl, sousmenu2_option1, sousmenu2_option2
Set monmenu = _
Application.CommandBars(1).Controls.Add(msoControlPopup, , , , True)
With monmenu
'Ici tu peux mettre un nom plus personel
.Caption = "&UserForm"
End With
Set sousmenu1 = monmenu.Controls.Add(msoControlButton, , , , True)
With sousmenu1
'Ici tu peux aussi mettre un nom de sous menu plus personel
.Caption = "Lancer la user form..."
.OnAction = "lanceform"
End With
End Sub
Sub delMenu()
'Si le menu n'est pas chargé on ignore l'erreur
On Error Resume Next
Application.CommandBars(1).Controls("&UserForm").Delete
End Sub
Sub LanceForm()
'Ici tu adaptes au nom de ta feuille
'tu pourais aussi voir l'état de ton UserForm et l'adapter en
'consequence
UserForm1.Show
End Sub
arthur0201
Messages postés55Date d'inscriptionsamedi 19 mars 2005StatutMembreDernière intervention19 octobre 2006 2 oct. 2006 à 20:21
J'ai coller le code de valtrase... mon soucis et que quand je suis sur vb et que j'appui sur le bouton play le code a l'air de fonctionner...mon soucis et qu'une fois sur excel je ne sais pas commment faire pour le faire apparaitre ce menu...(un clic droit ne donne rien)
arthur0201
Messages postés55Date d'inscriptionsamedi 19 mars 2005StatutMembreDernière intervention19 octobre 2006 2 oct. 2006 à 21:04
Mpi:
"Tu pourrais aussi travailler avec d'autres événements dans ton classeur (Activate, Deactivate, WindowActivate, WindowDeactivate, ..."
Pour arriver à faire quoi exactement?
Je ne sais pas où je me suis planté mais avec le code de Mpi quan je le lance sous vb j'ai une fenetre de macro avec marquer mon menu, je fais executer puis j'ai une fenetre qui s'ouvre qui m'indique le nom d'une de mes feuilles(saisi feuille de temps) et je ne peux que cliquer sur ok... et quand je le fais plus rien ... le message disparait et quand je fais clique droit rien pour appeler mon userform...
Voilà ce que j'ai coller dans ThisWorkbook(car je ne sais pas comment creer un WorkBook_Open comme tu me l'indique Mpi...):
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Menu
'Détruire le menu s'il existe
For Each Menu In Application.CommandBars("cell").Controls
If Menu.Tag = "MonMenu" Then Menu.Delete
Next Menu
'Création du menu contextuel
'Before = 1 indique que ce sera le premier item de la liste du menu
With Application.CommandBars("cell").Controls _
.Add(Type:=msoControlButton, before:=1, temporary:=True)
.Caption = "*** Utiliser MonMenu ***" 'ce qu'on lit dans le menu
.OnAction = "MonMenu" 'la procédure appelée
.Tag = "MonMenu" 'Tag pour le reconnaître
End With
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Menu
For Each Menu In Application.CommandBars("cell").Controls
If Menu.Tag = "MonMenu" Then Menu.Delete
Next Menu
End Sub
Voilà si vous arriver à me dépétrer de là sa serait cool...Je tiens à signaler que pour les 2 code que vous me proposer j'ai rien modifier car ne sais pas trop ce qu'il y a modifier(hormis pour le code de valras où j'ai mis UserForm2.Show (car chez moi c ainsi qu'il se nomme))
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 2 oct. 2006 à 23:29
Salut,
Prend le temps de bien lire et de chercher à comprendre.
Il y a beaucoup de choses à apprendre en programmation. Un simple
copier/coller du code de quelqu'un d'autre ne sert à rien si on n'a
rien saisi...
Là, tu as 2 options, le code de Valtrase qui te permet d'avoir un menu
dans Excel (en haut, à droite du ? de l'aide) au même niveau que
Fichier, Édition, Affichage,...Et il se nomme UserForm.
Comme le menu est créé à partir de l'événement Workbook_Open(),
il faut que tu sauvegardes le fichier puis que tu l'ouvres à nouveau. À
ce moment-là l'événement aura lieu et tu pourras voir le menu en haut,
dans la barre Excel.
Si tu utilises ma méthode, il faut changer
MsgBox ActiveSheet.Name
par
Userform2.show
Pour WorkBook_Open(), va dans ThisWorkbook, il y a 2 combobox en haut
de la fenêtre de code. Choisi Workbook dans celui de gauche et Open
dans celui de droite. C'est tout. Puis tu y mets ton code.
arthur0201
Messages postés55Date d'inscriptionsamedi 19 mars 2005StatutMembreDernière intervention19 octobre 2006 3 oct. 2006 à 22:18
Merci les gars! Vos deux procédures tournent impec!
Mon projet est quasi fini(maintenant il faut que je finiole autour de tous celà!)
En tout cas, je tiens à remercié tous ce qui m'ont aider(en particulier Mpi qui a été très patient!)...
C'était une première pour moi et par vos réponses de pros, vous m'avez donner envie de me plonger plus intensemment dans la prog! (Je vais chercher un bon bouquin d'abord pour acquérir quelques bases)
Encore merci et a plus pour une prochaine prog!(t'inquiete pas Mpi sa sera pas tout de suite)