Masquer ou démasquer des lignes suivant valeur d'1 cellulle
Bon, je continue à travailler sur mon fichier et bon... je continue à être dans l'impasse...
J'ai donc besoin de vos lumières
Je souhaite à faire en sorte qu'en fonction du résultat du nombre inscrit dans la case F2 (nommée nbre_roul) de la feuille "Matrice", le nombre de ligne de la feuille "1er mois" soit ou non masquées (lignes 8 à 20).
En gros s'il est noté
2 sans la case F2, je veux que les lignes 10 à 20 soient masquées
3 sans la case F2, je veux que les lignes 11 à 20 soient masquées
4 sans la case F2, je veux que les lignes 12 à 20 soient masquées
etc.
Et si on rechange la valeur F2, les lignes masquées puissent être au besoin démasquées.
Je suppose qu'il faut faire appel à de la macro. J'ai bien trouvé quelques bouts de codes mais in fine rien d'opérant.
Par avance merci pour vos lumières.
Bonsoir Leachim, bonsoir le forum,
En pièce jointe ton fichier modifié avec le code ci-dessous dans le composant Feuil4(1ER MOIS) :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$F$2" Then Exit Sub
Dim O As Worksheet
Set O = Worksheets("1ER MOIS")
Select Case Target.Value
Case 2
O.Rows.Hidden = False
O.Rows(10 & ":" & 20).Hidden = True
Case 2
O.Rows.Hidden = False
O.Rows(10 & ":" & 20).Hidden = True
Case 3
O.Rows.Hidden = False
O.Rows(11 & ":" & 20).Hidden = True
Case 4
O.Rows.Hidden = False
O.Rows(12 & ":" & 20).Hidden = True
Case Else
O.Rows.Hidden = False
End Select
End Sub
Le fichier :
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour leachim, ThauThème
ThauThème je me suis permis de "corriger" ton code...
- Il y avait à mon avis, 2 CASEs identiques (voir lignes commentées)
- j'ai également tourné le test Target.Address pour éviter le Exit Sub
(je trouve que les EXIT en général pertubent la lecture "logique" du code, je m'arrange toujours donc pour formuler le test dans le bon sens) - j'ai inséré un Set O = Nothing en fin de traitement - pour éviter les surcharges mémoire
- et enfin j'ai ré-indenté le code
Private Sub Worksheet_Change(ByVal Target As Range)
Dim O As Worksheet
If Target.Address = "$F$2" Then
Set O = Worksheets("1ER MOIS")
Select Case Target.Value
'Case 2
' O.Rows.Hidden = False
' O.Rows(10 & ":" & 20).Hidden = True
Case 2
O.Rows.Hidden = False
O.Rows(10 & ":" & 20).Hidden = True
Case 3
O.Rows.Hidden = False
O.Rows(11 & ":" & 20).Hidden = True
Case 4
O.Rows.Hidden = False
O.Rows(12 & ":" & 20).Hidden = True
Case Else
O.Rows.Hidden = False
End Select
Set O = Nothing
End If
End Sub
Bonsoir le fil, bonsoir le forum,
Merci Andreas, tu as raison il y avait 2 cases 2. En fait, en relisant le premier post, il y a un etc. qui signifie qu'il fallait poursuivre les cas. Mais si Leachim comprend le principe il sera en mesure de terminer les autres cas et éventuellement de supprimer le Case Else à la fin.
Sinon pour le Exit Sub, je n'ai pas la même opinion. Je préfère d'entrée dire si c'est pas ça la macro s'arrête, qu'avoir un If... Then avec son End iF 36000 lignes plus bas... J'ai peut-être un peu quiché avec 36000 mais Sète et Marseille ne sont pas si loin l'une de l'autre...
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour le fil, ThauThème
c'est pas fauxThauThème a écrit :Sinon pour le Exit Sub, je n'ai pas la même opinion. Je préfère d'entrée dire si c'est pas ça la macro s'arrête, qu'avoir un If... Then avec son End iF 36000 lignes plus bas...
If Not condition Then
de toute façon c'est toujours une histoire de sardine, mais on ne sait toujours pas quel port elle bouche réellementThauThème a écrit :J'ai peut-être un peu quiché avec 36000 mais Sète et Marseille ne sont pas si loin l'une de l'autre...
Non sérieusement 36000 ça fait beaucoup, mais histoire vécue, j'ai déjà vu... et crois moi (
N'oublions pas que VBA est un langage structuré... donc dans la théorie il doit (même si il est interprété) se dérouler d'un bloc. Les sauts (GOTO, EXIT) sont une survivance de l'ancien BASIC (de nos fiers débuts) ou de l'assembleur avec ses JMP et autres
Merci ThauTheme et Andrea73, c'est exactement ce que je voulais.
Je vais continuer la logique et reviens vers vous si besoin
Merci encore
Re,
Franchement Andrea :
If Target.Address <> "$F$2" Then Exit Sub
ou
If Not Target.Address = "$F$2" Then Exit Sub
C'est un peu comme qui dirait de la sod***e de drosophile non ?... Niveau clartitude, comme dirait l'autre, je préfère toujours la première... Attention, je ne dis pas que j'ai raison. Mais, les coups et les douleurs, hein ! Ça ne se discute pas.
Je me prends la tête à commenter la plus grande partie de mes codes mais je me laisse aller à des petites failles du genre Exit Sub, GoTo et autres impuretés VBAïstes... À mon âge, laisse moi donc ces petits plaisirs...
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
If Target.Address <> "$F$2" Then Exit Sub
If Not Target.Address = "$F$2" Then Exit Sub
il me semble que dans ce cas là
Moi je disais
If ( Target.Address = "$F$2" ) Then
' Traitement si ok
' Else implicite et sans EXIT !
End If
If Not ( Target.Address = "$F$2" ) Then
' Traitement si NON ok
' Else implicite et sans EXIT !
End If
là par contre j'approuve ! je suis le premier à faire de même le plus souvent possible...ThauThème a écrit :Je me prends la tête à commenter la plus grande partie de mes codes
il est vrai que c'est une programmation tres "VBAïstes"ThauThème a écrit :À mon âge, laisse moi donc ces petits plaisirs...VBAïstes
Bon allez sans rancune... puisque le code à l'air de contenter notre ami leachim
leachim a écrit :Merci ThauTheme et Andrea73, c'est exactement ce que je voulais.
pas de problème ... et comme ça tu auras 2 versions du codeleachim a écrit :Je vais continuer la logique et reviens vers vous si besoinMerci encore
Bonjour le fil, bonjour le forum,
If ( Target.Address = "$F$2" ) Then
' Traitement si ok
' Else implicite et sans EXIT !
End If
If Not ( Target.Address = "$F$2" ) Then
' Traitement si NON ok
' Else implicite et sans EXIT !
End If
C'est la bouteille à moitié pleine ou à moitié vide !... Je ne vois toujours pas pourquoi une méthode serait meilleure que l'autre. Mais, je te rassure, il est fort possible que je change d'avis d'ici quelques temps. Mon avantage, j'ai autant de mauvaise foi que je suis sans vergogne... Tu penses bien qu'avec de telles armes, je gagne tout le temps
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour le fil (ThauThème)
Meilleure méthode (je n'ai jamais dit) meilleure lecture (j'ai dit)
Cependant
si tu sors ton atout...ThauThème a écrit :Mon avantage, j'ai autant de mauvaise foi que je suis sans vergogne... Tu penses bien qu'avec de telles armes, je gagne tout le temps
Bon je vois que la discussion sur la méthode fait rage
mais comme dit un proverbe africain "parler ne fait pas cuire le riz"
Bon eh bien j'ai complété le code puis je me suis dit que comme cela fonctionnait j'allais le transposer en lui demandant de faire la même chose sur la page "Matrice" et ainsi suivant le nombre donné en $f$2 je masquerai là aussi les lignes correspondantes.
Mais comme je n'y connais rien, ça ne se passe pas comme je veux... (confer fichier)
Par avance merci
Bonjour le fil, bonjour le forum,
Ho non ! Aucune rage Youness. Au contraire, c'est tellement plaisant de discuter avec un balèze qui a de l'humour...
Parler ne fait pas cuire le riz ! j'ai bien aimé cette expression que je ne connaissait pas.
Je n'ai malheureusement pas le temps de regarder ton problème mais comme je vois qu'Andrea reste attentif, je lui laisse le soin de te proposer une solution, structurée, sans Exit même si excitante, sans Goto et d'une logique implacable dont lui seul a le secret...
Bien je vais attendre Andréas et d'ici là vais tenter de trouver la solution
Pas de soucis Tauthème
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour leachim, ThauThème, le fil
Ho non ! Aucune rage Youness
et je confirme et même recursivementThauThème a écrit :Au contraire, c'est tellement plaisant de discuter avec un balèze qui a de l'humour...
leachim
Que cherches-tu as obtenir avec :
Private Sub Worksheet_Change2(ByVal Target As Range)
Cette fonction ne sera jamais exécutée !
Les procédures et fonctions placées dans le code d'une feuille sont toutes évènementielles et elles ont toutes un nom précis !
Si tu veux utiliser une fonction équivalente à celle de ThauThème dans une autre feuille il recopier cette fonction dans la bonne feuille (càd donc ton cas dans la feuille "Matice") et sans en changer le nom)
ThauThème
ThauThème a écrit :Au contraire, c'est tellement plaisant de discuter avec un balèze qui a de l'humour...
je ne détient aucun secret où alors je ne le suis pas le seul, où alors ça ce saurait !ThauThème a écrit :Andrea reste attentif, je lui laisse le soin de te proposer une solution, structurée, sans Exit même si excitante, sans Goto et d'une logique implacable dont lui seul a le secret...
Andreas,
Ce que je souhaite faire c'est dans l'esprit de ce que Tauthème m'avait proposer (code qui est dans la page "Matrice" et qui a des effets dans la page "1er mois") :
Sub Worksheet_Change(ByVal Target As Range)
'masque les lignes de la feuille 1er mois suivant le nombre de roulement choisi
If Target.Address <> "$F$2" Then Exit Sub
Dim O As Worksheet
Set O = Worksheets("1ER MOIS")
Select Case Target.Value
Case 2
O.Rows.Hidden = False
O.Rows(10 & ":" & 20).Hidden = True
Case 3
O.Rows.Hidden = False
O.Rows(11 & ":" & 20).Hidden = True
Case 4
O.Rows.Hidden = False
O.Rows(12 & ":" & 20).Hidden = True
Case 5
O.Rows.Hidden = False
O.Rows(13 & ":" & 20).Hidden = True
Case 6
O.Rows.Hidden = False
O.Rows(14 & ":" & 20).Hidden = True
Case 7
O.Rows.Hidden = False
O.Rows(15 & ":" & 20).Hidden = True
Case 8
O.Rows.Hidden = False
O.Rows(16 & ":" & 20).Hidden = True
Case 9
O.Rows.Hidden = False
O.Rows(17 & ":" & 20).Hidden = True
Case 10
O.Rows.Hidden = False
O.Rows(18 & ":" & 20).Hidden = True
Case 11
O.Rows.Hidden = False
O.Rows(19 & ":" & 20).Hidden = True
Case 12
O.Rows.Hidden = False
O.Rows(20 & ":" & 20).Hidden = True
Case Else
O.Rows.Hidden = False
End Select
End Sub
c'était de faire la même chose pour la page "Matrice"
Private Sub Worksheet_Change (ByVal Target As Range)
If Target.Address <> "$F$2" Then Exit Sub
Dim O As Worksheet
Set O = Worksheets("MATRICE")
Select Case Target.Value
Case 2
O.Rows.Hidden = False
O.Rows(12 & ":" & 22).Hidden = True
Case 3
O.Rows.Hidden = False
O.Rows(13 & ":" & 22).Hidden = True
Case 4
O.Rows.Hidden = False
O.Rows(14 & ":" & 22).Hidden = True
Case 5
O.Rows.Hidden = False
O.Rows(15 & ":" & 22).Hidden = True
Case 6
O.Rows.Hidden = False
O.Rows(16 & ":" & 22).Hidden = True
Case 7
O.Rows.Hidden = False
O.Rows(17 & ":" & 22).Hidden = True
Case 8
O.Rows.Hidden = False
O.Rows(18 & ":" & 22).Hidden = True
Case 9
O.Rows.Hidden = False
O.Rows(19 & ":" & 22).Hidden = True
Case 10
O.Rows.Hidden = False
O.Rows(20 & ":" & 22).Hidden = True
Case 11
O.Rows.Hidden = False
O.Rows(21 & ":" & 22).Hidden = True
Case 12
O.Rows.Hidden = False
O.Rows(22 & ":" & 22).Hidden = True
Case Else
O.Rows.Hidden = False
End Select
End Sub
et donc de les faire cohabiter
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
Je ne suis pas tout à fait d'accord avec le proverbe africain
Parce que récursivement :
il faut bien commencer à en parler (du riz) avant de le faire cuire
andrea73 a écrit :(re)
Je ne suis pas tout à fait d'accord avec le proverbe africain
Parce que récursivement :
il faut bien commencer à en parler (du riz) avant de le faire cuire
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
Si j'ai bien compris le but de la manœuvre il faut ajouter au code de ThauThème (à partie de ' la meme chose Dans MATRICE)
Sub Worksheet_Change(ByVal Target As Range)
'masque les lignes de la feuille 1er mois suivant le nombre de roulement choisi
If Target.Address <> "$F$2" Then Exit Sub
Dim O As Worksheet
Set O = Worksheets("1ER MOIS")
Select Case Target.Value
Case 2
O.Rows.Hidden = False
O.Rows(10 & ":" & 20).Hidden = True
Case 3
O.Rows.Hidden = False
O.Rows(11 & ":" & 20).Hidden = True
Case 4
O.Rows.Hidden = False
O.Rows(12 & ":" & 20).Hidden = True
Case 5
O.Rows.Hidden = False
O.Rows(13 & ":" & 20).Hidden = True
Case 6
O.Rows.Hidden = False
O.Rows(14 & ":" & 20).Hidden = True
Case 7
O.Rows.Hidden = False
O.Rows(15 & ":" & 20).Hidden = True
Case 8
O.Rows.Hidden = False
O.Rows(16 & ":" & 20).Hidden = True
Case 9
O.Rows.Hidden = False
O.Rows(17 & ":" & 20).Hidden = True
Case 10
O.Rows.Hidden = False
O.Rows(18 & ":" & 20).Hidden = True
Case 11
O.Rows.Hidden = False
O.Rows(19 & ":" & 20).Hidden = True
Case 12
O.Rows.Hidden = False
O.Rows(20 & ":" & 20).Hidden = True
Case Else
O.Rows.Hidden = False
End Select
' la meme chose Dans MATRICE
Dim debutCache
debutCache = 10 + Target.Value - 2
With ActiveSheet
.Rows.Hidden = False
.Rows(debutCache & ":" & 20).Hidden = True
End With
End Sub
andrea73 a écrit :(re)
Si j'ai bien compris le but de la manœuvre il faut ajouter au code de ThauThème (à partie de ' la meme chose Dans MATRICE)
Sub Worksheet_Change(ByVal Target As Range) 'masque les lignes de la feuille 1er mois suivant le nombre de roulement choisi If Target.Address <> "$F$2" Then Exit Sub Dim O As Worksheet Set O = Worksheets("1ER MOIS") Select Case Target.Value Case 2 O.Rows.Hidden = False O.Rows(10 & ":" & 20).Hidden = True Case 3 O.Rows.Hidden = False O.Rows(11 & ":" & 20).Hidden = True Case 4 O.Rows.Hidden = False O.Rows(12 & ":" & 20).Hidden = True Case 5 O.Rows.Hidden = False O.Rows(13 & ":" & 20).Hidden = True Case 6 O.Rows.Hidden = False O.Rows(14 & ":" & 20).Hidden = True Case 7 O.Rows.Hidden = False O.Rows(15 & ":" & 20).Hidden = True Case 8 O.Rows.Hidden = False O.Rows(16 & ":" & 20).Hidden = True Case 9 O.Rows.Hidden = False O.Rows(17 & ":" & 20).Hidden = True Case 10 O.Rows.Hidden = False O.Rows(18 & ":" & 20).Hidden = True Case 11 O.Rows.Hidden = False O.Rows(19 & ":" & 20).Hidden = True Case 12 O.Rows.Hidden = False O.Rows(20 & ":" & 20).Hidden = True Case Else O.Rows.Hidden = False End Select ' la meme chose Dans MATRICE Dim debutCache debutCache = 10 + Target.Value - 2 With ActiveSheet .Rows.Hidden = False .Rows(debutCache & ":" & 20).Hidden = True End With End Sub
C'est exactement ça même si j'ai pas tout pigé
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
oui j'ai fait une entorse aux commentaires je texplique :leachim a écrit :C'est exactement ça même si j'ai pas tout pigé
Dim debutCache
debutCache = 10 + Target.Value - 2
With ActiveSheet
.Rows.Hidden = False
.Rows(debutCache & ":" & 20).Hidden = True
End With
- la variable debutCache me permet de connaitre la 1ère ligne à cacher
- donc je la calcule comme cela : 10 + Target.Value - 2
- 10 c'est le début de ton tableau,
- Target.Value c'est ta cellule de roulement semaine,
- -2 c'est parce que 10 +2 = 12 alors que tu veux cacher à partir de 10 ! donc 12 -2 = 10
- c'est par paresse (et pour être certain que l'on travalle sur le bon onglet)
[Ligne][/
Ligne]
si je comprends bien "les prochaines feuilles" seront des feuilles du style 2EME MOIS, 3EME MOIS...leachim a écrit :et si je voulais transposer cette même démarche sur les prochaines feuilles, je serais sans doute obligé des nommer ou est ce que je peux mettre à la suite ?