› Excel e gli applicativi Microsoft Office › LAMBDA e ricorsione – mettiamoli all'opera
-
AutoreArticoli
-
Ciao a tutti, vi propongo questa piccola sfida, per sfruttare, quando possibile, la combinazione di LAMBDA e la ricorsione per ottenere qualcosa di carino.
Mi spiego meglio:
- data una stringa iniziale, restituire la posizione del "." (mi serviva il punto ed ho creato una funzione dedicata, ma si potrebbe estendere tranquillamente a qualsiasi carattere) in base a quale occorrenza se ne voglia sapere la posizione. Nel caso in cui la stringa sia vuota o si voglia ottenere la posizione di un occorrenza non presente deve ritornare "0".
L'ho chiamata TROVA.PUNTO(testo_Da_Elaborare;tipo_Ricerca;posizione_Iniziale;occorrenza) dove:
- testo_Da_Elaborare (non ha bisogno di spiegazioni)
- tipo_Ricerca (serebbe quale punto, 1, 2, 3, etc)
- posizione_Iniziale (parametro opzionale, se capissi come fare - parte da 0 ed è il contatore della posizione di ritorno)
- occorrenza (parametro opzionale, se capissi come fare - parte da 0 ed è un contatore interno dell'occorrenza attuale trovata)
Logicamente sono passato da gestione nomi, detto questo fatemi sapere così poi vi propongo la mia soluzione
ciao,
ho tempo solo per rispondere ad una parte di quesito (la posizione del punto in una cella). Nomefunzione = trovaC
Se la cella è A1
=LAMBDA(s;n;p;SE(SINISTRA(s)=".";n;trovaC(DESTRA(s;LUNGHEZZA(s)-1);n+1;1)))(A1;1;1)
Un se.errore all'inizio per far uscire 0 in caso di errore
Certo che la formula =SE.ERRORE(TROVA(".";A1;B1);0) risolve tutto il problema in un lampo, le lambda ricorsive non sono proprio il massimo (tra l'altro, parere personale, è più semplice imparare 3 istruzioni di vba che le lambda ricorsive)
ciao forse non ci siamo capiti, lo scopo non è trovare il punto in una stringa, ma creare una funzione che trovi la posizione del punto dinamicamente senza ogni volta stare li a riscrivere la formula ed adattarla.
ciao
In Gestione Nomi
TrovaPunto=LAMBDA(testo_Da_Elaborare;carattere_Da_cercare;tipo_Ricerca;posizione_Iniziale;LET(s;SEQUENZA(LUNGHEZZA(testo_Da_Elaborare));f;SE(STRINGA.ESTRAI(testo_Da_Elaborare;s;1)=carattere_Da_cercare;s);SE.ERRORE(INDICE(FILTRO(f;f*(f>=tipo_Ricerca);FALSO);tipo_Ricerca);0)))
dove vuoi, trova tutte le posizioni:
=TrovaPunto(A1;".";;)
ad esempio se vuoi la seconda occorrenza (9):
=TrovaPunto(A1;".";2;)
se vuoi la seconda, ma dal 7° carattere in poi (15)
=TrovaPunto(A1;".";2;7)
se ometti un parametro è uguale a FALSO (e quindi zero).ciao,
mi pare che la posizione del punto sia esattamente quanto ottenuto dalla formula sopra (immagine)
trovaC va inserita in gestione nomi
Comunque la funzione TROVA, come ho indicato sppta: =SE.ERRORE(TROVA(".";A1;B1);0)) è la soluzione al problema, con l'ultimo parametro dici alla funzione da quale carattere iniziare la ricerca. Ribadisco le mie perplessità sull'utilità pratica di lambda ricorsiva
Allegati:
You must be logged in to view attached files.ciao
LUK
è una piccola sfida per usare LAMBDA nella realtà difficilmente useremo una formula
così ostica
Ciao per me non è stata così piccola
non avevo ancora avuto l'occasione di provare LAMBDA e diciamo che come inizio nn c'è male!!!Edit: nel pomeriggio provo le vostre formule
Ciao ho fatto delle prove, non è che mi siano piaciute del tutto.
Mi sono accorto che avevo testato male la mia funzione TROVA.PUNTO, come potete vedere dall'immagine allegata non sempre tutte e 3 le funzioni riportano il risultato corretto (sempre che io non abbia sbagliato ad interpretare i vostri parametri).
Allego anche il file dove ho fatto le prove, magari così se avessi sbagliato qualcosa potreste intervenire e riproporre.
Intanto stasera, tempo permettendo, dovrò rivedere la mia funzione!
che riporto di seguito:
=LAMBDA(testo_Da_Elaborare;tipo_Ricerca;posizione_Iniziale;occorrenza; LET(str;testo_Da_Elaborare; tipoRic;tipo_Ricerca; pos;posizione_Iniziale+1; lungh;LUNGHEZZA(str); SE(str=""; 0; SE(SINISTRA(str;1)="."; SE(occorrenza=tipoRic-1; pos; TROVA.PUNTO(DESTRA(str;lungh-1);tipoRic;pos;occorrenza+1)); SE(lungh>1; TROVA.PUNTO(DESTRA(str;lungh-1);tipoRic;pos;occorrenza); 0)))))Allegati:
You must be logged in to view attached files. -
AutoreArticoli
