Masquer les feuilles d'un classeur en VBA

Bonjour

J'ai un fichier dont le nom des feuilles s'étalent sur les 52 semaines de l'année (Dont 52 feuilles , avec d'autres feuilles des récapitulatifs mensuels du genre Janvier2018)

Le nom des feuilles est de la manière suivante : S142018 qui représente la 14 ième semaine de l'année 2018.

Je voudrais créer une macro qui affiche la feuille de la semaine en cours et du mois en cours, et les feuilles qui ont dans leur nom "S14" c'est à dire la semaine en cours, et les autres feuilles restent masquées.

J'ai ressorti le numéro de la semaine en cours dans une cellule avec la fonction NO.SEMAINE

Merci d'avance pour cette précieuse assistance

En pièce jointe un exemple de fichier test.

24test.xlsx (9.79 Ko)

bonjour,

une proposition

Sub aargh()
    sem = "S" & Application.WorksheetFunction.IsoWeekNum(Now)
    For Each ws In Sheets
        If InStr(ws.Name, sem) = 0 Then ws.Visible = False Else ws.Visible = True
    Next ws
End Sub

Merci h2so4

C'est déjà une très bonne avancée.

Mais lorsque je change de date dans B1 où se trouve la date, cela ne masque plus.

J'ai affecté un bouton déjà à cette macro

Merci pour votre aide déjà.

bonsoir,

la date utilisée pour déterminer la semaine est la date du jour now

 sem = "S" & Application.WorksheetFunction.IsoWeekNum(Now)

s'il faut prendre la date en B1, il faut remplacer now par sheets("nomdelafeuillequivabien").range("B1")

Bonsoir

Et merci une fois de lus pour ton aide précieuse

J'ai crée maintenant une feuille "Accueil" qui sera pour moi comme un menu principal dans lequel je mets en cellule B1 une date quelconque.

Mais en utilisant le code, cela me masque aussi la feuille Accueil

Merci d'avance

bonjour,

c'est normal "Accueil" ne contient pas de "S" suivi d'un n° de semaine

adaptation du code

Sub aargh()
    sem = "S" & Application.WorksheetFunction.IsoWeekNum(Now)
    For Each ws In Sheets
if ucase(ws.name) <>"ACCUEIL" then 
        If InStr(ws.Name, sem) = 0 Then ws.Visible = False Else ws.Visible = True
end if
    Next ws
End Sub

Merci

Ça marche maintenant

Pour aller un peu loin....

1e cas: Pour les numéros de semaine étant inférieur à 10, NO.SEMAINE renvoie 1,2,3,4,5,6,7,........

Or moi j'ai les noms des semaines par S01,S02....ETC

Comment remédier à cela ??????

2e cas: Puisqu'il y'a des feuilles JANVIER2018,FEVRIER2018......qui font le récap du mois en cours,comment aussi afficher cette feuille JANVIER2018 par exemple si nous sommes dans le mois en cours saisie dans la cellule B1

Merci pour votre précieuse aide

bonjour,

code adapté

Sub aargh()
    d = DateValue("04/01/2017") ' à adapter
    sem = "S" & Format(Application.WorksheetFunction.IsoWeekNum(d), "00")
    mois = UCase(Format(d, "mmmmyyyy"))
    For Each ws In Sheets
        sn = UCase(ws.Name)
        If sn <> "ACCUEIL" Then
            If InStr(sn, sem) = 0 And InStr(sn, mois) = 0 Then ws.Visible = False Else ws.Visible = True
        End If
    Next ws
End Sub

Bonjour une fois de plus h2s04

J'ai bien testé le code et il fonctionne .

Pour aller un peu loin et personnaliser ce boulot, j'ai crée une liste déroulante des semaines dans une cellule (D9) et un bouton (ou une forme ) "Valider"

En cliquant sur ce bouton, à partir du choix de la liste déroulante, je voudrais faire apparaitre les feuilles liées à la semaine c'est à dire :

  • pour S0472017, avoir les feuilles S472017,CodirS47,HedoS47 et Novembre2017 ...c'est à dire de la semaine en cours et les autres masquées
  • pour S012018, avoir les feuilles S012018,......les autres qui portent S01 s'il y'en a....et toujours Janvier2018 qui représente le recap du mois de la semaine choisi; les autres non concernées toujours masquées.

Bien sûr la feuille "Accueil" devra toujours être visible et au démarrage.

PS: Je joins ici un fichier pour l'exemple

Merci encore pour ces différentes explications.

17test.xlsx (13.69 Ko)

bonjour

code adapté. note que le nom des onglets contenant un mois doivent commencer par un majuscule et être suivie de minuscules

Sub aargh()
    d = Sheets("Accueil").Range("D9")
    sem = Left(d, 3)
    a = Right(d, 4)
    d = 7 * Right(sem, 2) + DateSerial(a, 1, 3) - Application.WorksheetFunction.Weekday(DateSerial(a, 1, 3)) - 5
    mois = Format(d, "mmmmyyyy")
    For Each ws In Sheets
        sn = UCase(ws.Name)
        If sn <> "ACCUEIL" Then
            If InStr(sn, sem) = 0 And InStr(sn, mois) = 0 Then ws.Visible = False Else ws.Visible = True
        End If
    Next ws
End Sub

Bonsoir

Çà marche mais un petit ajustement

L'onglet contenant le mois aussi reste masqué.....par exemple sur S472017, nous devons avoir Novembre 2017 ou alors sur en affichant S012018, nous devons aussi voir s'afficher Janvier2018

Mais ces derniers restent masqués.....

Merci pour cette considérable avancée.

bonjour,

exécute ce code et dis-moi ce qu'il affiche dans la fenetre popup

Sub aargh()
    d = Sheets("Accueil").Range("D9")
    sem = Left(d, 3)
    a = Right(d, 4)
    d = 7 * Right(sem, 2) + DateSerial(a, 1, 3) - Application.WorksheetFunction.Weekday(DateSerial(a, 1, 3)) - 5
    mois = Format(d, "mmmmyyyy")
    MsgBox "onglet mois à sélectionner " & mois
    For Each ws In Sheets
        sn = UCase(ws.Name)
        If sn <> "ACCUEIL" Then
            If InStr(sn, sem) = 0 And InStr(sn, mois) = 0 Then ws.Visible = False Else ws.Visible = True
        End If
    Next ws
End Sub

Ok

Il affiche une MsgBox avec le message "Onglets du mois à sélectionner"

Peut être je me suis fait mal comprendre ou mal exprimé

Le fichier est composé par exemple des onglets S472017,CodirS47,HedoS47,Novembre2017 ....tous ceci représente les onglets liés à cette semaine dont en choisissant cette semaine...si ces feuilles sont dans le fichier, elle doit être visible et les autres masquées.

Pour le moment les feuilles sont bien visibles par la macro, sauf celle du mois en cours qui représente le récapitulatif .....

Par exemple en choisissant S012018,l'onglet Janvier2018 est masqué

Merci

11test.xlsx (13.69 Ko)

Bonjour,

j'ai bien compris. Si l'onglet mois n'est pas sélectionné c'est que la macro ne trouve pas le mois en question dans le onglet, cela peut être soit dû au fait qu'effectivement l'onglet n'y est pas, cela peut être dû au fait que la variable mois dans la macro ne contient pas la bonne valeur. d'où ma demande de tester avec ce nouveau code pour afficher le contenue de cette variable mois, Comme je ne dispose pas d'une version FR, mes possibilités de tests sont limitées.

Si lamacro était ok, le message aurait du afficher le nom du mois suivi de l'année. mais ce n'est pas le cas. tu confirmes qu'il n'affiche que "onglet du mois à sélectionner " sans rien d'autre ?

Bonsoir

Oui je confirme

Elle affiche "onglet du mois à selectionner Janvier2018" quand j'introduis S012018 dans ladite cellule

Merci

Bonsoir,

correction

Sub aargh()
    d = Sheets("Accueil").Range("D9")
    sem = Left(d, 3)
    a = Right(d, 4)
    d = 7 * Right(sem, 2) + DateSerial(a, 1, 3) - Application.WorksheetFunction.Weekday(DateSerial(a, 1, 3)) - 5
    mois = Format(d, "mmmmyyyy")
    For Each ws In Sheets
        sn = ws.Name
        If sn <> "ACCUEIL" Then
            If InStr(sn, sem) = 0 And InStr(sn, mois) = 0 Then ws.Visible = False Else ws.Visible = True
        End If
    Next ws
End Sub

Bonjour une fois de plus

Çà ne marche toujours pas

La feuille récapitulative par exemple Janvier2018 reste toujours masqué quand on choisit S012018.

Mais le reste fonctionne parfaitement.

Merci pour tout

Peut être il faudrait procéder autrement?????

Bonne journée

Bonjour,

une autre manière de faire.

j'ai mis la liste des mois en début de macro, à adapter en fonction du mois dans tes onglets (avec ou sans accents par exemple)

Sub aargh()
    m = Split("Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre", ",")
    d = Sheets("Accueil").Range("D9")
    sem = Left(d, 3)
    a = Right(d, 4)
    d = 7 * Right(sem, 2) + DateSerial(a, 1, 3) - Application.WorksheetFunction.Weekday(DateSerial(a, 1, 3)) - 5
    mois = m(Month(d) - 1) & a
    For Each ws In Sheets
        sn = ws.Name
        If sn <> "ACCUEIL" Then
            If InStr(sn, sem) = 0 And InStr(sn, mois) = 0 Then ws.Visible = False Else ws.Visible = True
        End If
    Next ws
End Sub

Bonjour tout le monde

Juste pour ajouter ma pierre à l’édifice et pour faire découvrir à certains de nouvelle fonctionnalités liés aux feuilles excel

On peut faire comme vous le savez:

Pour cacher

Sheets("Sheet1").Visible = False

Ou bien encore le faire à la main bien-sûr clic droit => Masquer

Pour afficher

Sheets("Sheet1").Visible = True

Ou bien encore le faire à la main bien-sûr clic droit => Afficher

Cependant des fois on aimerait bien cacher des informations... mais la solution la plus retenue est juste de protéger la feuille en écriture mais il existe une autre solution un peu plus pratique si possible à mon sens (utilisable seulement par macro) :

Sheets("Sheet1").Visible = xlVeryHidden

Faite le test chez vous et la…. Excel ne vous propose pas le menu « Afficher » alors que vous venez de cacher la feuille ! elle est…. Vraiment cachée oh oh oh le jeu de mot

Elle reste accessible par macro pour trier des données, copier/coller bref comme on peut tout faire sauf je crois un copier/coller par macro (dans ce cas la il suffit de bloquer le refresh écran avec un application.screenupdate = false, d’afficher la feuille , de la copier, de la cacher en veryhiden à nouveau et de remettre l’update de screen pour cela soit transparent pour l’utilisateur)

Pour la ré afficher il suffit de refaire un Sheets("Sheet1").Visible

Je pourrais donner des exemples concret d'utilisation si ça intéresse des gens ici ou par MP.

Il suffit de mettre un mot de passe sur les macros et voila

Bien-sur si l’utilisateur tente de créer une feuille avec le nom « Sheet1» cela lui fait une erreur comme quoi elle existe déjà …. SURPRISE

Et forcément, Excel reste Excel, on peut passer à travers ce genre de technique mais cela reste hors de portée des utilisateurs lamba et de cette façon ils ne peuvent pas voir les informations directement.

ECG

Rechercher des sujets similaires à "masquer feuilles classeur vba"