Dans le formatage conditionnel, je souhaite détecter si la ligne au-dessus de la cellule actuelle est masquée ou visible. Comment puis-je détecter si une cellule est visible ou non?
Le seul piratage auquel je puisse penser est:
1
.subtotal(109,c2:c2)=1
(c'est-à-dire juste sur la cellule que je veux vérifier) pour déterminer si elle est visible ou masquée.Y a-t-il un moyen de le faire sans une colonne temporaire qui doit être laissée visible lorsque la ligne est affichée?
Pour éviter un problème XY , ce que je veux faire, c'est avoir une colonne qui correspond à la catégorie de la ligne. La première ligne visible avec une catégorie particulière doit avoir un style différent; les lignes suivantes de même catégorie sont légèrement différentes. En ASCII:
cat. item
+AAA+ aaaa
(AAA) bbbb
(AAA) cccc
+BBB+ dddd
(BBB) eeee
(BBB) ffff
Si mon filtre cache la ligne avec dddd
, je souhaite que la ligne avec eeee
ait le style +BBB+
à la place.
Au lieu de sous-total utilisant une somme sur une autre colonne, vous pouvez utiliser un sous-total en utilisant counta
pour voir si une cellule (connue non vide) est masquée ou non. Par exemple, si la colonne A
sera normalement visible (sauf si la ligne est masquée)
= IF( SUBTOTAL(103,A2)=1, "VISIBLE", "HIDDEN (or blank)" )
Vous pouvez mettre cette formule dans une colonne qui peut être masquée et cela fonctionnera toujours.
Dans la mise en forme conditionnelle, vous pouvez simplement utiliser: = SUBTOTAL(103,$A2)=1
pour déterminer si la ligne est visible.
En complément de la réponse de Phrogz, si vous devez vérifier si une cellule d'une colonne est masquée, essayez l'une des solutions suivantes:
Formatage conditionnel
=CELL("width",TargetCell)=0
Ceci se met à jour automatiquement dès qu'une colonne est masquée.
Contrôle de formule
=IF(CELL("width",TargetCell)=0, "Cell is hidden.", "Cell is visible.")
Cette formule ne se mettra pas à jour automatiquement et vous devrez diriger Excel vers "Calculer maintenant" en choisissant l'option de menu ou en appuyant sur "F9".
C’est similaire à l’approche de Gary Student. Définissez la fonction VBA suivante:
Function MyRowHidden(ref As Range)
MyRowHidden = Rows(ref.Row).Hidden
End Function
Voir Comment puis-je ajouter VBA dans MS Office? si vous avez besoin d’aide à cet égard. Vous pouvez maintenant utiliser MyRowHidden(cell)
pour vérifier si la ligne contenant cell
est masquée.
La façon dont j'ai conçu le problème utilise une colonne d'assistance, mais vous pouvez la cacher. En supposant que vos données commencent par la ligne 2
, avec les catégories de la colonne A
, entrez
=OR($A1<>$A2, AND(H1,MyRowHidden(H1)))
dans la cellule H2
et faites glisser vers le bas. Cette formule est évaluée à VRAI si
A2
) est différente de la catégorie dans la ligne précédente (A1
); c'est-à-dire qu'il s'agit de la première ligne d'une nouvelle catégorie, ouEnsuite, utilisez simplement la mise en forme conditionnelle pour mettre en surbrillance la cellule A2
si =H2
est vrai.
Exemple: données brutes:
Oui, je suis traditionaliste. Je compte toujours Pluton comme une planète. La voici à nouveau cachée avec les lignes numérotées en premier (2, 3, 5, 7, 11 et 13):
Bien sûr, vous devrez activer les macros dans votre classeur.
Ce fil de discussion est un peu ancien, mais s'il est utile à quiconque, voici un moyen de formater de manière conditionnelle les doublons sur une table filtrée sans avoir à utiliser VBA.
Faites une autre colonne et mettez une formule comme celle-ci
=IF(SUBTOTAL(103, [@ColumnWithOnlyOnesInIt])=1, [@ColumnYouWantToCheckForDuplicates], "")
Placez en double mise en forme conditionnelle normale sur la colonne que vous souhaitez vérifier.
La formule de l'étape 2 copie la valeur de la colonne à vérifier, mais uniquement lorsque la ligne est visible. Ainsi, lorsque les doublons sont vérifiés, vous obtenez uniquement ceux applicables à la table filtrée. Je pense que cela peut ne pas fonctionner pour les zéros (ou "" ou ce que vous choisissez comme valeur "else" dans votre instruction if). Il est donc possible d’obtenir une valeur de ligne zéro dans votre liste qui est surlignée en double. À part ça, j'ai de la chance avec cette méthode.
Je proposerais d'utiliser la formule suivante (sur une plage, par exemple, $ A: $ A):
=AND(A1=OFFSET(A1;-1;0);SUBTOTAL(103;OFFSET(A1;-1;0))=1)
Qu'est-ce que cela fait:
Si les deux
A1=OFFSET(A1;-1;0)
SUBTOTAL(103;OFFSET(A1;-1;0))=1
alors le résultat est True, la cellule est donc une copie d'une cellule visible juste au-dessus et devrait être p. ex. grisé.
Remarque: L'utilisation de la fonction OFFSET
permet d'éviter la rupture de la mise en forme conditionnelle lorsqu'une ligne supplémentaire est insérée.
Pour détecter si la ligne au-dessus de la cellule active est masquée , exécutez cette macro:
Sub WhatsAboveMe()
Dim r As Range
Set r = Selection
With r
If .Row = 1 Then
Exit Sub
End If
If .Offset(-1, 0).EntireRow.Hidden = True Then
MsgBox "the row above is hidden"
Else
MsgBox "the row above is visible"
End If
End With
End Sub