Code VBA masquer des lignes en fonction de la valeur d'une cellule

tamatave33

XLDnaute Occasionnel
Bonjour le forum,
Quelqu’un pourrait-il m’éclairer sur le problème suivant :
Dans le fichier joint, je masque des lignes (lignes 15 à 25) en fonction de la valeur de la cellule (Y15). La valeur de cette cellule est calculée, elle n'est pas saisie manuellement.
Mon problème est que si je ne clique pas plusieurs fois sur cette cellule, il ne se passe rien.
J'ai cherché sur le forum une solution, mais je n'ai pas trouvé.
Quelqu'un peut-il me donner la solution ?
Merci pour votre aide.
 

Pièces jointes

  • Exemple 1.xls
    35.5 KB · Affichages: 78
  • Exemple 1.xls
    35.5 KB · Affichages: 73

DoubleZero

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonjour, tamatave33, le Forum,

Un essai, tout en espérant avoir compris le besoin...

Code:
Option Explicit
Sub Ligne_masquer()
    Dim i As Long
    Application.ScreenUpdating = False
    i = [y15].Value
    Range("a15").Resize(i).EntireRow.Hidden = True
    Application.ScreenUpdating = True
End Sub
Sub Ligne_afficher()
    Rows.Hidden = False
End Sub

A bientôt :)
 

tamatave33

XLDnaute Occasionnel
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonsoir DoubleZero, le forum,

Merci pour ta réponse, mais je pense que ma demande n'était pas suffisamment claire.
La valeur de la cellule Y15 peut varier de 0 à 11.
Si elle est égale à 0 ou a 11, les lignes 15 à 25 sont affichées.
si elle est égale à 1, seule la ligne 15 est affichée.
Si elle est égale à 2, les lignes 15 et 16 sont affichées,
si elle est égale à 3, les lignes 15, 16 et 17 sont affichées,
et ainsi de suite.
Voici le code que j'ai écris :
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim k As Integer
If Not Intersect(Target, Range("Y15")) Is Nothing Then
k = Range("Y15").Value
Select Case k
    Case Is = 0
        Range("A15:A25").EntireRow.Hidden = False
    Case Is = 11
        Range("A15:A25").EntireRow.Hidden = False
    Case Is = 10
        Range("A15:A24").EntireRow.Hidden = False
        Range("A25").EntireRow.Hidden = True
    Case Is = 9
        Range("A15:A23").EntireRow.Hidden = False
        Range("A24:A25").EntireRow.Hidden = True
    Case Is = 8
        Range("A15:A22").EntireRow.Hidden = False
        Range("A23:A25").EntireRow.Hidden = True
    Case Is = 7
        Range("A15:A21").EntireRow.Hidden = False
        Range("A22:A25").EntireRow.Hidden = True
    Case Is = 6
        Range("A15:A20").EntireRow.Hidden = False
        Range("A21:A25").EntireRow.Hidden = True
    Case Is = 5
        Range("A15:A19").EntireRow.Hidden = False
        Range("A20:A25").EntireRow.Hidden = True
    Case Is = 4
        Range("A15:A18").EntireRow.Hidden = False
        Range("A19:A25").EntireRow.Hidden = True
    Case Is = 3
        Range("A15:A17").EntireRow.Hidden = False
        Range("A18:A25").EntireRow.Hidden = True
    Case Is = 2
        Range("A15:A16").EntireRow.Hidden = False
        Range("A17:A25").EntireRow.Hidden = True
    Case Is = 1
        Range("A15").EntireRow.Hidden = False
        Range("A26:A25").EntireRow.Hidden = True
End Select
End If
End Sub
La valeur de la cellule Y15 est calculée par une formule, elle n'est pas saisie manuellement. Mon problème est que la macro ne s'exécute pas automatiquement si la valeur de cette cellule change.
Aurais-tu une solution ?
Merci.
 

job75

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonjour tamatave33, DoubleZero,

Dans la formule en Y15 y a-t-il des références externes à la feuille ?

Le plus simple est de nous donner cette formule.

A+
 

Papou-net

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonsoir tamatave,
Bises chère petite 00,

Si la cellule est calculée par formule, il faut déplacer le code dans la procédure Calculate.

Voir sur copie en PJ.

Bonne soirée.

Cordialement.

Edit: salut Job, décidément, tu me précèdes toujours.
 

Pièces jointes

  • Copie de Exemple 1.xls
    35.5 KB · Affichages: 79
  • Copie de Exemple 1.xls
    35.5 KB · Affichages: 71

job75

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Re,

Si la formule en Y15 ne dépend que des cellules de la feuille vous pouvez utiliser cette macro :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Rows(15).Resize(IIf([Y15], [Y15], 11)).Hidden = False
If [Y15] And [Y15] < 11 Then Rows(15).Offset([Y15]).Resize(11 - [Y15]).Hidden = True
End Sub
Edit : bonsoir Papou-net, pas rafraîchi.

A+
 
Dernière édition:

DoubleZero

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Re-bonjour, bonjour, chers job75 :D et Papou-net :D,

Un autre essai...

Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Dim k As Integer
    If Not Intersect(Target, Range("Y15")) Is Nothing Then
        Rows.Hidden = False
        k = Range("Y15").Value
        Select Case k
        Case Is = 10
            Range("A25").EntireRow.Hidden = True
        Case Is = 9
            Range("A24:A25").EntireRow.Hidden = True
        Case Is = 8
            Range("A23:A25").EntireRow.Hidden = True
        Case Is = 7
            Range("A22:A25").EntireRow.Hidden = True
        Case Is = 6
            Range("A21:A25").EntireRow.Hidden = True
        Case Is = 5
            Range("A20:A25").EntireRow.Hidden = True
        Case Is = 4
            Range("A19:A25").EntireRow.Hidden = True
        Case Is = 3
            Range("A18:A25").EntireRow.Hidden = True
        Case Is = 2
            Range("A17:A25").EntireRow.Hidden = True
        Case Is = 1
            Range("A25:A26").EntireRow.Hidden = True
        End Select
    End If
    Range("Y15").Select
    Application.ScreenUpdating = True
End Sub

A bientôt :)
 

job75

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Re,

@ Papou-net : avec Worksheet_Calculate, s'il y a des fonctions volatiles dans la feuille comme MAINTENANT ou DECALER, la macro boucle sans fin ou ne s'arrête que quand l'espace pile est insuffisant.

Pour l'éviter il faut alors utiliser les Application.EnableEvents = False/True.

A+
 

Papou-net

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Re,

@ Papou-net : avec Worksheet_Calculate, s'il y a des fonctions volatiles dans la feuille comme MAINTENANT ou DECALER, la macro boucle sans fin ou ne s'arrête que quand l'espace pile est insuffisant.

Pour l'éviter il faut alors utiliser les Application.EnableEvents = False/True.

A+

RE

Tu as entièrement raison, ça m'a échappé. Je ne le referai plus, c'est promis.

Cordialement.
 

tamatave33

XLDnaute Occasionnel
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonjour DoubleZero, job75, Papou-net, le forum,

Merci pour votre aide. En prenant le code de Papou-net ("Worksheet_Calculate") et en tenant compte de la remarque de job75 ("Pour l'éviter il faut alors utiliser les Application.EnableEvents = False/True"), ça fonctionne.
Le code de DoubleZero m'a permis de supprimer quelques lignes.
Petite question : si on utilise l'instruction "Application.ScreenUpdating = False" faut-il toujours terminer par "Application.ScreenUpdating = True". Est-ce que cela sert vraiment ?
Merci encore.
Bon après-midi.
 

job75

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonjour,

En général Application.ScreenUpdating = True est inutile car l'instruction End Sub rafraîchit l'écran.

Cependant dans certains cas ce n'est pas vrai, il n'y a qu'à tester.

En passant, les 2 lignes de code de mon post #6 sont quand même plus simples, sauf si vous êtes aussi un adepte du "plus c'est long plus c'est bon" :rolleyes:

A+
 

tamatave33

XLDnaute Occasionnel
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonsoir job75,

Merci pour votre réponse. Pour ce qui est du code que vous avez proposé, disons que je maîtrise très peu le VBA et donc le code proposé par DoubleZero, même s'il est plus long, est beaucoup plus facile à comprendre pour moi.
Encore merci.
Très bonne soirée.
 

Si...

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

:)Salut

Et en passant à l'étape moyenne (dans la page de code de la feuille et avec les tests) ?
Code:
Private Sub Worksheet_Calculate()
  a = [Y15]
  If a > 11 Or a = 0 Or Not IsNumeric(a) Then a = 11
  Application.EnableEvents = 0 ' <------------
  [15:25].Rows.Hidden = 1  'masque les lignes
   Rows(15).Resize(a).Rows.Hidden = 0  'affiche les a lignes à partir de la 15
  Application.EnableEvents = 1
End Sub

Reste à savoir que prendre avec une valeur non entière (a<0).

Merci Job :)
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule

Bonjour Si...

Tu as fait une petite erreur : Application.EnableEvents = 0 doit être placé avant le masquage des lignes.

Qui comme l'affichage entraine le recalcul des fonctions volatiles.

A+
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 846
dernier inscrit
Silhabib