Cercare una parola intera in una stringa di testo

posted Mar 19, 2011, 4:22 PM by roberto mensa   [ updated Feb 22, 2012, 4:00 AM ]
Stavo bighellonando nel sito di John Walkenbach e mi sono imbattuto nella sua Function ExactWordInString.
E' una semplice UDF con l'obiettivo di ricercare una parola intera all'interno di un testo, restituendo VERO o FALSO a seconda che la parola sia o meno presente.
Ho provato a replicarne l'algoritmo utilizzando le funzioni di Excel con il risultato di una Funzione matriciale che svolge l'identico lavoro.


Sia in A2 il testo e in B2 la parola da ricercare, la formula è:
=MIN(VAL.ERRORE(RICERCA(" "&MAIUSC(B2)&" ";" "&SOSTITUISCI(SOSTITUISCI(MAIUSC(A2);CODICE.CARATT((RIF.RIGA($33:$229)>64)*26+
RIF.RIGA($33:$229));" ");CODICE.CARATT((RIF.COLONNA($AG:$HV)>64)*26+
RIF.COLONNA($AG:$HV));" ")&" "))-1)<0


=MIN(ISERROR(SEARCH(" "&UPPER(B2)&" "," "&SUBSTITUTE(SUBSTITUTE(UPPER(A2),CHAR((ROW($33:$229)>64)*26+ROW($33:$229))," "),
CHAR((COLUMN($AG:$HV)>64)*26+COLUMN($AG:$HV))," ")&" "))-1)<0

da confermare con Ctrl+Maiusc+Invio

La function di JW oltretutto non considera la lettere accentate nella parola,  mentre la funzione proposta restituisce correttamente il risultato anche se parola contiene accentate.

E' comunque possibile alleggerirla usando matrici più limitate:
=MIN(VAL.ERRORE(RICERCA(" "&MAIUSC(B2)&" ";" "&SOSTITUISCI(SOSTITUISCI(MAIUSC(A2);CODICE.CARATT((RIF.RIGA($33:$165)>64)*26+
RIF.RIGA($33:$165));" ");CODICE.CARATT((RIF.COLONNA($AG:$HV)>64)*26+
RIF.COLONNA($AG:$HV));" ")&" "))-1)<0


=MIN(ISERROR(SEARCH(" "&UPPER(B2)&" "," "&SUBSTITUTE(SUBSTITUTE(UPPER(A2),CHAR((ROW($33:$165)>64)*26+ROW($33:$165))," "),
CHAR((COLUMN($AG:$HV)>64)*26+COLUMN($AG:$HV))," ")&" "))-1)<0


In entrambi i casi la formula non distingue tra maiuscole/minuscole. La formula trova la parola anche se essa è delimitata (a destra e a sinistra) da punteggiatura.
Ĉ
roberto mensa,
Mar 21, 2011, 7:23 AM
Comments