Empecher affichage onglets excel VBA

Résolu
scribetout - 2 mars 2013 à 17:49
 scribetout - 5 mars 2013 à 13:19
Bonjour,

Avec les codes ci-dessous, j'affiche et masque les onglets de mon fichier
Sub Option_masquer_onglet()
 Option_cacher_onglet Macro
    Sheets("Menu").Select
    ActiveWindow.DisplayWorkbookTabs = False
End Sub
Sub Option_afficher_onglet()
    Sheets("Menu").Select
    ActiveWindow.DisplayWorkbookTabs = True
End Sub


Je voudrais en fait, empêcher les utilisateurs de faire apparaître les onglets via "OptionExcel". la navigation se fait via la feuille "Menu" par boutons. Il est possible que l'utilisateur fasse cette action en étant sur n'importe quelles feuilles, à la fin de sa manipulation il faudrait que les onglets se masquent et que la feuille "Menu" s'active; c'est ce que fait la 1ère macro. Je pense que je dois mettre du code dans Thisworkbook, mais quoi au juste.

Je vous remercie.

Bonne soirée!

38 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
4 mars 2013 à 11:13
Bonjour,

Malgré tous les intervenants qui t'ont dit que cela ne servirait à rien, si tu veux le faire quand même voici un programme qui désactive Outils-Option pour l'utilisateur. Il te suffit de regarder ce programme et l'adapter afin de le mettre dans ThisWorbook

http://www.vbfrance.com/codes/COLLECTION-ID_54002.aspx

@+ Le Pivert
0
Bonjour,

Je remercie tous ceux qui sont intervenus dans cette discussion. je vous rappelle que je suis débutant en VBA donc mes connaissances sont très limitées. N'étant plus en activité, je voulais concevoir un fichier et l'offrir gracieusement à mes anciens collègues. Car certains d'entre eux se faisaient flambées par leur chef, pour des erreurs de report (un bon millier) de valeurs. Donc, le fichier que je suis entrain de leur concevoir n'est une "forteresse". Comportant beaucoup de feuilles et de formules, j'ai décidais que la navigation, les saisies, consultations, graphiques et impressions ne se fassent que par Boutons et Formulaires. C'est pour leur éviter de faire de malencontreuses manipulations que j'ai eu cette idée d'empêcher l'activation de l'affichage des onglets, c'est peut-être une mauvaise idée.
(sur ancien fichier, l'un d'eux pour corriger une erreur à supprimer toutes les lignes d'une plage dynamique et à tout planter)

Je sais aussi qu'avec certains logiciels on peut "sauter" n'importe quelle protection et même avec code VBA. J'avais même lu quelque part qu'excel était une passoire.

Les gens pour qui je suis entrain de concevoir ce fichier ne sont pas au courant de mon projet. Je n'ai donc aucune contrainte de temps et vous avoue que je suis plus entêté qu'une mule. Je ne ménagerai pas mes efforts, mais je trouverai car c'est réalisable...

Messieurs, je vous remercie beaucoup.

* Si personne ne trouve autre chose à apporter à cette discussion, je vous prie de la considérer comme close.
__________________________________________________________________________
Impulsif mais pas du tout rancunier. Si vous n'apportez rien aux discussions, ignorez les. Rien ne vous oblige à y répondre. Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2013 à 12:52
Si personne ne trouve autre chose à apporter à cette discussion, je vous prie de la considérer comme close.

Ben :
- je t'ai donné plus haut de quoi empêcher (au seul niveau "normal" d'utilisation) la visualisation d'une feuille.
- la "forteresse" serait (pour éviter les malversations volontaires) de ne pas mettre en clair les données des feuilles concernées. Mais là, ce serait un autre sujet.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Cher Ucfoutu,

Merci d'être revenu. Je pense qu'il y eu des quiproquos entre nous, et m'en excuse si je suis en tort. Je ne suis qu'à mes début en VBA, par conséquent je ne cerne pas ou ne pose les problèmes comme vous les chevronnés repus au codage. Je fais appel donc à ta compréhension de mes grosses lacunes en la matière.

si j'ai bien compris ton code, il rend visible ou non une feuille active
Private Sub Worksheet_Activate()
 ActiveSheet.Visible = False ' ou true lorsqu'on veut la montrer, selon l'utilisateur.
End Sub

Dans ton commentaire tu as "selon l'utilisateur", mais ce n'est pas ça du tout (c'est quelque soit l'utilisateur). Je pense, que tu as fait le rapprochement des 2 discussions que j'ai ouvertes. Dans celle-ci, j'ai demandé que seule la feuille "Menu" soit visible et toutes les autres invisibles.

Le cas "selon utilisateur" était dans la 2ème discussion et les autorisations concernées l'affichage de différents formulaires. En reparlant de ce sujet, je pense que je vais changer de stratégie. Plus que les formulaires sont affichés par clic sur différents boutons de la feuille "Menu". Ils seront actifs ou inactifs selon l'authentification à l'ouverture du fichier. Celui-ci se fermera si l'utilisateur n'existe pas.
Qu'en penses-tu?

En te remerciant.
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2013 à 14:54
Dans ton commentaire tu as "selon l'utilisateur", mais ce n'est pas ça du tout (c'est quelque soit l'utilisateur)

He bien === >> False toujours et pas de condition.
Mais dis-moi : comment vas-tu, ensuite, toi, pouvoir la mettre à jour ?
En reparlant de ce sujet, je pense que je vais changer de stratégie.

Oui. Mais réfléchis d'abord longuement à la stratégie elle-eême (travail beaucoup plus lent et délicat que celui du développement subséquent, comme toujours).
J'ai l'habitude de le dire et le répéter : 80 % du temps consacré à la conception (et ce n'est pas là du développement). Le reste (le code) n'est que récitation et ne doit venir qu'ensuite.
Prends donc ton temps.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rebonjour,

voici ce que je fais mais j'ai un petit souci, la feuille "Menu" est l'avant-dernière feuille de mon classeur. Mais quand j’exécute le code, la dernière feuille est toujours visible. Je pourrais déplacer la feuille "Menu" pour qu'elle soit la dernière mais je voudrais comprendre pourquoi?
Sub Masquer_feuilles()
Dim F As Integer
    Application.ScreenUpdating = False
    For F = 1 To Worksheets.Count
        If Sheets(F).Name <> "Menu" Then
        Sheets("Menu").Activate
        Sheets(F).Visible = False
    End If
    Next F
    Application.ScreenUpdating = True

End Sub


Merci à tous ceux qui donneront un coup de main.
0
Le reste (le code) n'est que récitation et ne doit venir qu'ensuite.


Je te remercie pour ton conseil. En ce qui me concerne, je n'ai pas beaucoup d'expérience en codage et suis en phase d'apprentissage. Avec un projet un peu au-dessus de mes capacités. Mais je relève le challenge. Je n'ai rien à perdre mais tout à gagner. Plaisir personnel, progresser en VBA et surtout rendre service gracieusement à mes anciens collègues dans la galère.

Pour la stratégie, à l'authentification selon l'utilisateur la propriété des boutons "Locked sera à False ou True". Pour le codage, je n'ai fait que la partie changement de mot de passe. Pour le reste, mes recherches sont en cours.

Merci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2013 à 16:02
Cela ne te servirait de toutes manières pas, puisque, ainsi, tu retomùbes dans le cas de figure où il suffirait à l'utilisateur d'aller dans les onglets, cliquer droit = == >> afficher !!
Non ! Il est impératif de mettre le code que je t'ai indiqué dans CHACUNE des feuilles à cacher.
De cette manière (et de cette seule manière ), même lorsque l'utilisateur aura réaffiché, la feuille redeviendra invisible dès qu'il voudra y entrer
Ne cherche pas à faire autrement, ce serait peine perdue.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
4 mars 2013 à 16:06
je me permet de reintervenir aussi...
A la place du visible=false,
il est possible d'utiliser le XLSheetHidden ( voir dans mes messages précédents).
De cette façon, il n'est plus possible (il me semble), sauf par macro, de rendre les feuilles visibles.


Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
Je vous remercie beaucoup.
Eh, oui! Théorie, pratique, expérience et les règles de l'art sont les ingrédients qui différencient deux individus dans un même domaine.
J'ai trouvé ceci
With ActiveWindow
.DisplayWorkbookTabs = False
End With 

Sur ce fil Tapez le texte de l'url ici.
Qu'en pensez-vous?
Merci pour vos conseils. Je dois faire et refaire des tests jusqu'à satisfaction.

Cordialement,
Scribetout
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
4 mars 2013 à 17:13
Je voudrais en fait, empêcher les utilisateurs de faire apparaître les onglets via "OptionExcel".

Voilà ce que tu as demandé dans ton 1er message, pour l'obtenir tu mets ceci dans ThisWorkbook:


 Option Explicit
 Dim Tm, ctl
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 'rétabli les onglets
 ActiveWindow.DisplayWorkbookTabs = True
  'rétabli la réactivation des onglets
 Set Tm = Application.CommandBars(1).FindControl(ID:="30007")
For Each ctl In Tm.Controls
If ctl.ID = "522" Then
ctl.Enabled = Not ctl.Enabled
End If
Next
End Sub
Private Sub Workbook_Open()
'affiche la Feuil Menu
Sheets("Menu").Select
'cache les onglets
 ActiveWindow.DisplayWorkbookTabs = False
 'neutralise la réactivation des onglets
Set Tm = Application.CommandBars(1).FindControl(ID:="30007")
For Each ctl In Tm.Controls
If ctl.ID = "522" Then
ctl.Enabled = Not ctl.Enabled
End If
Next
End Sub


Voilà c'est simple et tu as ce que tu as demandé!

@+ Le Pivert
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2013 à 17:48
Bonjour, Le Pivert,
Vérifie quand-même que ce code fonctionne également avec Excel 2010.
Je n'ai pas Excel 2010, mais me rappelle avoir lu quelque part que ces choses ont été mises dans le ruban de l'application Excel et qu'il n'y a plus d'objet/collection CommandBar(s) dans le modèle d'objet.
A vérifier.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Messieurs bonsoir,

Je viens de tester le code de "Le Pivert", à l'ouverture du classeur après activation des macros, en effet toutes les feuilles deviennent invisibles et seule la feuille "Menu" est visible. Par contre, en passant par les options avancées d'Excel, l'affichage des feuilles se rétablit. Et c'est justement, ce que je cherche à éviter.

Cher Ucfoutu, concernant la version peu importe. Je travaille sur 2007 et conçois ce fichier pour mes amis qui travaillent sur Excel 2003.

je vous remercie pour l'intérêt que vous portez à cette discussion.

Bonne soirée!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
4 mars 2013 à 19:58
Utilise la propriété xlSheetVeryHidden pour les feuilles en plus d'un mot de passe sur le code et le classeur et personne ne pourra l'afficher sauf s'ils connaissent le mot de passe du code ou encore beaucoup de patience à le trouver avec un outil. Excel 2007 est beaucoup plus difficile à cracker...

For each feuille in Worksheets
   if feuille.name <> "Menu" then
      feuille.visible = xlSheetVeryHidden 
.....


Dans certains cas, il faudra réafficher des feuilles.
Si tu utilises Application.ScreenUpdating = False auparavant, l'utilisateur n'y verra rien. (Remettre à True en fin de procédure...)

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Messieurs je vous salue,

je suis parvenu à obtenir un résultat. Dans mon cas, en cliquant sur un des boutons situés sur le feuille "Menu", ça active une autre feuille et affiche une userform. Dans l'userform, choix avec combobox en cascade à la validation, cette feuille se remplit de données (coordonnées), il ne reste à l'utilisateur qu'à compléter le tableau obtenu. Archiver ces données dans une BD, imprimer et s'il le désire éditer en PDF.Idem pour les autres actions (Affiche feuille et userform).

Dans cette situation,je voulais que l'utilisateur ne puisse pas faire apparaître les autres feuilles. Je vous rappelle que mes connaissances en VBA sont rudimentaires.

Voici donc le code et vous en serai gré de le corriger (dans les cas où, il ne serait pas écrit dans les règles de l'art. Merci).
Je précise que ce code est mis dans le module "ThisWorkbook", Propriété: "SheetDesactivate".
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Dim feuille As Variant
Application.ScreenUpdating = False
    For Each feuille In Worksheets
       If feuille.Name <> "Menu" Then
       Sheets("Menu").Activate
       ActiveWindow.DisplayWorkbookTabs = False
       End If
    Next

End Sub

je vous remercie beaucoup. J'attends vos commentaires et critiques pour clore cette discussion.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 mars 2013 à 11:57
Bien.
Mais les feuilles réapparaissent en réactivant (options d'excel) l'affichage des onglets.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 mars 2013 à 12:56
Bon.
Peut-on, maintenant que "fini", observer une chose fondamentale ?
- les données de feuilles invisibles n'ont aucun autre intérêt que celui de leurs valeurs (on oublie donc la mise en forme)
- les données seules d'une feuille ne sont jamais rien d'autre que celle d'un tableau dynamique, dont l'exploitation les remplace très avantageusement.
- la "présentation" de données sur une feuille (donc l'utilisation "tremplin" de Excel) n'a de sens que si l'utilisateur peut les modifier directement sur la feuille. C'est la vocation même d'une feuille.
Voilà voilà ! l'existence même de ces feuilles cachées, utilisées en "tremplin Excel", en lieu et place de données "directes", n'a plus de réelle justification et induit une perte de performances.
Je sais donc déjà que cette appli sera "revue" un jour ou l'autre (lorsque les connaissances se seront développées).
Mais l'exercice en reste un et il faut bien commencer par du "gros" avant d'envisager du "fin"
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Messieurs Bonjour!

Réponse à Ucfoutu: En effet, en passant par les options avancées, les onglets s'affichent, mais dés que l'on quitte la feuille active, on retourne sur la feuille "Menu" et les onglets se masquent. Pour moi c'est suffisant. Je te remercie Beaucoup.

Pour MPi et Le Pivert: Je vous rappelle encore une fois que mes connaissances en VBA sont des plus limitées. Je vais tenter d'adapter vos propositions et espère y parvenir.

Mon but était tout simplement d'éviter aux utilisateurs de faire de malencontreuses manipulations sur certaines feuilles (archivage et formules).
Vu mon bas niveau en codage, mes codes plantés dès que je cachais ces feuilles, et n'ai pas su trouver une solution. J'ai donc continué ainsi et pour le moment je n'ai pas été déçu du résultat. Je crains de faire des erreurs et foutre tout en l'air. Je ferai un test sur une copie.

Je vous en suis gré pour votre réactivité. Merci beaucoup à tout le monde.
___________________________________________________________________________
MERCI A TOUS, RÉPONSE ACCEPTÉE!
0
Rejoignez-nous