XL 2016 [Résolu]Masquer une feuille en fonction de cellules

Menibelus

XLDnaute Nouveau
Bonjour,

Je souhaite masquer certaine feuille de mon classeur en fonction du contenu de certaines cellules.
Dans ma feuille "Paramètre" si les cellules O à Z contiennent un x alors on affiche la feuille correspondante
Les ligne de 7 à 24 correspondent aux agents de 1 à 18
Mot de passe vba : xb8r2k85
Ce code pour masquer
VB:
Private Sub Workbook_Open()
With Sheets(Paramètre)
If .Range("O7") = "" And .Range("P7") = "" And .Range("Q7") = "" And .Range("R7") = "" And .Range("S7") = "" And .Range("T7") = "" And .Range("U7") = "" And .Range("V7") = "" And .Range("W7") = "" And .Range("X7") = "" And .Range("Y7") = "" And .Range("Z7") = "" Then Sheets(Agent_1).Visible = False
End If
If .Range("O8") = "" And .Range("p8") = "" And .Range("q8") = "" And .Range("r8") = "" And .Range("s8") = "" And .Range("t8") = "" And .Range("u8") = "" And .Range("v8") = "" And .Range("w8") = "" And .Range("x8") = "" And .Range("y8") = "" And .Range("z8") = "" Then Sheets(Agent_2).Visible = False
End If
If .Range("O9") = "" And .Range("p9") = "" And .Range("q9") = "" And .Range("r9") = "" And .Range("s9") = "" And .Range("t9") = "" And .Range("u9") = "" And .Range("v9") = "" And .Range("w9") = "" And .Range("x9") = "" And .Range("y9") = "" And .Range("z9") = "" Then Sheets(Agent_3).Visible = False
End If
If .Range("O10") = "" And .Range("p10") = "" And .Range("q10") = "" And .Range("r10") = "" And .Range("s10") = "" And .Range("t10") = "" And .Range("u10") = "" And .Range("v10") = "" And .Range("w10") = "" And .Range("x10") = "" And .Range("y10") = "" And .Range("z10") = "" Then Sheets(Agent_4).Visible = False
End If
If .Range("O11") = "" And .Range("p11") = "" And .Range("q11") = "" And .Range("r11") = "" And .Range("s11") = "" And .Range("t11") = "" And .Range("u11") = "" And .Range("v11") = "" And .Range("w11") = "" And .Range("x11") = "" And .Range("y11") = "" And .Range("z11") = "" Then Sheets(Agent_5).Visible = False
End If
If .Range("O12") = "" And .Range("p12") = "" And .Range("q12") = "" And .Range("r12") = "" And .Range("s12") = "" And .Range("t12") = "" And .Range("u12") = "" And .Range("v12") = "" And .Range("w12") = "" And .Range("x12") = "" And .Range("y12") = "" And .Range("z12") = "" Then Sheets(Agent_6).Visible = False
End If
If .Range("O13") = "" And .Range("p13") = "" And .Range("q13") = "" And .Range("r13") = "" And .Range("s13") = "" And .Range("t13") = "" And .Range("u13") = "" And .Range("v13") = "" And .Range("w13") = "" And .Range("x13") = "" And .Range("y13") = "" And .Range("z13") = "" Then Sheets(Agent_7).Visible = False
End If
If .Range("O14") = "" And .Range("p14") = "" And .Range("q14") = "" And .Range("r14") = "" And .Range("s14") = "" And .Range("t14") = "" And .Range("u14") = "" And .Range("v14") = "" And .Range("w14") = "" And .Range("x14") = "" And .Range("y14") = "" And .Range("z14") = "" Then Sheets(Agent_8).Visible = False
End If
If .Range("O15") = "" And .Range("p15") = "" And .Range("q15") = "" And .Range("r15") = "" And .Range("s15") = "" And .Range("t15") = "" And .Range("u15") = "" And .Range("v15") = "" And .Range("w15") = "" And .Range("x15") = "" And .Range("y15") = "" And .Range("z15") = "" Then Sheets(Agent_9).Visible = False
End If
If .Range("O16") = "" And .Range("p16") = "" And .Range("q16") = "" And .Range("r16") = "" And .Range("s16") = "" And .Range("t16") = "" And .Range("u16") = "" And .Range("v16") = "" And .Range("w16") = "" And .Range("x16") = "" And .Range("y16") = "" And .Range("z16") = "" Then Sheets(Agent_10).Visible = False
End If
If .Range("O17") = "" And .Range("p17") = "" And .Range("q17") = "" And .Range("r17") = "" And .Range("s17") = "" And .Range("t17") = "" And .Range("u17") = "" And .Range("v17") = "" And .Range("w17") = "" And .Range("x17") = "" And .Range("y17") = "" And .Range("z17") = "" Then Sheets(Agent_11).Visible = False
End If
If .Range("O18") = "" And .Range("p18") = "" And .Range("q18") = "" And .Range("r18") = "" And .Range("s18") = "" And .Range("t18") = "" And .Range("u18") = "" And .Range("v18") = "" And .Range("w18") = "" And .Range("x18") = "" And .Range("y18") = "" And .Range("z18") = "" Then Sheets(Agent_12).Visible = False
End If
If .Range("O19") = "" And .Range("p19") = "" And .Range("q19") = "" And .Range("r19") = "" And .Range("s19") = "" And .Range("t19") = "" And .Range("u19") = "" And .Range("v19") = "" And .Range("w19") = "" And .Range("x19") = "" And .Range("y19") = "" And .Range("z19") = "" Then Sheets(Agent_13).Visible = False
End If
If .Range("O20") = "" And .Range("p20") = "" And .Range("q20") = "" And .Range("r20") = "" And .Range("s20") = "" And .Range("t20") = "" And .Range("u20") = "" And .Range("v20") = "" And .Range("w20") = "" And .Range("x20") = "" And .Range("y20") = "" And .Range("z20") = "" Then Sheets(Agent_14).Visible = False
End If
If .Range("O21") = "" And .Range("p21") = "" And .Range("q21") = "" And .Range("r21") = "" And .Range("s21") = "" And .Range("t21") = "" And .Range("u21") = "" And .Range("v21") = "" And .Range("w21") = "" And .Range("x21") = "" And .Range("y21") = "" And .Range("z21") = "" Then Sheets(Agent_15).Visible = False
End If
If .Range("O22") = "" And .Range("p22") = "" And .Range("q22") = "" And .Range("r22") = "" And .Range("s22") = "" And .Range("t22") = "" And .Range("u22") = "" And .Range("v22") = "" And .Range("w22") = "" And .Range("x22") = "" And .Range("y22") = "" And .Range("z22") = "" Then Sheets(Agent_16).Visible = False
End If
If .Range("O23") = "" And .Range("p23") = "" And .Range("q23") = "" And .Range("r23") = "" And .Range("s23") = "" And .Range("t23") = "" And .Range("u23") = "" And .Range("v23") = "" And .Range("w23") = "" And .Range("x23") = "" And .Range("y23") = "" And .Range("z23") = "" Then Sheets(Agent_17).Visible = False
End If
If .Range("O24") = "" And .Range("p24") = "" And .Range("q24") = "" And .Range("r24") = "" And .Range("s24") = "" And .Range("t24") = "" And .Range("u24") = "" And .Range("v24") = "" And .Range("w24") = "" And .Range("x24") = "" And .Range("y24") = "" And .Range("z24") = "" Then Sheets(Agent_18).Visible = False
End If
End With
Worksheets("Accueil").Select
End Sub

et celui-ci pour afficher dans chaque feuille d'agent :
VB:
With Sheets(Paramètre)
If .Range("O7") <> "" And .Range("p7") <> "" And .Range("q7") <> "" And .Range("r7") <> "" And .Range("s7") <> "" And .Range("t7") <> "" And .Range("u7") <> "" And .Range("v7") <> "" And .Range("w7") <> "" And .Range("x7") <> "" And .Range("y7") <> "" And .Range("z7") <> "" Then Sheets(Agent_1).Visible = True
End If

Mais cela ne fonctionne pas et je ne comprend pas pourquoi
Quelqu'un pourrait-il m'aider ?
 

Pièces jointes

  • Planning 2017_v001.xlsm
    1.9 MB · Affichages: 82
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir à tous

Menibelus (bienvenue sur le forum)
Juste pour infos
La protection du projet VBA est illusoire*.
Il suffit de quelque secondes pour la supprimer (et pas besoin du mot de passe)
Il est bon de la savoir avant de se fatiguer en vain ;)

*: Le net regorge de sites qui détaillent le mode opératoire pour ce faire.
 

Paf

XLDnaute Barbatruc
Bonsoir Menibelus, Staple1600,

Mais cela ne fonctionne pas et je ne comprend pas pourquoi

le message d'erreur et la ligne concernée donnerait de précieuses indications.
D'autant que mon convertisseur pour XL2003 ne peut pas ouvrir le classeur joint(??)

Mais.... a priori, si les feuilles sont nommées : Agent_1, Agent_2, ....
Sheets(Agent_1).Visible... ne peut fonctionner.

Sans " " , Agent_1 est condidéré comme une variable et on tente alors d'ouvrir la feuille du nom du contenu de la variable.

Il faudrait Sheets("Agent_1").Visible

A+
 

Paf

XLDnaute Barbatruc
re,

un essai d'optimisation du code:
Code:
For i = 7 To 24
    If Application.WorksheetFunction.CountIf(.Range("O" & i & ":Z" & i), "X") = 12 Then
        Sheets("Agent_" & i - 6).Visible = True
    End If
    If Application.WorksheetFunction.CountIf(.Range("O" & i & ":Z" & i), "X") = 0 Then
        Sheets("Agent_" & i - 6).Visible = False
    End If
Next

A+
 

Staple1600

XLDnaute Barbatruc
Bonjour Paf

Si j'étais moi, puisqu'on teste si de nombreuses cellules sont vides, je simplifierai le test avec Application.CountBlank

EDITION:Ah bah, oui ,j'avais zappé le X ;)
(et comme tu as posté avant moi, ma proposition n'en est plus une)

Oui c'est plus simple dans ce sens ;)

Néanmoins, mon premier message reste vrai ;)
 
Dernière édition:

Paf

XLDnaute Barbatruc
re Staple1600

la demande manque un peu de précision:
si les cellules O à Z contiennent un x alors on affiche la feuille correspondante

mais le code teste sur vide ou non vide

alors faut il
des x partout pour démasquer et des x nulle part pour masquer ?
aucun vide pour démasquer et tout vide pour masquer ?
et autres combinaisons ....

des réponses dépendront la proposition.

Bonne soirée
 

Staple1600

XLDnaute Barbatruc
Re

Quelle que soit la précision de la demande, est-il raisonnable de s'échiner à développer du code VBA dédiée à une illusoire protection qui peut être rendu inefficace si facilement *?

Moi je dis, non

Et toi?

*: Dans le cas présent, le planning est ouvert puis on l'enregistrer en *.xlsx
Ensuite ALT+F11 puis on mets la propriété Visible des feuilles sur True.
 

Paf

XLDnaute Barbatruc
re,

Est ce qu'il vaut mieux une porte grande ouverte ou une porte fermée à clé sachant qu'il existe des techniques d'effraction ?
Quand la protection augmente,le nombre d'effraction diminue...

Il n'y a pas que des malveillants, il y a des étourdis, des "touche à tout" aussi...
Si ça peut rebuter les curieux et les moins obstinés, c'est déjà ça ......

A+
 

Staple1600

XLDnaute Barbatruc
Re

Certes.
Moi c'est juste le côté temps investi à développer du VBA tout en sachant qu'en moins de 10 secondes cela peut disparaître qui me chagrine.

Et qu'il y a t-il de rebutant à enregistrer une copie du classeur en *.xlsx (donc sans VBA) ?

NB: A mon boulot, j'utilise un logiciel avec login basé sur le login Windows (et différents type de profils selon l'utilisateur)
Bah là, même si tu es curieux, tu ne peux rien faire, tu n'as accès qu'au menus liés à ton profil.
Evidemment c'est un logiciel qui ne tourne pas sous Excel.
 

Paf

XLDnaute Barbatruc
re,

dans le cas présent le temps investi n'est pas énorme ( enfin il a fallu taper tout le code quand même !!)

Mais c'est sûr que dans la mesure où il n'existe pas de protection incontournable, ce n'est pas la peine d'essayer d'inventer des usines à gaz.

Mais ce n'est pas la peine de laisser tout ouvert non plus.

A+
 

Staple1600

XLDnaute Barbatruc
Re

Dans mon cas, ce n'est pas contournable
1) PC bridé (master Seven remanié par DSI)
2) Logiciel utilisateur sous Citrix (sans accès internet)
(avec tracelog de toutes les actions utilisateur)
3) Connexion obligatoire sur son seul poste de travail (login Windows + IP fixe)

Quand bien même, je voudrais soulever le capot, je ne peux l'atteindre, obligé de rester sur la banquette arrière toute la sainte journée.:D

Heureusement, ils m'ont laissé mon VBA dans mon Excel, mais avec le logiciel en question, je ne peux faire que ce que mon profil m'autorise à faire ni plus, ni moins.
(et parfois moins quand ils oublient de paramétrer des accès à des menus nécessaires à mon job :rolleyes:)
 

Menibelus

XLDnaute Nouveau
re Staple1600

la demande manque un peu de précision:


mais le code teste sur vide ou non vide

alors faut il
des x partout pour démasquer et des x nulle part pour masquer ?
aucun vide pour démasquer et tout vide pour masquer ?
et autres combinaisons ....

des réponses dépendront la proposition.

Bonne soirée
Un x suffit pour démasquer la feuille correspondante et tout vide pour masquer
Pour la protection du vba c'est pour éviter de fausse manip, car effectivement je sais que ce n'est pas très sécuritaire.
Pour les feuilles je souhaite les masquer pour avoir un classeur plus clair et n'affichant que les feuilles utilisées

Merci pour votre aide, j'attends vos éventuelles propositions
En voici une mais qui me renvoi l'erreur "l'indice n'appartient pas à la selection"
VB:
Option Explicit

Private Sub Workbook_Open()
Dim wb As Workbook
Dim ws As Worksheet
Dim I As Long, k As Long
Dim x As Double

  Application.ScreenUpdating = False

  Set wb = ThisWorkbook
  Set ws = wb.Worksheets("Paramètre")

  With ws
  For I = 7 To 24
  k = k + 1
  x = Application.CountA(.Range(.Cells(I, "O"), .Cells(I, "Z")))
  If x <> 12 Then wb.Worksheets("Agent_" & k).Visible = False
  Next
  End With
   
  Application.Goto wb.Worksheets("Accueil").Cells(1)
   
  Set ws = Nothing: Set wb = Nothing

End Sub
 

Pièces jointes

  • Planning 2017_v001.xlsm
    1.9 MB · Affichages: 81

Paf

XLDnaute Barbatruc
re,

Merci pour votre aide, j'attends vos éventuelles propositions

celle du post 4 ne conviendrait-elle pas ?

avec quelques aménagements pour prendre en compte les nouvelles précisions...:

Un x suffit pour démasquer la feuille correspondante et tout vide pour masquer

Code:
If Application.WorksheetFunction.CountIf(.Range("O" & i & ":Z" & i), "X") > 0 Then
        ' démasque
Else
        'masque
End If

Quant au code que vous soumettez au post 12, voyez avec le forum qui vous l'a proposé !!! :
http://forum.excel-pratique.com/exc...en-fonction-du-contenu-de-cellule-t84129.html
http://forum.excel-pratique.com/exc...en-fonction-du-contenu-de-cellule-t84129.html
Il aurait été plus correct de signaler que vous aviez la même discussion sur plusieurs forums!!

A+
 

Menibelus

XLDnaute Nouveau
re,



celle du post 4 ne conviendrait-elle pas ?

avec quelques aménagements pour prendre en compte les nouvelles précisions...:



Code:
If Application.WorksheetFunction.CountIf(.Range("O" & i & ":Z" & i), "X") > 0 Then
        ' démasque
Else
        'masque
End If

Quant au code que vous soumettez au post 12, voyez avec le forum qui vous l'a proposé !!! :
http://forum.excel-pratique.com/exc...en-fonction-du-contenu-de-cellule-t84129.html
Il aurait été plus correct de signaler que vous aviez la même discussion sur plusieurs forums!!

A+
Désolé, je ne voulais froisser personne, je cherche juste une réponse à mon problème. Pour le code soumis au post 12 je vois avec le forum concerné pas de soucis. :oops:
Je suis un novice en vba, je ne comprend donc pas toutes les subtilités de ce langage.
La solution du post 4 peut me convenir, seulement je souhaiterai quelques précisions pour la mettre en place.
Je dois mettre le code dans ThisWorkbook mais comment?
Comme ceci
VB:
Option Explicit

Private Sub Workbook_Open()
With Sheets(Paramètres)
For I = 7 To 24
  If Application.WorksheetFunction.CountIf(.Range("O" & I & ":Z" & I), "X") = 12 Then
  Sheets("Agent_" & I - 6).Visible = True
  End If
  If Application.WorksheetFunction.CountIf(.Range("O" & I & ":Z" & I), "X") = 0 Then
  Sheets("Agent_" & I - 6).Visible = False
  End If
Next
End With
End Sub
Seulement, j'ai l'erreur pour I variable non defini :(
 

Paf

XLDnaute Barbatruc
re,

Je dois mettre le code dans ThisWorkbook mais comment?
vous le mettez à la place de votre code (celui proposé au post 1).

j'ai l'erreur pour I variable non defini

Option Explicit, en tête de module, signifie que toutes les variables doivent être déclarées. et le message d'erreur est clair.
Juste après Private Sub Workbook_Open(), ajoutez:

Code:
Dim i as Integer

A+
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 678
dernier inscrit
arno12345678