Sélectionner une feuille dont le nom correspond à une cellule
Bonjour à tous,
je cherche a créer un bouton macro qui masquera des feuilles en fonction d'une valeur dans un tableau.
Mon tableau, dans la 1ère feuille, est composé de 2 colonnes et d'autant de ligne que de feuille suivante. (créer par une précédente macro)
la 1ere colonne correspond au nom de mes feuilles, dans ma seconde colonne est notée "oui" ou "non".
J'aimerai que les feuilles dont la ligne de la 1ere feuille est renseignée "oui" soit masquées.
Cela est-il possible?
je suis parti sur cette macro avec le fichier joint :
Sub masquer_feuille()
For Each cel In Range("B2", Range("B" & Rows.Count).End(xlUp))
If cel Like "oui" Then
Sheets(2).Visible = False
End If
Next
End Sub
Elle fonctionne ici pour masquer uniquement la 2nd feuille
Mon problème est de faire pointer le nom de la feuille = à la valeur 1ere cellule de la ligne où apparaît le "oui" (j’espère que ma demande est compréhensible
Merci par avance pour votre aide qui me sera bien utile
Bonjour,
Si tu demandes de masquer la 2e feuille, le code masquera la 2e feuille !
Sub MasquerFeuille()
Dim c As Range
For Each c In Worksheets(1).ListObjects(1).DataBodyRange.Columns(1).Cells
Worksheets(c.Value).Visible = (c.Offset(, 1) <> "oui")
Next c
End Sub
NB- Toujours mettre le code sous balises Code dans un post (comme ci-dessus !)
Indenter correctement son code...
Déclarer systématiquement ses variables en tête de procédure !
Bonjour Seb, bonjour le forum,
Peut-être comme ça :
Sub masquer_feuille()
Dim O As Worksheet 'déclare la variaboe O (Onglet)
Dim TV As Variant 'déclare la variaboe TV (Tableau des valeurs)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("Tableau1") 'définit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
'si la donnée ligne I colonne 2 de TV = "oui" n'est pas [Vrai],
'la propriété [Visible] de l'onglet correspondant à la donnée ligne I colonne 1 de TV n'est pas [Vrai] non plus
Sheets(TV(I, 1)).Visible = Not TV(I, 2) = "oui"
Next I 'prochaine ligne de la boucle
End Sub
[Édition]
Pfff. Toujours au milieu celui-là !... Et toujours aussi efficace... Ho c' est vous.... Bonjour cher Maître...
MFerrand / ThauThème
Merci pour vos réponses très rapides!
Chacun de vos codes fonctionnes.
Mais je les ai intégré dans mon "vrai" tableau en essayant de les adapter mais je sèche (Je suis novice en VBA et vos codes sont inconnu pour moi... )
Ci joint le tableau
(j'aurai du le joindre à ma 1ere demande...)
@MFerrand
oui évidement que se sera toujours ma 2ème feuille qui sera masquer
c'était pour l'exemple
Re,
Maître Ferrand est tellement lent
Sub MasquerFeuille()
Dim c As Range
For Each c In Worksheets(1).ListObjects(1).DataBodyRange.Columns(1).Cells
Worksheets(CStr(c.Value)).Visible = (UCase(c.Offset(, 5)) <> "OUI")
Next c
End Sub
Sub MasquerFeuille()
Dim i%
With Worksheets(1).ListObjects(1).DataBodyRange
For i = 1 To .Rows.Count
Worksheets(CStr(.Cells(i, 1))).Visible = (UCase(.Cells(i, .Columns.Count)) <> "OUI")
Next i
End With
End Sub
Bon ! lorsqu'on fournit un fichier inadéquat, on n'aura pas une réponse adéquate ! Quand on s'amuse à modifier la structure par rapport au modèle fourni, c'est qu'on considère être en mesure d'adapter le code à ces modifications, sans quoi il convenait de fournir un autre modèle !
Un nom de feuille est une donnée String, une valeur numérique n'est pas reconnue comme nom de feuille, il faut la convertir.
Et si en plus on ne maîtrise pas les mentions qu'on porte soi-même : alternativement OUI ou Oui ! Là je n'ai plus guère envie de répondre !
Sub MasquerFeuille() Dim i% With Worksheets(1).ListObjects(1).DataBodyRange For i = 1 To .Rows.Count Worksheets(CStr(.Cells(i, 1))).Visible = (UCase(.Cells(i, .Columns.Count)) <> "OUI") Next i End With End Sub
Bon ! lorsqu'on fournit un fichier inadéquat, on n'aura pas une réponse adéquate ! Quand on s'amuse à modifier la structure par rapport au modèle fourni, c'est qu'on considère être en mesure d'adapter le code à ces modifications, sans quoi il convenait de fournir un autre modèle !
Un nom de feuille est une donnée String, une valeur numérique n'est pas reconnue comme nom de feuille, il faut la convertir.
Et si en plus on ne maîtrise pas les mentions qu'on porte soi-même : alternativement OUI ou Oui ! Là je n'ai plus guère envie de répondre !
Ok, toutes mes excuses.
Je suis novice et je ne connais pas tous les codes de bon principe des échanges VBA.
Mon fichier excel initial est rempli de petite macro et je voulais transmettre un fichier simple pour ne pas vous compliquer la vie
et j'imaginais ce code plus simple et facilement adaptable...
En tout cas merci de ton aide très précieuse pour me permettre d'avancer dans mes projets!
Re,
Maître Ferrand est tellement lent
que je me permet de répondre à sa place en adaptant son code : Sub MasquerFeuille() Dim c As Range For Each c In Worksheets(1).ListObjects(1).DataBodyRange.Columns(1).Cells Worksheets(CStr(c.Value)).Visible = (UCase(c.Offset(, 5)) <> "OUI") Next c End Sub
Merci ThauThème pour ce code!
Fonctionne parfaitement!