La fonction Excel détermine si une cellule est visible

12

Dans le formatage conditionnel, je veux 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 hack auquel je peux penser est:

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

Existe-t-il un moyen de le faire sans une colonne temporaire qui doit être visible lorsque la ligne est affichée?


Pour éviter un problème XY , ce que je veux faire, c'est avoir une colonne qui est la catégorie de la ligne. La première ligne VISIBLE avec une catégorie particulière doit avoir un style différent; les rangées ultérieures de la 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 masque la ligne avec, ddddje veux que la ligne avec eeeeait le +BBB+style à la place.

Phrogz
la source

Réponses:

13

Au lieu de sous-total à l'aide d'une somme sur une autre colonne, vous pouvez utiliser le sous-total à l'aide de countapour voir si une cellule (connue-non vide) est masquée ou non. Par exemple, si la colonne Asera normalement visible (sauf si la ligne est masquée)

= IF( SUBTOTAL(103,A2)=1, "VISIBLE", "HIDDEN (or blank)" )

Vous pouvez placer 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)=1pour déterminer si la ligne est visible.

Phrogz
la source
5

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 méthodes suivantes,

Mise en forme conditionnelle

=CELL("width",TargetCell)=0

Cela se met à jour automatiquement dès qu'une colonne est masquée.

Vérification de la 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".

Tom Bombadil
la source
1

Ceci est similaire à l'approche de Gary's Student. Définissez la fonction VBA suivante:

Function MyRowHidden(ref As Range)
    MyRowHidden = Rows(ref.Row).Hidden
End Function

Voir Comment ajouter VBA dans MS Office? si vous avez besoin d'aide pour cela. Vous pouvez maintenant utiliser pour vérifier si la ligne contenant est masquée.MyRowHidden(cell)cell

La façon dont j'ai conçu pour résoudre le problème utilise une colonne d'assistance, mais vous pouvez la masquer. En supposant que vos données commencent en ligne 2, avec les catégories en colonne A, entrez

=OR($A1<>$A2, AND(H1,MyRowHidden(H1)))

dans la cellule H2et faites glisser vers le bas. Cette formule est évaluée à VRAI si

  • la catégorie de cette ligne ( A2) est différente de la catégorie de 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 elle est masquée.

Ensuite, utilisez simplement la mise en forme conditionnelle pour mettre en surbrillance la cellule A2si elle =H2est vraie.

Exemple: données brutes:

        ensemble de données complet

Ouais, je suis un traditionaliste; Je compte toujours Pluton comme une planète. Le voici à nouveau avec les premières lignes numérotées (2, 3, 5, 7, 11 et 13) cachées:

        données filtrées

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

G-Man dit «Réintègre Monica»
la source
0

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
L'élève de Gary
la source
1
Comment pourraient-ils exécuter cela à partir de la mise en forme conditionnelle (posée dans la question)?
CharlieRB
0

Ce fil est un peu ancien, mais au cas où il serait utile à quiconque, voici un moyen de formater conditionnellement les doublons sur une table filtrée sans avoir à utiliser VBA.

  1. Créer une colonne remplie de 1
  2. Faire une autre colonne et y mettre une formule comme celle-ci

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

  3. Mettez la mise en forme conditionnelle en double normale sur la colonne que vous souhaitez vérifier.

La formule de l'étape 2 copiera la valeur de la colonne que vous souhaitez vérifier, mais uniquement lorsque la ligne est visible. De cette façon, lorsque les doublons sont vérifiés, vous n'obtenez que ceux applicables à la table filtrée. Je pense que cela peut ne pas fonctionner pour les zéros (ou "" ou tout ce que vous choisissez comme valeur "else" dans votre instruction if). Il peut donc être possible d'obtenir une valeur de ligne zéro dans votre liste qui est mise en surbrillance comme doublon. A part ça, j'ai de la chance avec cette méthode.

JFrizz
la source
0

Je proposerais d'utiliser la formule suivante (sur une gamme par exemple $ A: $ A):

=AND(A1=OFFSET(A1;-1;0);SUBTOTAL(103;OFFSET(A1;-1;0))=1)

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 Vrai donc la cellule est un doublon d'une cellule visible juste au-dessus et devrait par exemple être grisée.

Sidenote: L'utilisation de la OFFSETfonction fait que la mise en forme conditionnelle ne se cassera pas lorsqu'une ligne supplémentaire est insérée.

Joma
la source
-1

Voici la solution que je viens d'utiliser:

J'ai créé une nouvelle colonne C (et j'ai caché l'original (colonne B)). Dans la nouvelle colonne, j'ai utilisé la formule = SOUS-TOTAL (9, B2) qui résume la ligne qui vous intéresse. Je l'ai ensuite copiée toutes les lignes!

Maintenant, lorsque vous filtrez en utilisant un filtre avancé. Les valeurs sont toutes ZÉRO dans cette colonne sauf si elles sont visibles (non filtrées).

Ensuite, le normal = SUMIF () fonctionne comme un champion. N'utilisez pas accidentellement la colonne cachée pour faire la somme. Additionnez la colonne SUBTOTAL () que vous venez de créer.

Capitaine Kirk
la source