Créer une commande pour lancer son userform depuis une feuille excel? [Résolu]

Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
- - Dernière réponse : cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 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?

Merci à vouspour votre aide.
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
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

    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


Dans un module, tu crées ta procédure appelée par ce menu.

Ici, la procédure est très complexe, mais tu peux y aller plus simple... ¦¬ )

Sub MonMenu()

    MsgBox ActiveSheet.Name

End Sub


Et avant de quitter le programme (classeur), on détruit le menu pour ne
pas le voir apparaître dans d'autres programmes. À écrire dans
ThisWorkbook.

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


Tu pourrais aussi travailler avec d'autres événements dans ton classeur
(Activate, Deactivate, WindowActivate, WindowDeactivate, ...


Bonne chance

MPi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
3
3
Merci
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



Cordialement, Jean-Paul  

______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de valtrase
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
Juste une question... C'est quoi un module ?(je suis un débutant désolé...)

Merci
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
J'ai trouver comment créer un module ...(mais ne sais pas trop a quoi sa sert!)

Sinon Valtrase me parle d'un sous menu dans son code ....mais je n'en ai pas (enfin c ce que je crois...)
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
"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"


C'est-à-dire...j'ai plusieurs feuilles...je dois entrer le nom de toutes mes feuilles?Si oui comment?
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
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)
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
De plus j'ai coller le code tel quel car je ne sais pas trop ce que je dois modifier pour l'adapter à mon fichier excel... si vous pouvez m'aider...
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
En attendant vos réponses, je vais essayer le code de Mpi
Commenter la réponse de arthur0201
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
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))
Commenter la réponse de arthur0201
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
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.

MPi
Commenter la réponse de cs_MPi
Messages postés
55
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
19 octobre 2006
0
Merci
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)
Commenter la réponse de arthur0201
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
>> (t'inquiete pas Mpi sa sera pas tout de suite)


Héhé, pas de problème même si c'est tout de suite... ?

L'idée d'un bon bouquin est très bonne.

MPi
Commenter la réponse de cs_MPi