web-dev-qa-db-fra.com

La fonction Excel détermine si une cellule est visible

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. Créez une colonne avec toutes les valeurs 1.
  2. Utilisez une formule telle que 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.

12
Phrogz

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.

12
Phrogz

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".

5
Tom Bombadil

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

  • la catégorie dans cette ligne (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, ou
  • la ligne précédente doit être mise en surbrillance, mais est masquée.

Ensuite, utilisez simplement la mise en forme conditionnelle pour mettre en surbrillance la cellule A2 si =H2 est vrai.

Exemple: données brutes:

 full data set

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):

 filtered data

Bien sûr, vous devrez activer les macros dans votre classeur.

1
G-Man

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.

  1. Faire une colonne remplie de 1
  2. Faites une autre colonne et mettez une formule comme celle-ci

    =IF(SUBTOTAL(103, [@ColumnWithOnlyOnesInIt])=1, [@ColumnYouWantToCheckForDuplicates], "")

  3. 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.

0
JFrizz

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

  1. la cellule est égale à celle ci-dessus: A1=OFFSET(A1;-1;0)
  2. la cellule ci-dessus est visible: 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.

0
Joma

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
0
Gary's Student