2015-09-28 16 views
5

Ho un foglio con circa un milione di righe. All'interno di una particolare colonna, ho numeri che vanno da 0 a 50,000.Conteggio condizionale nell'intervallo filtrato

Sto provando a determinare, all'interno di un intervallo filtrato, quante celle nell'intervallo filtrato rientrano in un determinato valore.

mi può facilmente fare un =COUNTIF(L:L, "<5000") per vedere quante righe sono meno di 5.000, o =COUNTIFS(L:L,">500",L:L,"<5000") per vedere i numeri della Serie totale che rientrano tra due numeri, ma io non riesco a capire come fare uno di questi in un intervallo filtrato.

Normalmente con dati filtrati, utilizzo la funzione =SUBTOTAL, ma non riesco a vedere come funzionino in questo esempio le funzioni =SUBTOTAL stabilite.

Qualche idea?

+0

Stai cercando una formula o un pezzo di codice VBA? –

+0

formula adesso - alla fine lo inserirò in VBA. - oh, mio ​​male - non mi ero reso conto di averlo etichettato come VBA ... O uno andrebbe bene in realtà .... Alla fine andrà a finire in una macro una volta che lavoro tutto fuori comunque ... –

+0

Righe avere una proprietà '.hidden' (ex 'rows (3) .hidden') che puoi usare per determinare se un filtro ha nascosto una riga o meno. Vorrei solo esaminare ogni riga, contando se soddisfa i tuoi criteri e se non è nascosta. Questo è per VBA, se hai intenzione di usarlo. Non sono sicuro di una formula di Excel. – user3476534

risposta

4

Ecco una soluzione di VBA. Ho commentato il codice quindi non dovresti avere alcun problema a comprenderlo, ma se lo fai semplicemente postback.

Sub Sample() 
    Dim ws As Worksheet 
    Dim lRow As Long, n As Long 
    Dim rng As Range, rngArea As Range 

    '~~> Change this as applicable 
    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 
     '~~> Finding last row in Col L 
     lRow = .Range("L" & .Rows.Count).End(xlUp).Row - 1 

     'Debug.Print Intersect(_ 
           .Range("L2:L" & lRow), _ 
           .Range("L1").Offset(1, 0).SpecialCells(xlCellTypeVisible) _ 
          ).Address 

     '~~> This is your range of all visible cells till the last row in column L 
     '~~> except the header: 
     Set rng = Intersect(_ 
           .Range("L2:L" & lRow), _ 
           .Range("L1").Offset(1, 0).SpecialCells(xlCellTypeVisible) _ 
          ) 

     '~~> Since the area could be non contiguous we use Countif per area and add up 
     For Each rngArea In rng 
      n = n + Application.Evaluate("=COUNTIFS(" & rngArea.Address & _ 
             ","">500""," & rngArea.Address & ",""<5000"")") 
     Next 

     Debug.Print n 
    End With 
End Sub 
+0

Questo è davvero bello - Adoro come hai risolto questo. Grazie mille per gli sforzi! Sto anche rubando la tua fantasia '' ~~> 'per i commenti troppo .... molto più bello del commento VBA standard :) –

+2

'Sto rubando totalmente la tua fantasia' ~~> 'anche per i commenti .... 'NOOOO: D Puoi usare' '-> 'però;) –

1

Sono sicuro che questo è successo a tutti, ma dopo aver letto post su questo argomento per circa 30 minuti e non trovando nulla, ho postato su SO, solo per trovare una soluzione come 4 minuti dopo ...... .

Questa soluzione è per i dati che è nella colonna L, dove i criteri che sto cercando è "meno di 5000"

=SUMPRODUCT(SUBTOTAL(2,OFFSET(L7,ROW(L7:L999999)-ROW(L7),,1)),--(L7:L999999 < 5000)) 
Problemi correlati