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 subCdlt,
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 subQu'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 FunctionCdlt,
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 subEn 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 FunctionEt 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 subCdlt,
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 ?