Essai d'un code

Résolu
cs_Achi Messages postés 128 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 mai 2008 - 1 avril 2006 à 18:39
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 4 avril 2006 à 10:26
bonjour,

Qlq'un pourrait-il essayer ce code chez lui sous VBA excel, et me dire pourquoi il ne fonctionne pa alors que la source à l'air correcte!!

Merci, Achi!
PS: pr info j'ai mis le tt dans un module!!

'*****************************************
' Dans la partie déclaration du formulaire
'*****************************************
Public Const MF_BYPOSITION = &H400&

'Cette fonction API sert à prendre le menu qui apparaît lors du clic en haut à gauche du form (sous-menus "Restaurer", "Déplacer", "Réduire", "Fermer", ...)
Public Declare Function GetSystemMenu _
Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

'Cette fonction API sert à enlever un de ces sous-menus
Public Declare Function RemoveMenu _
Lib "user32" (ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long

'Cette fonction API sert à connaître le nombre de sous-menus dans ce même menu
Public Declare Function GetMenuItemCount _
Lib "user32" _
(ByVal hMenu As Long) As Long



'*******************************************
' Dans la partie programmation du formulaire
'*******************************************
Public Sub DesactiverX(f_hwnd As Long)

Dim lSysMenu As Long
Dim lItemCount As Long
Dim lRet As Long

'Prend l'ID du menu
lSysMenu = GetSystemMenu(f_hwnd, False)

'Prend le nombre d'objet (sous-menus) du menu
lItemCount = GetMenuItemCount(lSysMenu)

'Suppression de sous-menu
lRet = RemoveMenu(lSysMenu, lItemCount - 1, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 2, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 3, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 4, MF_BYPOSITION)

End Sub

10 réponses

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
4 avril 2006 à 09:40
Salut Achi, salut à tous,

je suis d'accord avec eux, t'es un mec dangereux :)

Sans sortir l'artillerie lourde, tu ne peux pas capter la fermeture d'Excel. Mais c'est plutôt l'utilité de ton bouton "Fermer Excel" qu'il faut remettre en cause. Un process a mille et un moyens de se retrouver "arrêté" (en fait à peu près 5, ou 6 si en plus il manifeste contre le CPE), et quelque chose me dit que tu auras du mal à tous les détecter de l'intérieur de classeur.

Par contre, il est certainement plus facile de détecter la fermeture du classeur, voire même de l'empêcher, ou de faire le nécessaire avant et de le fermer. Le Guide de Style de Programmation Windows n'invite pas les développeurs à empêcher un utilisateur de faire ce qu'il veut, au contraire, à l'aider à faire ce qu'il veut.

Ce qui n'exclue pas que le développeur fasse faire à l'application un certain traitement qui permet de remettre le contexte d'exécution dans un état stable (et ici le contexte de fin d'exécution stable induit une satbilisation du prochain contexte d'exécution).

Essaies ça :

Private WithEvents xlApp As Excel.Application' pour recevoir les évènements de l'application

Private Sub Workbook_Open()
Set xlApp = Application' affecte une référence à l'application
End Sub

Private Sub xlApp_WorkbookBeforeClose( Byval Wb As Workbook, Cancel As Boolean)
'ici, un éventuel traitement de remise en état stable du contexte d'exécution
Cancel = True' annule la fermeture du classeur, ou pas, c'est au choix
End Sub

PS: "c quoi ma form???", un formulaire utilisateur (UserForm), est un formulaire définit (dessiné, contenant ou pas des contrôles, et des traitements associés aux contrôles et au formulaire) qui permet des intéractions évoluées entre ton application et l'utilisateur.
à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 avril 2006 à 18:59
Salut
C'est un peu juste comme question. Surtout que le but est de supprimer des menus !
Dis nous ce que tu essayes de faire et ce qui se passe chez toi.
As-tu un message d'erreur ?
As-tu suivi ligne par ligne le code ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
0
mcs2006 Messages postés 58 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 1 mai 2006
1 avril 2006 à 19:13
Bonjour,

Pourquoi n'essaies-tu pas ton code chez toi d'abord ? Tu cherches des cobayes ?
0
cs_Achi Messages postés 128 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 mai 2008
1 avril 2006 à 22:40
salu,

sisi je l'ai essayé mais ca ne fonctionne pas, je débute en VBA et je ne vois pas le problème qu'il y a!

g mis ce code ds un de mes modules, puis ds Thisworksbook je lance le sub DesactiverX.... comme ca à l'ouverture du fichier il m'execute ce code (normalement)
et là il me mets un msg d'erreur "argument non facultatif"
et si je mets çà : DesactiverX(f_hwnd As Long) il ne prend pa la syntaxe!!

alors c'est vrai je ne comprends pas tt mais je cherche à apprendre!!

et non je ne cherche pas de cobayes puisque je l'ai essayé, et comme ca ne fonctionne pa j'me suis dis que de chez vous verrai peut-être le problème.

voilivoilou!!

merci de m'aider!! Achi!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kalobit Messages postés 169 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 7 avril 2008 2
3 avril 2006 à 15:22
salut,

ce code fonctionnera certainement sans problème en VB6 mais là, tu en demande trop à Excel.

en fait, il faut passer le Handle de la fenêtre sur laquelle tu veux agir comme argument à ta sub desactiverX
Le Pb c'est que tu peut pas récupperer ce Handle pour un formulaire VBA. Donc ton code ne pourra pas s'appliquer dans Excel.

éventuellement, tu peut rechercher le nom du menu et récuperer le commandbarbutton pour le supprimer mais je suis pas certain que t'y arrive.

comme visiblement tu cherche à empêcher la fermeture d'un formulaire par la croix ou par le menu, essaye ça :

Rajoute le code évènement dans ta form et test si ça fonctionne

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)If CloseMode 0 Then Cancel True
End Sub

++++
K@lobit
0
cs_Achi Messages postés 128 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 mai 2008
3 avril 2006 à 17:25
salu Kalobit,

Bah non ca ne fonctionne pa, tant pis!!

apparemment c pa possible donc c pa grave je ferais ac..

Merci à ts ceux qui m'ont aidé!!! Achi!
0
kalobit Messages postés 169 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 7 avril 2008 2
3 avril 2006 à 17:30
ce que je te propose ne supprime pas l'option fermer mais la bloque.

Si ça marche pas, faudrait m'en dire d'avantage parceque j'utilise ce truc depuis des années et j'ai jamais ue de soucis.

+++
0
cs_Achi Messages postés 128 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 mai 2008
3 avril 2006 à 21:15
bah en fait g mis ton code ds la partie programation VBA de ma feuil1, et rien ca ne fonctionne pas!! aucuns msg d'erreur pourtant!

je veux eviter que l'utilisation puisse fermer excel, car g créé un bouton qui s'en charge!!

mais com je débute il est possible que j'ai mis ton code au mauvais endroit!!

qd tu dit mets ce code ds ta form, c quoi ma form???

Achi!!
0
cs_Achi Messages postés 128 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 mai 2008
4 avril 2006 à 10:09
salu Rvblog,

merci pour ton code il fonctionne à merveille!!

par contre dsl pr ton PS: g pa tt compris, jsuis peut-être dangereux mais toi t compliqué lol!!!!

Achi!
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
4 avril 2006 à 10:26
Là, tu as plus que raison !

mais maintenant, tu sais ce qu'il te reste à investiguer.

PS : je suis toujours aussi surpris de voir des membres mieux comprendre un code informatique en VB, qu'une bonne vieille phrase en français, avec des virgules, des parenthèses, des guillemets (full option).
Achi, tu essaies de nous cacher tes origines :)


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
Rejoignez-nous