Masquer des lignes selon valeur d'une cellule

Bonjours à tous et merci pour votre aide de la dernière fois.

Cette fois-ci j’ai un petit problème, relativement simple pour les experts, mais plus compliqué pour moi !

1er - je souhaiterai masquer des lignes via une valeur d’une cellule à choix.

En C2, je mets la valeur "x" --> masquer les lignes de A15:A266, et si j'enlève la valeur "x" m'afficher les lignes. J'ai réussi avec C2, mais après ça bug ! je ne sais pas quelle fonction rajouté à mon code.

A faire la même procédure avec les infos ci-dessous.

En C3, je mets la valeur "x" --> masquer les lignes de A19:A266

En C4, je mets la valeur "x" --> masquer les lignes de A27:A266

En C5, je mets la valeur "x" --> masquer les lignes de A43:A266

En C6, je mets la valeur "x" --> masquer les lignes de A75:A266

En C7, je mets la valeur "x" --> masquer les lignes de A139:A266

Voici mon code que j'ai inséré dans la feuille en question:

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("C2").Value = "x" Then

Range("A15:A266").EntireRow.Hidden = True

Else

Range("A15:A266").EntireRow.Hidden = False

End If

End Sub

Merci d'avance pour votre aide.

Bonjour Unmard, bonjour le forum,

Essaie comme ça :

Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("C3:C7")) Is Nothing Then Exit Sub
Select Case Target.Row
    Case 3
        Rows("19:266").Hidden = UCase(Target.Value) = "X"
    Case 4
        Rows("27:266").Hidden = UCase(Target.Value) = "X"
    Case 5
        Rows("43:266").Hidden = UCase(Target.Value) = "X"
    Case 6
        Rows("75:266").Hidden = UCase(Target.Value) = "X"
    Case 7
        Rows("139:266").Hidden = UCase(Target.Value) = "X"
End Select
End Sub

Hello Thau Thème,

Merci infiniment pour ton aide, ça fonctionne !

...j'aurai pu chercher longtemps, vu mes connaissances basic en VBA.

Bonjour Unmard, ThauThème,

je propose ce code VBA :

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, [C3:C7]) Is Nothing Then _
    Rows(2 ^ Target.Row + 11 & ":266").Hidden = UCase$(Target) = "X"
End Sub

dhany

Hello dhany,

Merci pour ton code, il fonctionne très bien.

Comme je ne suis pas du-tout doué en VBA, j'ai une question à vous posez,

Plus un code est cour, plus il est efficace ? ou ça n'a rien avoir ?

Merci encore et bonne journée

Tu a écrit :

Plus un code est court, plus il est efficace ?

non, pas forcément ; ça dépend des instructions qui ont été utilisées, et qui font la qualité du code.

merci pour le ! bonne journée à toi aussi !

dhany

Hello dhany,

Je me permets de vous déranger pour une modification de votre code ci-dessous, dès que vous avez du temps

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, [A1:A3]) Is Nothing Then _
    Rows(2 ^ Target.Row + 14 & ":45").Hidden = UCase$(Target) = "X"
End Sub

Je souhaiterai que le code se déclenche automatiquement en fonction du résultat de la cellule C46.

C46 = 0 , 1er ligne par défaut)

C46 = 1, égale une ligne en plus à afficher (total de lignes 2)

C46 = 2, égale une ligne en plus à afficher (total de lignes 3)

Etc.. Jusqu'à la ligne 45.

Merci d'avance pour votre aide

17cdp.xlsm (55.61 Ko)

Bonjour Unmard,

tu a écrit :

Je souhaiterai que le code se déclenche automatiquement en fonction du résultat de la cellule C46.

la sub Worksheet_Change() est appelée automatiquement lors de la modification d'une cellule ; dans l'exo précédent, c'était en cas de modif de C3:C7, et c'était possible car tu y faisais une saisie ; mais comme en C46 il y a une formule, c'est pas possible, car on ne doit pas saisir une donnée par-dessus une formule !


mais j'ai peut-être mal compris ta nouvelle demande ? alors indique-moi clairement ces différents points :


1) quelle est la plage de saisie ? attention : elle ne doit pas contenir de formule ! de plus, elle doit être en dehors des lignes à masquer ou à afficher, car sinon, si elles sont masquées, c'est plus possible d'y saisir des données ! dans l'exo précédent, c'était C3:C7


2) quelle est la condition à tester ? dans l'exo précédent, c'était selon la présence d'un "X" ; et là, tu voudrais selon la valeur de C46 ; si oui : ça, ça peut marcher.


3) quelle sont les lignes à masquer ou à afficher ? dans l'exo précédent, c'était ceci :

"X" en C3 ➯ masquer lignes 19 à 266 ; sinon, les afficher

"X" en C4 ➯ masquer lignes 27 à 266 ; sinon, les afficher

"X" en C5 ➯ masquer lignes 43 à 266 ; sinon, les afficher

"X" en C6 ➯ masquer lignes 75 à 266 ; sinon, les afficher

"X" en C7 ➯ masquer lignes 139 à 266 ; sinon, les afficher

* note bien qu'il n'y a pas de formule en C3:C7 : on peut y saisir le "X"

* les lignes de saisie 3 à 7 sont bien en dehors des lignes 19 à 266 (qui sont à masquer ou non)


4) j'ai bien compris que si C46 vaut n, tu veux afficher n+1 ligne(s) ; exemples :

C46

0 ➯ afficher 1 ligne

1 ➯ afficher 2 lignes

2 ➯ afficher 3 lignes

3 ➯ afficher 4 lignes

4 ➯ afficher 5 lignes

mais ça, c'est le nombre de lignes ; ça dit pas quelles sont les lignes à masquer ou à afficher !


je préfère de beaucoup que tu notes de cette façon :

C46

0 ➯ ligne à afficher : 16

1 ➯ lignes à afficher : 16 à 17

2 ➯ lignes à afficher : 16 à 18

3 ➯ lignes à afficher : 16 à 19

4 ➯ lignes à afficher : 16 à 20

45 ➯ lignes à afficher : 16 à 61

et cette fois, c'est des numéros de ligne, pas leur nombre !

c'est juste un exemple, j'sais pas si c'est ça ou non ;

si c'est ça, à toi de le confirmer.


à te lire pour la suite.

dhany

Bonjour dhany,

Merci pour ta réponse.

Mon souhait, c'est que mon tableau s'affiche en fonction du nombre de participants + une ligne vierge.

C46 contient la formule NBVAL()

La plage de saisie de A15:A45

La condition à tester, mettre un numéro X dans A15 (exemple : 5)

C46 aura la valeur 1, donc ligne à afficher : 16 à 17

Les lignes à afficher en fonction du résultat de C46, sont :

C46

0 ➯ ligne à afficher : 16

1 ➯ lignes à afficher : 16 à 17

2 ➯ lignes à afficher : 16 à 18

3 ➯ lignes à afficher : 16 à 19

4 ➯ lignes à afficher : 16 à 20

30 ➯ lignes à afficher : 16 à 46

Voilà, mais comme tu l'as dit dans ton message:

" mais comme en C46 il y a une formule, c'est pas possible, car on ne doit pas saisir une donnée par-dessus une formule !"

Il n'y aura pas un autre argument dans vba pour qu'il puisse accepter cette condition, sachant que C46 contient une formule et qu'il prend le résultat de celle-ci comme valeur ?

Si c'est pas possible, est-ce qu'il a une autre option ? J'essaie de comprendre le fonctionnement et la logique du langage vba.

Merci d'avance pour ton aide précieuse.

Bonne journée

Bonjour Unmard,

merci pour toutes tes infos supplémentaires !


je te retourne ton fichier modifié :

56cdp.xlsm (57.61 Ko)

* la cellule active est A15 ; saisis 5 et appuie sur Entrée ➯ une ligne de plus, et tu es toujours en A15

* appuie sur la touche Suppr pour effacer le 5 ➯ une ligne de moins : retour à la situation initiale

* saisis 5 et valide par Entrée ; appuie sur pour être en A16 ; saisis 7 et valide par Entrée ; vu ?

* appuie sur Suppr ; logique, n'est-ce pas ?


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonjour dhany,

d'avoir consacré un peu de ton temps pour mon problème.

Bonne journée.

Unmard

merci pour ton retour ! bonne journée à toi aussi !

dhany

Rechercher des sujets similaires à "masquer lignes valeur"