Masquer ligne si plusieurs cellules de la ligne sont vides
Bonsoir,
J'ai un menu déroulant qui me permet de choisir entre 4 "critères". Et selon ce que je choisis, j'ai un tableau qui se rempli automatiquement.
Cependant, selon le critère choisi, ce tableau se rempli plus ou moins. Je souhaiterais donc pouvoir masquer les lignes où les données sont manquantes de manière automatique.
Par exemple, imaginons que selon mon critère 1 (choisi via mon menu déroulant) mon tableau est rempli.
Quand je choisis mon critère 2, aucunes données n'est calculées. Les cellules affichent donc - €

J'aimerais qu'en choisissant mon critère 2, Excel détecte que les lignes 27 28 29 et 30 sont vides et soient masquées automatiquement. Et lorsque que je rebascule en critère 1 les lignes se réaffichent.
Je précise que pour masquée une ligne il faut que les 5 cellules soient vides.
Si quelqu'un à la solution je lui en serai très reconnaissant
Merci d'avance pour votre aide.
Ci-joint un fichier exemple
Bonjour
Un essai à tester. Te convient-il ?
Option Explicit
Dim derln&, dercol&, i&
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$3" Then Exit Sub
Cells.EntireRow.Hidden = False
If Target = "" Then Exit Sub
dercol = Cells(9, Columns.Count).End(xlToLeft).Column
derln = Range("C" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
For i = 10 To derln
If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, dercol))) = 0 Then
Rows(i & ":" & i).EntireRow.Hidden = True
End If
Next i
End Sub
Bye
Bonjour,
Dans le principe c'est exactement ça
Cependant, est-il possible de choisir les lignes à masquer ?

Ici, garder la ligne 10 et 18 histoire de d'avoir un espacement.
Suffirait-il de mettre des formules SIERREUR avec une valeur si erreur définie que la macro détecterait ? Car là elle détecte les valeurs vides. Et étant donné que les lignes 10 et 18 sont vides, elles se suppriment aussi.
Pourrais-tu m'expliquer les différentes étapes de la macro ? Je ne comprends pas tout
Bonjour,
@gmb pour info un if vérifie si une expression est vrai ou fusse True/False tu na donc pas besoin de la tester!
Rows(i & ":" & i).EntireRow.Hidden = WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, dercol))) = 0
C'est exactement ça l'idée, mais impossible de l'adapter à mon tableur étant donné que je ne comprends pas le code. Quelqu'un pour me l'expliquer ?
Merci gmb
Yes cool j'ai réussi à l'adapter !
Cependant, un petit détail, ce sont des résultats de formules dans mes cellules, quand il n'y a rien les cellules affichent "- €".
La macro repère les cellules vides. Elle me masque les mauvaises lignes du coup.
A voir dans l'exemple :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target.Address <> "$C$3" Or Target(1) = "" Then Exit Sub 'la macro ne continue que si on a vlaidé la cellule C3
Application.ScreenUpdating = False 'facultatif : on désactive la mise à jour de l'écran après chaque instruction
For i = 10 To Range("C" & Rows.Count).End(xlUp).Row 'on va faire une boucle pour examiner les lignes de la 10 à la derln 'trouver le End If suvivant
Rows(i & ":" & i).EntireRow.Hidden = WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, Cells(9, Columns.Count).End(xlToLeft).Column))) = 0 And Cells(i, 3) <> "" 'on masque la ligne
Next i
Application.ScreenUpdating = True 'fin de la boucle : on retourne au début de la boucle
End Sub
j'avais fait une légère erreur dans le code; voici la correction!
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target.Address <> "$C$3" Or Target(1) = "" Then Exit Sub 'la macro ne continue que si on a vlaidé la cellule C3
Application.ScreenUpdating = False 'facultatif : on désactive la mise à jour de l'écran après chaque instruction
For i = 10 To UsedRange.Rows.Count + 2 'on va faire une boucle pour examiner les lignes de la 10 à la derln 'trouver le End If suvivant
Rows(i & ":" & i).EntireRow.Hidden = WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, Cells(9, Columns.Count).End(xlToLeft).Column))) = 0 And Cells(i, 3) <> "" 'on masque la ligne
Next i
Application.ScreenUpdating = True 'fin de la boucle : on retourne au début de la boucle
End Sub
Super !! la macro fonctionne, j'ai réussi à faire ce que je voulais
Je pense cependant qu'il y a un problème de stabilité. A chaque changement dans le menu déroulant, ça met énormément de temps pour l'exécution de la macro.
J'ai 80 lignes à peu prés.
Si une amélioration est envisageable je prends !
Un grand merci
chez moi c'est instantané sur 600 lignes!
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target.Address <> "$C$3" Then Exit Sub 'la macro ne continue que si on a vlaidé la cellule C3
Application.ScreenUpdating = False: Application.EnableEvents = False 'facultatif : on désactive la mise à jour de l'écran après chaque instruction
For i = 10 To UsedRange.Rows.Count + 2 'on va faire une boucle pour examiner les lignes de la 10 à la derln 'trouver le End If suvivant
Rows(i & ":" & i).EntireRow.Hidden = WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, Cells(9, Columns.Count).End(xlToLeft).Column))) = 0 And Cells(i, 3) <> "" 'on masque la ligne
Next i
Application.ScreenUpdating = True: Application.EnableEvents = True 'fin de la boucle : on retourne au début de la boucle
End Sub
Bonjour
ça met énormément de temps pour l'exécution de la macro.
Désolé, je ne vois pas comment faire plus rapide.
Sur mon PC, et avec 700 lignes '(j''ai tiré la dernière ligne du tableau vers le bas) elle met moins d'une demi seconde.
Bye !
Option Explicit
Dim derln&, dercol&, i&
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
Application.ScreenUpdating = False
Cells.EntireRow.Hidden = False
derln = Range("C" & Rows.Count).End(xlUp).Row
dercol = Cells(9, Columns.Count).End(xlToLeft).Column
If Target = "" Then
Rows("2:" & derln).EntireRow.Hidden = True
Exit Sub
End If
derln = Range("C" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
For i = 2 To derln
If WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, dercol))) = 0 _
And Cells(i, 3) <> "" Then
Rows(i & ":" & i).EntireRow.Hidden = True
End If
Next i
End Sub
Je comprends pas, c'est bizarre...
Au dessus de la fenêtre VBA j'ai [exécution en cours] qui ne n'arrête pas de trembler. Je pense pas que cela provienne de mon PC avec 16go de RAM.
On est bien d'accord que par rapport à ma page, j'ai adapter le code comme il fallait ?

On est bien d'accord que par rapport à ma page, j'ai adapter le code comme il fallait ?
Comment savoir ?
Il me faudrait le fichier !
Bye !
Je finis la mise en forme etc et je t'enverrai le fichier
Bonjour à tous,
Voici une tentative en stockant les lignes à masquer dans une variable pour n'effectuer qu'une seule opération de masquage :
Option Explicit
Dim derln&, dercol&, i&
Private Sub Worksheet_Change(ByVal Target As Range)
dim rhide as range
If Target.Address <> "$A$1" Then Exit Sub
Application.ScreenUpdating = False
Cells.EntireRow.Hidden = False
derln = Range("C" & Rows.Count).End(xlUp).Row
dercol = Cells(9, Columns.Count).End(xlToLeft).Column
If Target = "" Then
Rows("2:" & derln).EntireRow.Hidden = True
Exit Sub
End If
derln = Range("C" & Rows.Count).End(xlUp).Row
For i = 2 To derln
If WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, dercol))) = 0 _
And Cells(i, 3) <> "" Then
if rhide is nothing then set rhide = rows(i)
set rhide = union(rhide, rows(i))
End If
Next i
if not rhide is nothing then rhide.hidden = true
End Sub
Cdlt,