A função Excel determina se uma célula está visível

12

Na formatação condicional, desejo detectar se a linha acima da célula atual está oculta ou visível. Como posso detectar se uma célula está visível ou não?

O único truque que consigo pensar é:

  1. Crie uma coluna com todos os 1valores.
  2. Use uma fórmula como subtotal(109,c2:c2)=1(ou seja, apenas na célula que desejo verificar) para determinar se está visível ou oculta.

Existe uma maneira de fazer isso sem uma coluna temporária que precisa ser deixada visível quando a linha é mostrada?


Para evitar um problema XY , o que eu quero fazer é ter uma coluna que seja a categoria da linha. A primeira linha VISÍVEL com uma categoria específica deve ter um estilo diferente; linhas posteriores com a mesma categoria são ligeiramente diferentes. Em ASCII:

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

Se meu filtro ocultar a linha dddd, quero que a linha eeeetenha o +BBB+estilo.

Phrogz
fonte

Respostas:

13

Em vez de usar o subtotal usando uma soma em outra coluna, você pode usar o subtotal countapara verificar se uma célula (conhecida em branco) está oculta ou não. Por exemplo, se a coluna Anormalmente estiver visível (a menos que a linha esteja oculta)

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

Você pode colocar essa fórmula em uma coluna que pode estar oculta e ainda funcionará.

Na formatação condicional, você pode apenas usar: = SUBTOTAL(103,$A2)=1para determinar se a linha está visível.

Phrogz
fonte
5

Como um adendo à resposta de Phrogz, se você precisar verificar se uma célula de uma coluna está oculta, tente um dos seguintes,

Formatação condicional

=CELL("width",TargetCell)=0

Isso é atualizado automaticamente assim que uma coluna é ocultada.

Verificação de fórmula

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

Essa fórmula não será atualizada automaticamente e você precisará direcionar o Excel para "Calcular agora" escolhendo a opção de menu ou pressionando "F9".

Tom Bombadil
fonte
1

Isso é semelhante à abordagem de Gary's Student. Defina a seguinte função VBA:

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

Consulte Como adiciono o VBA no MS Office? se você precisar de ajuda com isso. Agora você pode usar para verificar se a linha que contém está oculta.MyRowHidden(cell)cell

A maneira que eu criei para resolver o problema usa uma coluna auxiliar, mas você pode ocultá-la. Supondo que seus dados iniciem em Linha 2, com as categorias em Coluna A, insira

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

na célula H2e arraste para baixo. Esta fórmula avalia como TRUE se

  • a categoria nesta linha ( A2) é diferente da categoria na linha anterior ( A1); ou seja, esta é a primeira linha de uma nova categoria ou
  • a linha anterior deve ser destacada, mas está oculta.

Em seguida, basta usar a formatação condicional para destacar a célula A2se =H2for verdadeira.

Exemplo: dados brutos:

        conjunto de dados completo

Sim, sou tradicionalista; Eu ainda conto Plutão como um planeta. Aqui está novamente com as linhas numeradas principais (2, 3, 5, 7, 11 e 13) ocultas:

        dados filtrados

Obviamente, você precisará habilitar macros em sua pasta de trabalho.

G-Man diz que 'restabelece Monica'
fonte
0

Para detectar se a linha acima da célula ativa está oculta , execute 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
Aluno de Gary
fonte
1
Como eles executariam isso em Formatação condicional (feita na pergunta)?
precisa
0

Esse segmento é um pouco antigo, mas, caso seja útil para alguém, aqui está uma maneira de formatar condicionalmente duplicatas em uma tabela filtrada sem precisar usar o VBA.

  1. Crie uma coluna preenchida com 1's
  2. Faça outra coluna e coloque uma fórmula assim

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

  3. Coloque na formatação condicional duplicada normal na coluna que deseja verificar.

A fórmula da etapa 2 copiará o valor da coluna que você deseja verificar, mas apenas quando a linha estiver visível. Dessa forma, quando as duplicatas são verificadas, você obtém apenas as aplicáveis ​​à tabela filtrada. Eu acho que isso pode não funcionar para zeros (ou "" ou o que você escolher como o valor "else" na sua instrução if). Portanto, pode ser possível obter um valor de linha zero na sua lista destacado como duplicado. Fora isso, estou tendo boa sorte com esse método.

JFrizz
fonte
0

Eu proporia usar a seguinte fórmula (em um intervalo, por exemplo, $ A: $ A):

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

O que isso faz:

Se ambos

  1. a célula é igual à célula acima: A1=OFFSET(A1;-1;0)
  2. a célula acima é visível: SUBTOTAL(103;OFFSET(A1;-1;0))=1

então o resultado é True, portanto, a célula é uma duplicata de uma célula visível logo acima e deve estar, por exemplo, acinzentada.

Nota: Ao usar a OFFSETfunção, a formatação condicional não será interrompida quando uma linha adicional for inserida.

Joma
fonte
-1

Aqui está a solução que acabei de usar:

Criei uma nova coluna C (e ocultei o original (coluna B)). Na nova coluna, usei a fórmula = SUBTOTAL (9, B2) Qual SOMA a ÚNICA linha em que você está interessado. Em seguida, copiei todas as linhas!

Agora, quando você filtra usando o filtro avançado. Os valores são todos ZERO nesta coluna, a menos que estejam visíveis (não filtrados).

Então, o normal = SUMIF () funciona como um campeão. Apenas não use acidentalmente a coluna oculta para somar. Soma na coluna SUBTOTAL () que você acabou de criar.

Capitão Kirk
fonte