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.
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
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.
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
Re : Code VBA masquer des lignes en fonction de la valeur d'une cellule
Re-bonjour, bonjour, chers job75 et Papou-net ,
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
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.
@ 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.
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.
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.
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).