Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'ai créer un mini programes sous VBA, je voudrais que lorsqu'on le lance, il n'est plus aucun barre sous excel (en clair le faire tourner sous excel, mais sans faire voir que c'est du exel).
Si je supprime les barre cela s'applic à l'esnemble de mes fichiers.
Si l'utilisateur n'a à aucun moment besoin de saisir/lire des données sur une des feuilles de ton classeur (la saisie/consultation se fait uniquement par le biais de UserForms), tu peux cacher l'application Excel à l'ouverture de ton fichier et la raficher à sa fermeture.
Du coup, tu n'auras que tes UserForms de visible.
Sinon, il faudra programmer la barre des menu. (un exemple parmi plein d'autres sur le net)
C'est vrai que c'est risqué et qu'il faut savoir programmer, dans le sens où si la macro buge alors que Excel était masqué, une application d'Excel sera en train de tourner, mais inaccessible (dans ce cas là, il faut tuer le processus dans le gestionnaire des tâches).
Mais il y a quand même un moyen assez propre d'éviter ce genre d'erreur.
Prenons le cas de cette macro (qui buge volontairement) :
VB:
Public Sub MaMacro()
Dim nbre As Double
'ligne qui fait buger la macro
nbre = 1 / 0
End Sub
Si on veut désactiver l'affichage d'Excel, il ne faut pas modifier les options de l'application dans cette macro, mais dans une autre qui va juste servir à lancer celle-ci.
Je ne sais pas si c'est très clair, donc voici le code "préconisé".
VB:
Private Sub MaMacroInt()
Dim nbre As Double
'ligne qui fait buger la macro
nbre = 1 / 0
End Sub
Public Sub MaMacro()
'cacher Excel
Application.Visible = False
'"déseactiver" la gestion des erreurs (dans ce Sub)
On Error Resume Next
'lancer la macro
MaMacroInt
'"réactiver" la gestion des erreur
On Error GoTo 0
'réafficher Excel
Application.Visible = True
End Sub
De même, lorsqu'on manipule la gestion des évènements, ou le mode de calcul, il vaut mieux gérer ces options dans une macro "spécifique" affin d'être sûr de "remettre" Excel dans le même état :
VB:
Public Sub Macro()
Dim mem1 As Long, mem2 As Long, mem3 As Long
'mémoriser les options d'excel et les désactiver
mem1 = Application.ScreenUpdating: Application.ScreenUpdating = False 'raffraichissement de l'affichage
mem2 = Application.EnableEvents: Application.EnableEvents = False 'gestion des évènements
mem3 = Application.Calculation: Application.Calculation = xlCalculationManual 'mode de calcul
'Exécuter la macro
On Error Resume Next
MacroInt
On Error GoTo 0
'rétablir les options d'excel
Application.ScreenUpdating = mem1
Application.EnableEvents = mem2
Application.Calculation = mem3
End Sub
Private Sub MacroInt()
'code "de traitement"
'...
'...
End Sub
Dans mes petites applications, je masque souvent les menus Excel (y compris les menus contextuels du clic droit sur une cellule, que je remplace par un menu contextuel de ma façon) pour empêcher l'utilisateur de faire ce qu'il ne faut pas. Et je les rétablis au moment de la fermeture de l'application.
La solution consistant à mémoriser l'état des menus dans des variables avant de masquer les menus Excel m'ayant posé quelques problèmes (notamment quand l'application perd les variables, ce qui peut arriver), je l'ai abandonnée.
Voici le code que j'utilise sous Excel 2003 pour masquer (et donc rendre inaccessible à l'utilisateur) TOUTES les barres de menu de Excel, SAUF celles que je nomme après le 1er "Case" (je ne me souviens plus s'il fonctionnait sous Excel 97)
ATTENTION : si l'application crée son propre menu, ce menu doit avoir été créé avant le masquage des menus Excel et nommé dans le 1er "Case" de la boucle "For.... Next"
Code:
Private Sub Masquer_Click()
Dim CBar As CommandBar
For Each CBar In Application.CommandBars
Select Case CBar.Name
'==> Mettre après le 1er Case le nom des barres de menu à conserver, séparés par une virgule
Case "Ma_Barre_de_Menu_Perso"
CBar.Enabled = True
Case Else
CBar.Enabled = False
End Select
Next
End Sub
Voici le code que j'utilise pour rétablir TOUTES les barres de menu au moment de la fermeture de l'application.
1 : Code à placer dans le module de code de l'objet "ThisWorkbook" de l'application
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Retablir_MenusExcel
End Sub
2 : Code à placer dans un module quelconque de l'application
ATTENTION : au moment de l'exécution de cette procédure, la feuille active ne doit pas être une feuille de graphique mais une feuille de calcul normale.
ATTENTION : code corrigé le 04/10/2009 (il y avait une omission pouvant provoquer une erreur : les instructions commençant par "ActiveWindow" ne peuvent être exécutées que si un classeur est ouvert). Le fichier joint a été corrigé le même jour.
Code:
Sub Retablir_MenusExcel()
Dim CBar As CommandBar
Rem Remet toutes les barres de menu à "Enabled" y compris les barres perso, qu'elles le soient déjà ou pas
For Each CBar In Application.CommandBars
CBar.Enabled = True
Next CBar
Rem Remet "Visible" les barres de base, qu'elles le soient déjà ou pas
CommandBars("Worksheet Menu Bar").Visible = True
CommandBars("Standard").Visible = True
CommandBars("Formatting").Visible = True
Rem Supprime le plein écran s'il est actif
Application.DisplayFullScreen = False
Rem Rétablit la barre de statut
Application.DisplayStatusBar = True
Rem Rétablit la barre de formule
Application.DisplayFormulaBar = True
Rem Ne poursuit la procédure que si un classeur est ouvert
If Workbooks.Count = 0 Then Exit Sub
Rem Rétablit les entêtes de lignes et colonnes
ActiveWindow.DisplayHeadings = True
Rem Rétablit les onglets de feuilles
ActiveWindow.DisplayWorkbookTabs = True
Rem Rétablit les barres de défilement
ActiveWindow.DisplayHorizontalScrollBar = True
ActiveWindow.DisplayVerticalScrollBar = True
End Sub
Mais l'application peut "planter" et ne pas rétablir les menus. Il est donc impératif de disposer en permanence d'un outil de secours (un fichier Excel contenant le code de rétablissement).
Je joins le fichier de secours que j'utilise et qui peut servir de test.
(nota : la procédure se déclenche par un clic sur une zone de texte à laquelle est attachée une macro, car l'insertion de "CommandButton" dans une feuille de calcul m'a déjà posé des problèmes)
Pour info, j'utilise aussi une astuce pour empêcher l'usage intempestif de la "croix de fermeture Windows", qui pose souvent problème avec des utilisateurs "dans la lune", mais c'est un autre sujet.
Bonne journée.
PS : dans les menus de mes applications, j'ajoute systématiquement un bouton qui me permet, avec un mot de passe, de rétablir les menus Excel quand je veux modifier l'application.
Je trouve dommage de renoncer à masquer les menus Excel dans une application, du simple fait que les risques qui en découlent ont été mis en évidence. On n’avance pas en programmation si l’on refuse les risques ! Et soyons raisonnables : si les développeurs de Excel ont donné la possibilité de masquer les menus et barres d’outils, c’est que c’est faisable sans risque ni de cramer la bécane, ni de bloquer les autres progiciels installés ! Dans la pire des situations, il faudra peut-être désinstaller puis réinstaller Excel, ce qui n’est pas la mer à boire !
Mes expériences d’applications sous Excel m’ont largement prouvé qu’il est utile – voire souvent indispensable – d’interdire aux utilisateurs l’usage des menus et barres d’outils intégrées de Excel (et de la satanée « croix de fermeture », mais c’est un autre sujet), sous peine d’obtenir des résultats surprenants, voire catastrophiques. Mais il est prudent d’inclure dans une barre d’outils de l’application un bouton réservé au développeur, permettant, avec un mot de passe, de rétablir les menus Excel pour modifier ou corriger le code.
Et pour masquer les menus Excel en sécurité dans une application, il faut :
- avoir une « trousse de secours » et savoir l’utiliser, il y en a sur ce site ;
- faire en sorte que l’application crée son propre menu avant de masquer les menus Excel ;
- faire des essais pour déterminer les menus (notamment contextuels) et outils que l’on veut conserver et ceux que l’on veut masquer ;
- tâtonner longtemps pour trouver la meilleure solution, en utilisant les conseils de sites spécialisés : c’est ainsi qu’on apprend.
Dans le cas d’une application qui s’adresse à des utilisateurs néophytes ne sachant pas utiliser une « trousse de secours » et tournant sur plusieurs machines, on peut trouver une solution qui rétablit systématiquement les menus de Excel chaque fois qu’on ouvre ce progiciel, que l’application ait planté ou non.
Je propose ici la mienne, qui fonctionne chez moi (Excel 2003 sous Vista et XP). Les critiques seront bien sûr les bienvenues (serait-ce un « appel du pied » aux experts de ce site ?)
Cette solution consiste à :
1 : Placer dans le dossier « Macros complémentaires » de chaque utilisateur un classeur enregistré en format « Macro complémentaire » (extension « .xla ») et contenant les procédures de rétablissement des menus, lesquelles s’exécutent chaque fois que l’on lance Excel.
2 : Dans Excel, installer cette macro complémentaire avec le menu « Outils / Macros complémentaires »
Pour mettre en place ce système sur plusieurs postes, on peut procéder comme suit :
1 : Créer un dossier « Installation » sur une mémoire amovible (clé USB par exemple)
2 : Créer la macro complémentaire et la sauvegarder dans ce dossier
3 : Créer un classeur d’installation, avec sur la 1ere feuille de calcul un bouton qui lance la procédure d’installation, et le sauvegarder dans ce même dossier
4 : Exécuter sous Excel, pour chaque compte d’utilisateur, le classeur d’installation.
Pour mémoire, le chemin complet du dossier « Macros complémentaires » est sous Vista :
« C:\Users\[Nom de l’utilisateur]\AppData\Roaming\Microsoft\Macros complémentaires »
Et sous XP : « C:\Documents and Settings\[Nom de l’utilisateur]\Application Data\Microsoft\Macros complémentaires »
On peut aussi utiliser les 2 fichiers compressés dans l’archive « Retab Auto MenusExcel.zip » que je joins, et qu’il faudra recopier dans le même dossier sur une clé USB par exemple. Le projet VBA de la macro complémentaire est verrouillé. Le code de déverrouillage est dans son nom (« MenusRetablir_Code_a ») : il s’agit de la lettre « a » en minuscule. En effet, il est utile de verrouiller un projet VBA pour éviter que, en cas de plantage, l’utilisateur néophyte ne se perde pas dans les lignes de code.
Voici le code de ces fichiers :
REMARQUE : il y avait une omission dans le code de ma réponse du 1er octobre : j’ai corrigé le code et le fichier joint le 4 octobre.
1 : Code de la macro complémentaire (nommée ici « Activer Menus Excel.xla »)
1-a : Placer dans le module de code de l’objet « Thisworkbook » le code suivant :
Code:
Private Sub Workbook_Open()
Activation_Auto_MenusExcel
End Sub
1-b : Placer dans un module quelconque le code suivant :
Code:
Sub Activation_Auto_MenusExcel()
Dim CBar As CommandBar
Rem Remet toutes les barres de menu à "Enabled" y compris les barres perso, qu'elles le soient déjà ou pas
For Each CBar In Application.CommandBars
CBar.Enabled = True
Next CBar
Rem Remet "Visible" les barres de base, qu'elles le soient déjà ou pas
CommandBars("Worksheet Menu Bar").Visible = True
CommandBars("Standard").Visible = True
CommandBars("Formatting").Visible = True
Rem Supprime le plein écran s'il est actif
Application.DisplayFullScreen = False
Rem Rétablit la barre de statut
Application.DisplayStatusBar = True
Rem Rétablit la barre de formule
Application.DisplayFormulaBar = True
Rem Supprimer cette ligne si on veut garder visibe le "Volet Office"
Application.CommandBars("Task Pane").Visible = False
Rem Ne poursuit la procédure que si un classeur est ouvert
If Workbooks.Count = 0 Then Exit Sub
Rem Rétablit les entêtes de lignes et colonnes
ActiveWindow.DisplayHeadings = True
Rem Rétablit les onglets de feuilles
ActiveWindow.DisplayWorkbookTabs = True
Rem Rétablit les barres de défilement
ActiveWindow.DisplayHorizontalScrollBar = True
ActiveWindow.DisplayVerticalScrollBar = True
End Sub
2 : Code du classeur d’installation (nommé ici « Installer_ActivationMenusExcel.xls »)
2-a : placer dans un module de code quelconque le code suivant
Code:
Sub Installer_la_Macro()
Dim i As Integer
Dim Msg As String
Dim Usager As String
Dim NomAddins As String
Dim CheminCible As String
Dim CheminSource As String
Dim Test As Boolean
' recup le nom du compte utilisateur
Usager = Application.UserName
' stocke le nom de la macro complémentaire
NomAddins = "Activer Menus Excel.xla"
' stocke les chemins complets des dossiers
CheminCible = Application.UserLibraryPath
CheminSource = ThisWorkbook.Path & "\"
Rem Vérifie que la macro complémentaire est dans le même dossier que le classeur d'installation
If Dir(CheminSource & "\" & NomAddins, vbNormal) = "" Then
MsgBox "La macro complémentaire est introuvable dans le dossier du classeur d'installation !", 16, "MACRO COMPLEMENTAIRE ABSENTE"
Exit Sub
End If
Rem Verifie si la macro existe dans le dossier "Macros complémentaires" de l'utilisateur
' et propose de l'y copier si elle en est absente
Msg = "Compte d'utilisateur : " & Usager
Msg = Msg & vbCr & "Vérification de la présence de la macro complémentaire """ & NomAddins & """" & vbCr & vbCr
With Application.FileSearch
.LookIn = CheminCible
.Filename = NomAddins
If .Execute > 0 Then
' la macro complémentaire a été trouvée
Msg = Msg & "La macro est présente dans :" & vbCr & CheminCible
MsgBox Msg, 64, "Installation de " & NomAddins
Else
' la macro complémentaire n'a pas été trouvée
Msg = Msg & "La macro n'a pas été trouvée." & vbCr
Msg = Msg & "Cette macro va être copiée dans " & CheminCible
' propose de copier la macro complémentaire dans le dossier "Macros complémentaires" de l'utilisateur
If MsgBox(Msg, 65, "Installation de " & NomAddins) = vbCancel Then
' abandonne l'installation si on clique sur "Annuler"
Exit Sub
Else
' copie la macro complémentaire si on clique sur OK
FileCopy CheminSource & NomAddins, CheminCible & NomAddins
End If
End If
End With
Rem vérifie si la macro est dans la liste du gestionnaire de macros complémentaires
For i = 1 To AddIns.Count
If AddIns(i).FullName = CheminCible & NomAddins Then
Test = True
Exit For
End If
Next
Rem si elle n'y est pas, propose de l'ajouter
If Test = False Then
Msg = "La macro complémentaire va être ajoutée au gestionnaire de macros complémentaires"
If MsgBox(Msg, 65, "Installation de " & NomAddins) = vbCancel Then
' abandonne la procédure si on clique sur Annuler
Exit Sub
Else
' ajoute la macro au gestionnaire de macros complémentaires si on clique sur OK
' NOTE : la commande "Addins.Add" n'accepte pas les variables
' il faut donc se placer dans le dossier des macros complémentaires pour pouvoir
' l'ajouter au gestionnaire de macros complémentaires et saisir son nom réel
' QUI DOIT ETRE LE MEME que pour la variable "NomAddins"
ChDir CheminCible
AddIns.Add "Activer Menus Excel.xla", False
End If
End If
Rem active la macro si elle ne l'est pas
For i = 1 To AddIns.Count
If AddIns(i).FullName = CheminCible & NomAddins Then
If AddIns(i).Installed = False Then
AddIns(i).Installed = True
End If
Exit For
End If
Next
Rem finale
MsgBox "La macro complémentaire est installée", 64, "Installation de " & NomAddins
End Sub
2-b : Créer un CommandButton de déclenchement (nommé ici "Go") dans une feuille de calcul du classeur et coller dans le module de code de cette feuille le code suivant :
Code:
Private Sub Go_Click()
Installer_la_Macro
End Sub
Remarques relatives à la sécurité :
1 : Pour que les procédures du classeur d’installation puissent s’exécuter, il faut que le niveau de sécurité de Excel (menu « Outils / Macro / Sécurité ») soit réglé sur le niveau « Moyen » (le niveau « Faible » étant fortement déconseillé)
2 : Le dossier « Macros complémentaires » étant considéré comme un emplacement fiable par l’outil de sécurité de Excel, la macro complémentaire s’exécutera sans message de confirmation quel que soit le niveau de sécurité choisi.
Quand je dis "interdire aux utilisateurs l’usage des menus et barres d’outils intégrées de Excel", je me place évidemment dans le cadre d'une application sous Excel et non pas dans celui de l'utilisation courante de Excel. Il ne s'agit pas de brimer ceux qui utilisent Excel pour leurs propres besoins !
Dans le cas d'une application, il me paraît légitime de remplacer les menus intégrés par ceux de l'application. D'une part, ça évite à l'utilisateur de l'application de se mélanger les pédales entre les menus intégrés et ceux qui sont propres à l'application (l'image jointe illustre mon propos...). Et d'autre part, ça évite par exemple que l'utilisateur "shunte" les procédures de fermeture de l'application en utilisant le menu intégré "Fichier / Fermer" au lieu du bouton ad hoc du menu de l'application.
Et il me semble que, dans une application, l'utilisateur de l'application n'a pas à faire ce qu'il veut mais seulement ce pour quoi l'application a été développée et ce que le développeur à prévu. Ne sommes-nous pas d'accord sur ce point ?
Oui et non
Mon cerveau reptilien étant plutôt Open Source
J'aime pas qu'on impose l'apparence des outils avec lesquels bosser.
(D'ailleurs actuellement je souffre, pas le droit d'utiliser l'invite MsDOS dans mon boulot actuel, et on m'impose IE 7 ! )
En ce qui me concerne je préfère accompagner un néophyte dans un apprentissage d'Excel que de le figer dans l'utilisation d'une appli qui fait peu de cas de son confort d'utilisation.
Quand on sait à quoi servent les menus d'Excel , on sait les utiliser donc pourquoi les cacher ?
Mais bon cela reste une histoire de point vue.
[fiction]
Si je devais bosser avec une de tes applis, la première chose que je ferais c'est de mettre en commentaires tout ton code VBA relatif à la gestion des menus, histoire de retrouver ma liberté de mouvement.
(Maintenant si dans mon contrat, il est stipulé je suis obligé d'utiliser ton appli telle quelle, je rongerai mon frein le temps de développer une appli que j'estimerai meilleure que la tienne sans tous ces menus personnalisés, j'irai voir le boss , pour lui soumettre cet nouvelle appli et alors ... 😀)
[/fiction]
Si l'appli gère des données critiques pour l'entreprise, les recopie sur plusieurs serveurs, les échange avec des machines distantes, etc..., on peut laisser l'utilisateur faire comme il l'entend ? Aïe aïe, bonjour les dégâts...
Et j'ai tiré une leçon de mon expérience en applications sous Excel : le plus difficile est :
1 : de faire quelque chose de vraiment ergonomique, intuitif et agréablement présenté
2 : d'imaginer toutes les fausses manip que pourrait faire
l'utilisateur et les solutions pour y parer
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD