Cacher des feuilles

Bonjour à tous,

Je me heurte à un tout petit problème.
Je voudrais qu'en ouvrant un fichier qui contient plusieurs feuilles, ne l'ouvrir qu'en faisant apparaitre qu'une seule feuille parmi toutes celles qu'il contient
Pour cela j'ai créé un Userform contenant un Combobox dans lequel on retrouve toutes les feuilles et en choississant la feuille qui me convient, suite à un click sur le combobox, je voudrais que le le fichier s'ouvre en ne laissant apparaitre que la feuille choisie.
Je dois me planter car je n'y arrive pas

Merci de bien vouloir m'expliquer pourquoi ça ne marche pas (voulez vous le fichier ?)

Salut @Jacky,

Je procèderai comme suit :

  • Lors de l'ouverture du classeur (Workbook.Open) : masquer toutes les feuilles
  • Ouvrir l'UF de sélection de feuilles
  • Lors de la fermeture de l'UF, afficher les feuilles checkées via combobox.

Ci-joint un petit exemple qui s'adapte automatiquement au nombre de feuilles du classeur. On essaie d'éviter au maximum les erreurs de saisie.

Ci-après le code en question : (EDIT : code + fichier MAJ pour corriger petit bug)

' ========================= Code Workbook
Option Explicit

Private Sub Workbook_Open()
  ' on doit laisser au moins 1 feuille visible : on en ajoute 1 temporaire a la fin
  With ThisWorkbook.Worksheets
    Set tempSht = .Add(, .Item(.Count))
  End With

  ' on masque toutes les feuilles sauf la derniere
  Dim sht As Object
  On Error Resume Next
  For Each sht In ThisWorkbook.Sheets
    sht.Visible = False
  Next sht
  On Error GoTo 0

  ' on affiche l'UF
  With New UserForm1
    .Show
  End With
End Sub

' ========================= Code Module1 (sub optionnel, juste pour tester)
Option Explicit

Public tempSht As Worksheet

' ========================= Code Userform
Option Explicit

Private Sub UserForm_Initialize()
  Dim sht As Object, lastCtrl As MSForms.Control
  Dim i As Long
  For i = 1 To ThisWorkbook.Sheets.Count - 1
    Set sht = ThisWorkbook.Sheets(i)
    Set lastCtrl = Me.Controls.Item(Me.Controls.Count - 1)
    With Me.Controls.Add("Forms.CheckBox.1")
      .Caption = sht.Name
      .Top = lastCtrl.Top + lastCtrl.Height
    End With
  Next i
End Sub

Private Sub btnConfirm_Click()
  ' on vérifie que au moins 1 feuille est cochée
  Dim ctrl As MSForms.Control, selectionValide As Boolean
  For Each ctrl In Me.Controls
    If TypeOf ctrl Is MSForms.CheckBox Then
      selectionValide = ctrl.Value Or selectionValide
    End If
  Next ctrl

  If Not selectionValide Then
    ' on ne ferme pas l'UF
    MsgBox "Veuillez sélectionner au moins 1 feuille !", vbCritical + vbOKOnly
  Else
    ' si valide, on ferme l'UF
    Unload Me
  End If
End Sub

Private Sub UserForm_Terminate()
  Dim ctrl As MSForms.Control
  For Each ctrl In Me.Controls
    If TypeOf ctrl Is MSForms.CheckBox Then
      ThisWorkbook.Sheets(ctrl.Caption).Visible = ctrl.Value
    End If
  Next ctrl

  ' suppression de la feuille temporaire
  Application.DisplayAlerts = False
  tempSht.Delete
  Application.DisplayAlerts = True
End Sub

Bonjour mon ami Saboh,

Tu dis

Lors de l'ouverture du classeur (Workbook.Open) : masquer toutes les feuilles

Ouvrir l'UF de sélection de feuilles

Lors de la fermeture de l'UF, afficher les feuilles checkées via combobox.

c'est tout à fait ce que je pensaiis, mais je dois faire des erreurs en écrivant le code corresondant
Je vaiis prendre connaissance du code que tu utilises afin de voir où je me trompe, je te revois après

Bonjour,

Je voudrais qu'en ouvrant un fichier qui contient plusieurs feuilles, ne l'ouvrir qu'en faisant apparaitre qu'une seule feuille parmi toutes celles qu'il contient

De mon coté je préfère toujours les masquer à la fermeture que des fois un gars n'activerait pas les macros dans le fichier.

Voyez aussi ce lien --> https://excel-pratique.com/fr/astuces_vba/forcer_activation_des_macros

Cordialement

Le point clé : à tout moment, tu dois toujours avoir AU MOINS 1 FEUILLE VISIBLE.

Tu dois donc t'assurer que tu ne masques pas "la dernière feuille visible", sinon ça plante. Pour ma part j'ai contourné en ajoutant une feuille temporaire à la fin du classeur, et en la supprimant lors de la fermeture de l'UF. De plus, pour me simplifier la vie, j'ai mis "On Error Resume Next" lors du masquage des feuilles. Vu que les feuilles sont masquées dans l'ordre, elles sont toutes masquées SAUF celle qui fait erreur = la dernière = ma feuille temporaire.

Autrement toi tu as peut-être une feuille de sommaire, tu peux faire un test pour t'assurer de la garder visible (de type si le nom de la feuille = "sommaire", alors ne pas la masquer).

@saboh12617 :

Ma question peut paraître bizarre mais pourquoi With New Userform1 dans le code de l'ouverture ?
C'est l'IA qui donne çà ?

J'aurais fait simplement ceci --> Userform1.show

Il y a peut-être une raison ?

@saboh12617 :

Ma question peut paraître bizarre mais pourquoi With New Userform1 dans le code de l'ouverture ?
C'est l'IA qui donne çà ?

J'aurais fait simplement ceci --> Userform1.show

Il y a peut-être une raison ?

Non non c'est voulu, bonne lecture UserForm1.Show – Rubberduck News

Cependant oui, dans le cas et l'usage présent, Userform1.Show est parfaitement équivalent. Disons que c'est une habitude de "bonne pratique".

@saboh12617 :

Non non c'est voulu, bonne lecture UserForm1.Show – Rubberduck News
Cependant oui, dans le cas et l'usage présent,
Userform1.Show
est parfaitement équivalent. Disons que c'est une habitude de "bonne pratique".

Ok merci.

Je vais lire cela mais hormis les modules de classe, je n'ai jamais vu cette façon même dans les livres VBA de Walkenbach ou autres

Crdlt


Edit : A titre d'un autre exemple un fichier réalisé par Feu Th. Pourtier en 2004 (pouf c'est loin tout cela ...) et qui me semble aussi rejoindre la demande de Jacky.

Re-bonjour Saboh,
Bonjour Dan,

Ma bétise était toute simple, je supprimais toutes les feuilles, or tu nous a bien expliqué que

à tout moment, tu dois toujours avoir AU MOINS 1 FEUILLE VISIBLE.

mais la feuille que laisserai toujours visible peut être, non pas une feuiille temporaire comme tu le fais, mais tout simplement une feuille généraliste que je possède dans l'ensembble des feuilles.

Encore un grand merci et à bientôt

Jacky

Ma bétise était toute simple, je supprimais toutes les feuilles, or tu nous a bien expliqué que "à tout moment, tu dois toujours avoir AU MOINS 1 FEUILLE VISIBLE".

[...]

Oui désolé j'aurai dû le mettre dans mon 1e message. Pour être tout à fait honnête j'avais oublié ce détail et c'est en testant que je m'en suis rendu compte 😉.

Content d'aider, bonne fin de journée et bon weekend !

Re

@Jacky :

merci de penser à cloturer ce fil et d'autres fils toujours ouverts visibles ici --> https://forum.excel-pratique.com/membre/68866

Cordialement

Dan, pas de problème mais j'aurai encore une petite intervention à faire avant de cloturer ce fil

Saboh, j'ai en effet encore un petit problème

à l'ouverture du fichier toutes les feuilles sont cachées à l'exception d'une ("3_QUEREIX Adrienne"), je ne comprends pas pourquoi. Ma feuille qui sert de feuille temporaire et que ne cherche pas à cacher est la feuille "Liste"

Voici mon fichier

Saboh, j'ai en effet encore un petit problème

à l'ouverture du fichier toutes les feuilles sont cachées à l'exception d'une ("3_QUEREIX Adrienne"), je ne comprends pas pourquoi. Ma feuille qui sert de feuille temporaire et que ne cherche pas à cacher est la feuille "Liste"

Voici mon fichier

Dans ce cas, remplace le code de masquage des feuilles lors de l'ouverture avec le test dont je parlais :

(tu remarqueras que j'ai déplacé l'affichage de ta feuille en 1e ligne, car si par hasard elle est invisible alors le code risque de planter en voulant masquer les autres. C'est ce qui arrivait avec ton code, et donc la dernière feuille restait visible)

Private Sub Workbook_Open()
  Worksheets("Liste").Visible = True
  Dim sht As Object
  ' on masque toutes les feuilles sauf la feuille liste
  For Each sht In ThisWorkbook.Sheets
    If sht.Name <> "Liste" Then sht.Visible = False
  Next sht

  ' on affiche l'UF
  UserForm2.Show

End Sub

Que tu peux aussi écrire comme ceci, ce qui t'assure d'afficher la feuille Liste si par hasard elle est masquée. C'est + court.

Private Sub Workbook_Open()
  Dim sht As Object
  ' on masque toutes les feuilles sauf la feuille Liste
  For Each sht In ThisWorkbook.Sheets
    sht.Visible = (sht.Name <> "Liste")
  Next sht

  ' on affiche l'UF
  UserForm2.Show

End Sub

Non Saboh, mon code fonctionnait bien si ce n'est que je n'avais pas mis ma feuille "Liste" qui me sert de feuille "intermédiaire" en fin de liste. En fin de liste il y avait la feuille "3_QUEREIX Adrienne" donc c'était celle là qui servait de feuille "intermédiaire" et ne devait pas s'effacer.

Ouf, avec des petits problèmes sans grande importance comme celui là, on peut parfois perdre du temps

Encore un grand merci, je considère que ma question est résolue, je vais donc cloturer mon post comme le demande Dan

Au plaisiir de te retrouver

Rechercher des sujets similaires à "cacher feuilles"