Formula Excel: estrai tutte le corrispondenze parziali -

Formula generica

=IF(F5>ct,"",INDEX(data,AGGREGATE(15,6,(ROW(data)-ROW($B$5)+1)/ISNUMBER(SEARCH(search,data)),F5)))

Sommario

Per estrarre tutte le corrispondenze in base a una corrispondenza parziale, è possibile utilizzare una formula di matrice basata sulle funzioni INDICE e AGGREGATA, con il supporto di NUMERO ISTANTANEO e RICERCA. Nell'esempio mostrato, la formula in G5 è:

=IF(F5>ct,"",INDEX(data,AGGREGATE(15,6,(ROW(data)-ROW($B$5)+1)/ISNUMBER(SEARCH(search,data)),F5)))

con i seguenti intervalli denominati: "search" = D5, "ct" = D8, "data" = B5: B55.

Nota: questa è una formula di matrice, ma non richiede control + shift + invio, poiché AGGREGATE può gestire gli array in modo nativo.

Spiegazione

Il cuore di questa formula è la funzione INDICE, con AGGREGATO utilizzato per calcolare l '"ennesima corrispondenza" per ogni riga nell'area di estrazione:

INDEX(data,nth_match_formula)

Quasi tutto il lavoro consiste nell'individuare e riportare quali righe in "dati" corrispondono alla stringa di ricerca e nel riportare la posizione di ogni valore corrispondente a INDICE. Questo viene fatto con la funzione AGGREGATE configurata in questo modo:

AGGREGATE(15,6,(ROW(data)-ROW($B$5)+1)/ISNUMBER(SEARCH(search,data)),F5)

Il primo argomento, 15, dice a AGGREGATO di comportarsi come SMALL e di restituire l'ennesimo valore più piccolo. Il secondo argomento, 6, è un'opzione per ignorare gli errori. Il terzo argomento è un'espressione che genera una matrice di risultati corrispondenti (descritti di seguito). Il quarto argomento, F5, agisce come "k" in SMALL per specificare il valore "nth".

AGGREGATE opera su array e l'espressione seguente crea un array per il terzo argomento all'interno di AGGREGATE:

(ROW(data)-ROW($B$5)+1)/ISNUMBER(SEARCH(search,data))

Qui, la funzione ROW viene utilizzata per generare un array di numeri di riga relativi e ISNUMBER e SEARCH vengono utilizzati insieme per abbinare la stringa di ricerca ai valori nei dati, che genera un array di valori TRUE e FALSE.

La parte intelligente è dividere i numeri di riga per i risultati della ricerca. In un'operazione matematica come questa, TRUE si comporta come 1 e FALSE si comporta come zero. Il risultato è che i numeri di riga associati a una corrispondenza positiva vengono divisi per 1 e sopravvivono all'operazione, mentre i numeri di riga associati a valori non corrispondenti vengono distrutti e diventano errori # DIV / 0. Poiché AGGREGATE è impostato per ignorare gli errori, ignora gli errori # DIV / 0 e restituisce il numero più piccolo "nth" nei valori rimanenti, utilizzando il numero nella colonna F per "nth".

Gestire le prestazioni

Come tutte le formule di matrice, questa formula è "costosa" in termini di risorse con un ampio set di dati. Per ridurre al minimo gli impatti sulle prestazioni, l'intera formula INDICE e CONFRONTA è racchiusa in IF in questo modo:

=IF(F5>ct,"",formula)

dove l'intervallo denominato "ct" (D8) contiene questa formula:

=COUNTIF(data,"*"&search&"*")

Questo controllo interrompe l'esecuzione delle parti INDICE e AGGREGATO della formula una volta che tutti i valori corrispondenti sono stati estratti.

Formula di matrice con PICCOLO

Se la tua versione di Excel non ha la funzione AGGREGA, puoi utilizzare una formula alternativa basata su PICCOLO e SE:

=IF(F5>ct,"",INDEX(data,SMALL(IF(ISNUMBER(SEARCH(search,data)),ROW(data)-ROW($B$5)+1),F5)))

Nota: questa è una formula di matrice e deve essere inserita con CTRL + MAIUSC + INVIO.

Articoli interessanti...