Masquer ou faire apparaitre une ligne selon selon sa valeur

Bonjour

Je suis en galère depuis 2 semaines, car je cherche à rendre un document plus lisible en masquant les lignes dont le contenu d'une plage de la colonne A est vide. Cette colonne à une fonction qui modifie son contenu selon une autre page du classeur (liste des tâches).

Je souhaite "simplement" rendre une ligne visible, si elle a une valeur et la masquer, si elle n'en a pas. Je dois aussi pouvoir faire apparaître une ligne si la page source renvoi un nouveau contenu.

Les plages des cellules concernées à la feuille FDPn1e1 sont A13 à A72 et A75 à A134

Merci de votre aide

Philippe

Bonjour,

Pouvez-vous essayer ceci :

'CODE A PLACER DANS LE MODULE DE LA FEUILLE CONCERNÉE
Private Sub Worksheet_Calculate()
Call MasquerAfficher
End Sub

'CODE A PLACER DANS UN MODULE NORMAL
Sub MasquerAfficher()

Dim Plage as range, Vides as range, NonVides as range

Set Plage = Range("A13:A72, A75:A134") 'mes cellules ciblées
Set Vides = Plage.specialcells(xlcelltypeblanks) 'ensemble des cellules vides
Set NonVides = Plage.specialcells(xlcelltypeconstants, 23) 'ensemble des cellules non vides

If not Vides is nothing then Vides.entirerow.hidden = true 'masquer les cellules vides qd l'ensemble n'est pas vide
if not NonVides is nothing then NonVides.entirerow.hidden = False 'afficher les cellules non vides quand l'ensemble n'est pas vide

End sub

Cdlt,

Bonjour 3GB

Merci pour ta réponse rapide, mais j'ai un message d'erreur d'execution "1004"… il est probable que je m'y prenne mal.

Philippe

Non pas sûr, peut-être que le code est incomplet ou qu'il y a un blocage à cause de la discontinuité ou avec les non vides. J'ai pas testé malheureusement :

Peux-tu essayer comme ça :

'CODE A PLACER DANS LE MODULE DE LA FEUILLE CONCERNÉE
Private Sub Worksheet_Calculate()
Call MasquerAfficher
End Sub

'CODE A PLACER DANS UN MODULE NORMAL
Sub MasquerAfficher()

Dim Plage as range, Vides as range, NonVides as range

Set Plage = Range("A13:A72, A75:A134") 'mes cellules ciblées
Set Vides = Plage.specialcells(xlcelltypeblanks) 'ensemble des cellules vides
Set NonVides = Plage.specialcells(xlcelltypeconstants, 23) 'ensemble des cellules non vides

If not Vides is nothing then Vides.rows.entirerow.hidden = true 'masquer les cellules vides qd l'ensemble n'est pas vide
if not NonVides is nothing then NonVides.rows.entirerow.hidden = False 'afficher les cellules non vides quand l'ensemble n'est pas vide

End sub

Qu'y a-t-il en A73:A74 ? Des cellules masquées ?

Bonjour

J'ai toujours le même code d'erreur.

En A73:A74, actuellement rien n'est masqué, mais comme évoqué, je cherche à masquer les lignes vides.

Cordialement

Je te demande ça car tu as spécifié de A13 à A72 et A75 à A134.

Mais si tu sais qu'il y auras toujours des valeurs en A73:A74, alors on peut simplifier pour commencer :

'CODE A PLACER DANS LE MODULE DE LA FEUILLE CONCERNÉE
Private Sub Worksheet_Calculate()
Call MasquerAfficher
End Sub

'CODE A PLACER DANS UN MODULE NORMAL
Sub MasquerAfficher()

Dim Plage as range, Vides as range, NonVides as range

Set Plage = Range("A13:A134") 'mes cellules ciblées
Set Vides = Plage.specialcells(xlcelltypeblanks) 'ensemble des cellules vides
Set NonVides = Exclude(Plage, Vides) 'ensemble des cellules non vides

If not Vides is nothing then Vides.rows.entirerow.hidden = true 'masquer les cellules vides qd l'ensemble n'est pas vide
if not NonVides is nothing then NonVides.rows.entirerow.hidden = False 'afficher les cellules non vides quand l'ensemble n'est pas vide

End sub

'ET RAJOUTER CETTE FONCTION
Function Exclude(Range1 As Range, Range2 As Range) As Range 'FONCTION POUR RENVOYER L'UNION MOINS L'INTERSECTION DE 2 PLAGES

Dim rUnion As Range, rIntersect As Range, cell As Range

Set rUnion = Union(Range1, Range2) 'union
Set rIntersect = Intersect(Range1, Range2) 'intersection

For Each cell In rUnion 'pour chaque cellule de l'union
    If Intersect(cell, rIntersect) Is Nothing Then 'si la cellule n'appartient pas à l'intersection
        If Exclude Is Nothing Then 'cas particulier : initialisation
            Set Exclude = cell 'initialisation avec 1ère cellule
        Else 'sinon, cas général
            Set Exclude = Union(Exclude, cell) 'Exclude = union de Exclude précédent et de cellule en cours
        End If
    End If
Next

End Function

Cdlt,

Philippekoe,

Peux-tu essayer avec ce code qui comporte moins de risques et qui me semble plus simple :

'CODE A PLACER DANS LE MODULE DE LA FEUILLE CONCERNÉE
Private Sub Worksheet_Calculate()
Call MasquerAfficher
End Sub

'CODE A PLACER DANS UN MODULE NORMAL
Sub MasquerAfficher()

Dim Plage as range, Vides as range

Set Plage = Range("A13:A134") 'mes cellules ciblées
Set Vides = Plage.specialcells(xlcelltypeblanks) 'ensemble des cellules vides

Application.screenupdating = False

if Vides is nothing then
    Plage.rows.entirerow.hidden = false
    Exit sub
end if

Plage.rows.entirerow.hidden = false 'afficher tout
Vides.rows.entirerow.hidden = true 'masquer les cellules vides

Application.screenupdating = True

End sub

En cas d'erreur, merci de m'indiquer la ligne concernée

Bonjour

Je n'ai pas de message d'erreur cette fois-ci, mais rien ne change…

Merci

Philippe

Depuis le début, je me suis fourvoyé (j'ai considéré tes cellules comme totalement vides alors qu'elles contiennent des formules).
De la sorte, ça devrait marcher (enfin je l'espère) :

'CODE A PLACER DANS LE MODULE DE LA FEUILLE CONCERNÉE
Private Sub Worksheet_Calculate()
Call MasquerAfficher
End Sub

'CODE A PLACER DANS UN MODULE NORMAL
Sub MasquerAfficher()

Dim Plage as range, Vides as range

Set Plage = Range("A13:A134") 'mes cellules ciblées
Set Vides = SpecificCells(Plage, "") 'ensemble des cellules vides

Application.screenupdating = False

if Vides is nothing then
    Plage.rows.entirerow.hidden = false
    Exit sub
end if

Plage.rows.entirerow.hidden = false 'afficher tout
Vides.rows.entirerow.hidden = true 'masquer les cellules vides

Application.screenupdating = True

End sub

Function SpecificCells(Plage As Range, Valeur_Critere As Variant) As Range

For Each cell In Plage
    If cell.Value = Valeur_Critere Then
        If SpecificCells Is Nothing Then
            Set SpecificCells = cell
        Else
            Set SpecificCells = Union(SpecificCells, cell)
        End If
    End If
Next

End Function

Et si vraiment ça ne marche pas, essaie en rajoutant dans le module de la feuille :

Private Sub worksheet_change(byval target as range)
if not intersect(target, range("A13:A134")) is nothing then
    Application.calculate
end if
End sub

Cdlt,

Bonjour

Tout roule! J'ai juste une dernière question :

Pour actualiser les données, je dois cliquer sur macros/executer; il n'y aurais pas de moyen automatisé pour rafraîchir les données?

En tout cas, bravo et merci pour l'aide!!

Super !

Normalement, la macro est exécuté automatiquement au recalcul de la feuille (ou si vous avez rajouté le dernier évènement, à chaque modification de la zone ciblée).

Avez-vous enregistré votre fichier sous l'extension .xlsm ?

Rechercher des sujets similaires à "masquer apparaitre ligne valeur"