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

capture

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

5exemple.xlsx (9.63 Ko)

Bonjour

Un essai à tester. Te convient-il ?

12exemple-v1.xlsm (23.73 Ko)
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 et je t'en remercie !

Cependant, est-il possible de choisir les lignes à masquer ?

capture

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 et pour adapter à mon fichier, c'est compliquer.

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

Nouvelle version

4exemple-v2.xlsm (22.95 Ko)

Bye !

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

La même avec macro commentée.

8exemple-v1-b.xlsm (23.82 Ko)

Bye !

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

Nouvelle version.

9exemple-v2.xlsm (23.64 Ko)

Bye !

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
4exemple-v2-1.xlsm (17.50 Ko)

@gmb : j'ai un soucis sur une ligne... Le fait de masquer toutes les cellules lorsqu'il n'y a rien sur ma liste est top

capture

@dysorthographie : super par contre dans ma feuille ça met un temps fou pour le chargement

Oups !

Nouvelle version.

13exemple-v3.xlsm (23.78 Ko)

Bye !

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 ?

capture

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,

Rechercher des sujets similaires à "masquer ligne vides"