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 SubBonjour 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,est parfaitement équivalent. Disons que c'est une habitude de "bonne pratique".Userform1.Show
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 SubQue 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 SubNon 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