La función de Excel determina si una celda es visible

12

En el formato condicional, quiero detectar si la fila sobre la celda actual está oculta o visible. ¿Cómo puedo detectar si una celda es visible o no?

El único truco que se me ocurre es:

  1. Crea una columna con todos los 1valores.
  2. Use una fórmula como subtotal(109,c2:c2)=1(es decir, solo en la celda que quiero verificar) para determinar si está visible u oculto.

¿Hay alguna manera de hacer esto sin una columna temporal que debe dejarse visible cuando se muestra la fila?


Para evitar un problema XY , lo que quiero hacer es tener una columna que sea la categoría de la fila. La primera fila VISIBLE con una categoría particular debe tener un estilo diferente; Las filas posteriores con la misma categoría son ligeramente diferentes. En ASCII:

cat.   item
+AAA+  aaaa
(AAA)  bbbb
(AAA)  cccc
+BBB+  dddd
(BBB)  eeee
(BBB)  ffff

Si mi filtro oculta la fila, ddddentonces quiero que la fila eeeetenga el +BBB+estilo.

Phrogz
fuente

Respuestas:

13

En lugar de usar el subtotal usando una suma en otra columna, puede usar el subtotal usando countapara ver si una celda (no conocida en blanco) está oculta o no. Por ejemplo, si la columna Anormalmente estará visible (a menos que la fila esté oculta)

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

Puede poner esta fórmula en una columna que puede estar oculta y seguirá funcionando.

En el formato condicional, entonces, puede usar: = SUBTOTAL(103,$A2)=1para determinar si la fila es visible.

Phrogz
fuente
5

Como una adición a la respuesta de Phrogz, si necesita verificar si una celda en una columna está oculta, intente cualquiera de los siguientes,

Formato condicional

=CELL("width",TargetCell)=0

Esto se actualiza automáticamente en cuanto se oculta una columna.

Verificación de fórmula

=IF(CELL("width",TargetCell)=0, "Cell is hidden.", "Cell is visible.")

Esta fórmula no se actualizará automáticamente y tendría que dirigir Excel a "Calcular ahora" eligiendo la opción de menú o presionando "F9".

Tom Bombadil
fuente
1

Esto es similar al enfoque de Gary's Student. Defina la siguiente función de VBA:

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

Consulte ¿Cómo agrego VBA en MS Office? si necesitas ayuda con eso. Ahora puede usar para verificar si la fila que contiene está oculta.MyRowHidden(cell)cell

La forma en que ideé para resolver el problema utiliza una columna auxiliar, pero puede ocultarlo. Suponiendo que sus datos comiencen en Fila 2, con las categorías en Columna A, ingrese

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

en la celda H2y arrastre hacia abajo. Esta fórmula se evalúa como VERDADERA si

  • la categoría en esta fila ( A2) es diferente de la categoría en la fila anterior ( A1); es decir, esta es la primera fila de una nueva categoría, o
  • la fila anterior debe resaltarse, pero está oculta.

Luego, simplemente use Formato condicional para resaltar la celda A2si =H2es verdadero.

Ejemplo: datos sin procesar:

        conjunto de datos completo

Sí, soy tradicionalista. Todavía cuento a Plutón como un planeta. Aquí está nuevamente con las filas numeradas primas (2, 3, 5, 7, 11 y 13) ocultas:

        datos filtrados

Por supuesto, tendrá que habilitar las macros en su libro de trabajo.

G-Man dice 'restablecer a Mónica'
fuente
0

Para detectar si la fila sobre la celda activa está oculta , ejecute esta 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
Estudiante de gary
fuente
1
¿Cómo ejecutarían eso desde el formato condicional (preguntado en la pregunta)?
CharlieRB
0

Este hilo es un poco viejo, pero en caso de que sea útil para alguien, aquí hay una forma de formatear condicionalmente los duplicados en una tabla filtrada sin tener que usar VBA.

  1. Hacer una columna poblada con 1's
  2. Haz otra columna y pon una fórmula como esta

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

  3. Coloque el formato condicional duplicado normal en la columna que desea verificar.

La fórmula del paso 2 copiará el valor de la columna que desea verificar, pero solo cuando la fila sea visible. De esa forma, cuando se verifican los duplicados, solo se obtienen los aplicables a la tabla filtrada. Creo que esto puede no funcionar para ceros (o "" o lo que elija como el valor "else" en su declaración if). Por lo tanto, es posible obtener un valor de línea cero en su lista que esté resaltado como duplicado. Aparte de eso, estoy teniendo buena suerte con este método.

JFrizz
fuente
0

Propondría usar la siguiente fórmula (en un rango, por ejemplo, $ A: $ A):

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

Lo que eso hace:

Si ambos

  1. la celda es igual a la de arriba: A1=OFFSET(A1;-1;0)
  2. la celda de arriba es visible: SUBTOTAL(103;OFFSET(A1;-1;0))=1

entonces el resultado es Verdadero, por lo tanto, la celda es un duplicado de una celda visible justo arriba y, por ejemplo, debe estar atenuada.

Nota al margen: el uso de la OFFSETfunción hace que el formato condicional no se rompa cuando se inserta una fila adicional.

Joma
fuente
-1

Aquí está la solución que acabo de usar:

Creé una nueva columna C (y OCULTÉ el original (Columna B)). En la nueva columna utilicé la fórmula = SUBTOTAL (9, B2) ¿QUÉ SUMA la UNA fila en la que está interesado. Luego lo copié todas las filas!

Ahora, cuando filtras con filtro avanzado. Los valores son todos CERO en esta columna a menos que sean visibles (no filtrados).

Entonces, el normal = SUMIF () funciona como un campeón. Simplemente no use accidentalmente la columna oculta para sumar. Suma la columna SUBTOTAL () que acabas de crear.

Capitán Kirk
fuente