Cerca string più lunga all'interno di una serie di stringhe più brevi

Supponendo che voglio creare una function di ricerca che cerca una certa string, diciamo "cane e gatto" e voglio che vada attraverso un determinato arrays e restituisca la colonna b in quella matrix nella row che parzialmente corrisponda a quella string, ad esempio:

Horse 5 Cat 2 Wolf 3 

Quindi in questo esempio mi aspettavo di get "2". È ansible? Ha cercato la networking per le risposte, ma non ha trovato niente di utile. Si prega di notare che la string che sto cercando può essere complessa, ad esempio – "cane, squalo, gatto, piccione" … Quindi deve essere una soluzione universale.

Qualsiasi aiuto sarà apprezzato 🙂

Con dati come:

immettere qui la descrizione dell'immagine

Inserire la "string lunga" in D1 e in E1 immettere:

 =VLOOKUP(LOOKUP(9.99999999999999E+307,SEARCH($A$1:$A$6,D1),$A$1:$A$6),A1:B6,2,FALSE) 

immettere qui la descrizione dell'immagine

Gli appunti:

  • il LOOKUP () restituisce il "gatto"
  • VLOOKUP () ottiene la cifra associata

Di solito usiamo SEARCH () o FIND () o MATCH () per vedere se una grande string contiene una piccola string ……………….. in questo caso vogliamo trovare quale piccola string sia nella grande string!

Potresti dividere la tua matrix per elencare each variabile in una row separata e utilizzare una function VLOOKUP per confrontare each valore con la tabella. (La tabella dovrebbe essere ordinata in ordine alfabetico in primo luogo.)

Estendendo l'esempio, se si divide l'arrays nella colonna C, è ansible utilizzare la fomula seguente nella prima row della colonna D:

 =VLOOKUP(C1,$A$1:$B$3,2,FALSE) 

L'utilizzo del riferimento assoluto alla tabella di ricerca consente di copiare la formula in righe aggiuntive. Il risultato per i tuoi valori suggeriti sarà:

 Cat | 2 | dog | #N/A Horse | 5 | cat | 2 Wolf | 3 | 

Questo functionrà se restituisce sempre un singolo valore numbersco:

 =SUM(IF(ISERR(SEARCH(search_range,search_for,1)),"",values_range)) 

Per i dati di esempio, search_range è l'intervallo che detiene Horse, Cat, Wolf ; search_for contiene "cane; gatto"; e value_range è l'intervallo che tiene 5, 2, 3 .

Spero possa aiutare

Prova questo UDF fuori.

SearchFor è quello che vuoi trovare. Si tratta di una string di text delimitata, ad esempio "gatto, cane, cavallo".

SearchIn è l'intervallo di celle da cercare.

L'ultimo parametro è il delimitatore che divide la variabile SearchFor. Nell'esempio precedente "gatto, cane, cavallo" il delimitatore sarebbe ";".

 Public Function FindString(SearchFor As String, _ SearchIn As Range, _ Delim As String) as String Dim MyArray() As String Dim i As Long Dim FoundCounter As Long Dim Position As Long MyArray = Split(SearchFor, Delim, , vbTextCompare) FoundCounter = 0 For i = UBound(MyArray) To LBound(MyArray) Step -1 Do If FoundCounter = 0 Then Position = InStr(1, SearchIn.Value, MyArray(i), vbTextCompare) Else Position = InStr(Position + 1, SearchIn.Value, MyArray(i), vbTextCompare) End If If Position = 0 Then Exit Do Else FoundCounter = FoundCounter + 1 End If Loop FindString = MyArray(i) & " " & FoundCounter & " " & FindString FoundCounter = 0 Next i End Function Uscire da fare Public Function FindString(SearchFor As String, _ SearchIn As Range, _ Delim As String) as String Dim MyArray() As String Dim i As Long Dim FoundCounter As Long Dim Position As Long MyArray = Split(SearchFor, Delim, , vbTextCompare) FoundCounter = 0 For i = UBound(MyArray) To LBound(MyArray) Step -1 Do If FoundCounter = 0 Then Position = InStr(1, SearchIn.Value, MyArray(i), vbTextCompare) Else Position = InStr(Position + 1, SearchIn.Value, MyArray(i), vbTextCompare) End If If Position = 0 Then Exit Do Else FoundCounter = FoundCounter + 1 End If Loop FindString = MyArray(i) & " " & FoundCounter & " " & FindString FoundCounter = 0 Next i End Function