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 :

4leachim-v01.xlsm (43.76 Ko)

Bonjour leachim, ThauThème

ThauThème je me suis permis de "corriger" ton code...

  1. Il y avait à mon avis, 2 CASEs identiques (voir lignes commentées)
  2. 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)
  3. j'ai inséré un Set O = Nothing en fin de traitement - pour éviter les surcharges mémoire
  4. 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...

Bonjour le fil, ThauThème

ThauThè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...

c'est pas faux mais dans ce cas là tu tournes le test dans l'autre sens
If Not condition Then


ThauThè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...

de toute façon c'est toujours une histoire de sardine, mais on ne sait toujours pas quel port elle bouche réellement

Non sérieusement 36000 ça fait beaucoup, mais histoire vécue, j'ai déjà vu... et crois moi ( ) dans ce cas là, tu es (très, très) content quand tu peux suivre le code de façon linéaire, plutôt qu'un code truffé de EXIT SUB/FUNC/FOR... et autres GOTO etiquette où tu fini par ne plus voir le code (utile)


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...

(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à ça veut presque tout à fait dire exactement la même chose !

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
ThauThème a écrit :

Je me prends la tête à commenter la plus grande partie de mes codes

là par contre j'approuve ! je suis le premier à faire de même le plus souvent possible...
ThauThème a écrit :

À mon âge, laisse moi donc ces petits plaisirs...VBAïstes

il est vrai que c'est une programmation tres "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.

leachim a écrit :

Je vais continuer la logique et reviens vers vous si besoinMerci encore

pas de problème ... et comme ça tu auras 2 versions du code

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 .

Bonjour le fil (ThauThème)

Meilleure méthode (je n'ai jamais dit) meilleure lecture (j'ai dit)

Cependant

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

si tu sors ton atout... (je m'incline)

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

Bonjour leachim, ThauThème, le fil

Ho non ! Aucune rage Youness

ThauThème a écrit :

Au contraire, c'est tellement plaisant de discuter avec un balèze qui a de l'humour...

et je confirme et même recursivement

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...

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...

je ne détient aucun secret où alors je ne le suis pas le seul, où alors ça ce saurait !

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

(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

(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é 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 ? (je ne sais pas si je suis clair

(re)

leachim a écrit :

C'est exactement ça même si j'ai pas tout pigé

oui j'ai fait une entorse aux commentaires je texplique :
Dim debutCache

    debutCache = 10 + Target.Value - 2
    With ActiveSheet
        .Rows.Hidden = False
        .Rows(debutCache & ":" & 20).Hidden = True
    End With
  1. la variable debutCache me permet de connaitre la 1ère ligne à cacher
  2. 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
  • With ActiveSheet
      c'est par paresse (et pour être certain que l'on travalle sur le bon onglet)
    1. pour éviter de ré-écrire ActiveSheet sur les deux lignes suivantes
    2. et en plus le traitement est un peu plus rapide
  • les 2 lignes suivantes sont identiques à celles (plus haut dans le code) de ThauThème
  • [Ligne][/


    Ligne]

    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 ?

    si je comprends bien "les prochaines feuilles" seront des feuilles du style 2EME MOIS, 3EME MOIS...
    Rechercher des sujets similaires à "masquer demasquer lignes suivant valeur cellulle"