VBA masquer ou afficher plusieurs feuilles d'un coup

Bonsoir au forum,

Je souhaiterais afficher ou masquer plusieurs feuilles,

Sub Macro2()
    With Sheets(Array("saisie", "Bon_CCP", "Balance", "Bilan1", "Etat_Rappr"))
        .Visible = True
    End With
End Sub

Ce code ne marche pas !

quelle est mon erreur ?

Bonne soirée

Claude.

Bonsoir Claude,

Edit Dan : vois la réponse de Felix

Dan

Bonsoir,

Claude, ton code fonctionne parfaitement, pour peu que tu aies bien le nom des onglets correctement orthographiés..........

Edit :

après quelques essais, on peut masquer (False), mais pas super-masquer (xlVeryHidden), ni rendre visible, avec ce code

tu peux essayer ce code, qui marche, quoiqu'il arrive :

For Each sh In Array("Feuil2", "Feuil3")
    Sheets(sh).Visible = xlVeryHidden
Next sh

re, Dan et felix

C'était bon à savoir !

j'ai donc mis çà en place :

Sub felix()  'masquer
    For Each sh In Array("saisie", "Bon_CCP", "Balance", "Bilan1", "Etat_Rappr")
        Sheets(sh).Visible = xlVeryHidden
    Next sh
End Sub

et :

Sub felix2()  'afficher
    For Each sh In Array("saisie", "Bon_CCP", "Balance", "Bilan1", "Etat_Rappr")
        Sheets(sh).Visible = True
    Next sh
End Sub

et là çà marche à tous les coups.

Bravo felix et merci à vous deux

à+.....Claude.

Bonjour,

Merci pour ce code, seulement j'essaie de le transposer pour Feuil12 à 40 mais je n'arrive pas.

Mon but serait de pouvoir masquer ou afficher ces feuilles en les appelant par leur CodeName et non par leur Nom car elles peuvent être renommées.

Leur affichage dépendrait de la valeur de la cellule A1 de leur feuille: 0 > maquer, différent de 0 afficher

Comme d'habitude, en attendant de vous lire !

re, Dan et felix

C'était bon à savoir !

j'ai donc mis çà en place :

Sub felix()  'masquer
    For Each sh In Array("saisie", "Bon_CCP", "Balance", "Bilan1", "Etat_Rappr")
        Sheets(sh).Visible = xlVeryHidden
    Next sh
End Sub

et :

Sub felix2()  'afficher
    For Each sh In Array("saisie", "Bon_CCP", "Balance", "Bilan1", "Etat_Rappr")
        Sheets(sh).Visible = True
    Next sh
End Sub

et là çà marche à tous les coups.

Bravo felix et merci à vous deux

à+.....Claude.

Bonsoir majormadj,

attention : il y a une petite contradiction dans ton énoncé : d'une part tu écris que c'est pour les feuilles 12 à 40 ; d'autre part, tu veux que ce soit selon le CodeName de la feuille ; pour le 1er cas, on aurait pu utiliser l'index de la feuille Worksheets(i) dans une boucle i de 12 à 40 ; pour le 2ème cas, je te propose le fichier Excel ci-dessous (solution qui est indépendante de la position d'une des feuilles dans le classeur : c'est bien selon le CodeName et pas la position).

sauf si le CodeName de tes feuilles est top secret, tu aurais pu l'indiquer, ce qui m'aurais permis de mettre la liste exacte de ces CodeName dans le code VBA ; donc à défaut, j'en ai inventé trois.

251exo-majormadj.xlsm (17.16 Ko)

en fait, tu verras 2 solutions possibles dans le code VBA ➯ 2 macros Essai1() et Essai2() ; à toi de choisir la solution qui te convient le mieux, mais dans les 2 cas, pour ton vrai classeur, tu devras modifier le code pour indiquer quel est le CodeName de chacune de tes feuilles 12 à 40 (mon fichier exemple est pour 3 feuilles seulement, en plus d'une 1ère feuille qui doit exister forcément).

en effet, si on masque toutes les feuilles ayant un CodeName qui correspond à celui de tes feuilles 12 à 40, il faut d'abord sélectionner une autre feuille (ici la 1ère du classeur) avant de masquer les feuilles ; ceci afin que la feuille qui va être masquée ne soit pas celle qui est active ! (sinon, ce serait comme de scier la branche sur laquelle on est assis ! )

si besoin, tu peux demander une adaptation.

merci de me donner ton avis.

dhany

@majormadj

relis entièrement mon post précédent car je l'ai beaucoup modifié ; si tu veux essayer mon fichier Excel, tu dois cliquer sur le lien vert Exo majormadj.xlsm du post précédent pour le télécharger. (y'aura pas de transfert automatique sur ton PC ! )

dhany

Je parlais bien de CodeName et pas de position, merci pour votre réactivité et à cette heure en plus !!!

Je regarde ça

C'est bien l'idée que je veux, seulement:

- est-il possible de ne pas écrire tous les CodeName dans mon code sachant que mes feuilles auront pour CodeName celui d'origine Feuil12 à Feuil40. J'ai essayé avec une variable .CodeName = "Feuil" & I" mais je n'y arrive pas.

- Est-il possible de changer le nom de chacune de ses feuilles, et non le CodeName, qui se situe sur la cellule C4 de chaque feuille.

C'est pour cette raison que je veux travailler sur le CodeName de chaque feuille de Feuil12 à Feuil40 car le nom pourra changer.

D'avance merci !

Bonsoir majormadj,

attention : il y a une petite contradiction dans ton énoncé : d'une part tu écris que c'est pour les feuilles 12 à 40 ; d'autre part, tu veux que ce soit selon le CodeName de la feuille ; pour le 1er cas, on aurait pu utiliser l'index de la feuille Worksheets(i) dans une boucle i de 12 à 40 ; pour le 2ème cas, je te propose le fichier Excel ci-dessous (solution qui est indépendante de la position d'une des feuilles dans le classeur : c'est bien selon le CodeName et pas la position).

sauf si le CodeName de tes feuilles est top secret, tu aurais pu l'indiquer, ce qui m'aurais permis de mettre la liste exacte de ces CodeName dans le code VBA ; donc à défaut, j'en ai inventé trois.

Exo majormadj.xlsm

en fait, tu verras 2 solutions possibles dans le code VBA ➯ 2 macros Essai1() et Essai2() ; à toi de choisir la solution qui te convient le mieux, mais dans les 2 cas, pour ton vrai classeur, tu devras modifier le code pour indiquer quel est le CodeName de chacune de tes feuilles 12 à 40 (mon fichier exemple est pour 3 feuilles seulement, en plus d'une 1ère feuille qui doit exister forcément).

en effet, si on masque toutes les feuilles ayant un CodeName qui correspond à celui de tes feuilles 12 à 40, il faut d'abord sélectionner une autre feuille (ici la 1ère du classeur) avant de masquer les feuilles ; ceci afin que la feuille qui va être masquée ne soit pas celle qui est active ! (sinon, ce serait comme de scier la branche sur laquelle on est assis ! )

si besoin, tu peux demander une adaptation.

merci de me donner ton avis.

dhany

Bonjour

avec les CodeName a voir

Sub Cache()
Dim I&
    For I = 1 To Sheets.Count
        Select Case Sheets(I).Name
            Case Feuil1.Name, Feuil2.Name
            Case Else
                Sheets(I).Visible = 2
        End Select
    Next I
End Sub

Sub Decache()
Dim Feuil As Object
   For Each Feuil In Worksheets
        Feuil.Visible = -1
   Next
End Sub

A+

Maurice

Bonjour, Salut à tous !

Une solution pour masquer et démasquer alternativement les feuilles dont le CodeName est Feuil12 à Feuil40.

Sub MasquerDémasquer()
    Dim i%, m%, FF
    m = IIf(Feuil12.Visible = xlSheetVisible, xlSheetVeryHidden, xlSheetVisible)
    With ThisWorkbook.VBProject
        For i = 12 To 40
            FF = FF & " " & .VBComponents("Feuil" & i).Name
        Next i
    End With
    FF = Split(Trim(FF))
    Application.ScreenUpdating = False
    For i = 0 To UBound(FF)
        Worksheets(FF(i)).Visible = m
    Next i
End Sub

Cordialement.

Bonjour majormadj, le forum,

voici la nouvelle version du fichier Excel :

43exo-majormadj.xlsm (52.86 Ko)

attention : lis bien tous les commentaires en vert


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonjour,

A tester :

Sub Test()

    Dim M As VBComponent

    For Each M In ThisWorkbook.VBProject.VBComponents

        If M.Name <> "ThisWorkbook" And M.Type = 100 Then

            Select Case M.Properties(6).Value
                Case 12 To 40: Worksheets(M.Properties(7).Value).Visible = xlSheetHidden '"xlSheetHidden" visible dans la boite "Format","xlSheetVeryHidden" invisible dans la boite "Format"
            End Select

        End If

    Next M

End Sub

Yeees !!

Merci les gars, j'ai compris en plus et c'est le plus important.

Je n'ai plus qu'à continuer pour attribuer à chacune de ses feuilles, identifiées par leur CodeName, la valeur en B2 comme nom !

J'essaie ça

For j = 12 To 40

If .CodeName = "Feuil" & j Then .Name = Range("B2").Value

Mais ca bloque

Ça n'a rien d'obligé ! Et visiblement tu n'as pas essayé toutes les propositions...

Ça n'a rien d'obligé ! Et visiblement tu n'as pas essayé toutes les propositions...

Désolé je m'y perd un peu mais j'ai trouvé... c'était pas si compliqué...

Sub Nom()

Dim i%, j%

Application.ScreenUpdating = 0: Sheets(1).Select

On Error Resume Next

For i = 1 To Sheets.Count

With Sheets(i)

For j = 12 To 40

If .CodeName = "Feuil" & j Then .Visible = 2 + 3 * (.[A1] <> 0)

If .CodeName = "Feuil" & j Then .Name = .Range("B1").Value

Next j

End With

Next i

@majormadj

voici ton code VBA, avec une petite amélioration de la boucle For j (un seul test suffit) :

Option Explicit

Sub Nom()
  Dim i%, j%
  Application.ScreenUpdating = 0: Sheets(1).Select
  On Error Resume Next
  For i = 1 To Sheets.Count
    With Sheets(i)
      For j = 12 To 40
        If .CodeName = "Feuil" & j Then
          .Name = .[B1]: .Visible = 2 + 3 * (.[A1] <> 0)
        End If
      Next j
    End With
  Next i
End Sub

dhany

Bonjour majormadj,

suite à ta demande en MP, je te retourne ton fichier non confidentiel modifié :

52test-match.xlsm (58.55 Ko)

à toi de faire tous les tests nécessaires.

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Merci !!!!

Bonjour majormadj,

suite à ta demande en MP, je te retourne ton fichier non confidentiel modifié :

test-match.xlsm

à toi de faire tous les tests nécessaires.

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Dernière question, je l'espère, j'ai transposé ta méthode sur une cellule fusionnée (colonne 17 à 24) mais je n'ai pas la syntaxe.

k = (col - 17 & col - 24) "Évidemment ça ne marche pas...

Peux-tu m'éclairer encore?

Bonjour majormadj,

suite à ta demande en MP, je te retourne ton fichier non confidentiel modifié :

test-match.xlsm

à toi de faire tous les tests nécessaires.

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Rechercher des sujets similaires à "vba masquer afficher feuilles coup"