Si inca una!
Pornind de la formula care rezolva problema pusa in
acest subiect (postarea #4):
Cod: Selectaţi tot
=-LOOKUP(1,-RIGHT(TRIM(LEFT(A1,FIND("g/L",A1)-1)),{1,2,3,4,5,6}))
(fata de originalul formulei de mai sus am modificat referinta D1 in A1)
se poate imagina o generalizare a acestei formule pentru returnarea ultimului sau primului numar inclus intr-un sir de caractere.
Inainte insa de a scrie formulele respective, cred ca formula de mai sus merita analizata.
LOOKUP admite doua forme:
- forma "vector": LOOKUP(
valoare_de_cautat,
vector_in_care_se_cauta,
vector_din_care_se_returneaza_rezultatele)
- forma "array": LOOKUP(
valoare_de_cautat,
array_in_care_se_cauta_si_din_care_se_returneaza_si_rezultatele)
Formula de mai sus foloseste a doua forma a lui LOOKUP si mai trebuie precizat ca se bazeaza pe o alta caracteristica a comportamentului acestei functii: cand valoarea cautata nu se gaseste in array, dar este mai mare decat toate valorile din array, LOOKUP returneaza
ultima valoare din array, exceptand erorile, iar daca in array se gasesc valori mai mari decat cea cautata, se va returna ultima dintre valorile mai mici decat cea cautata.
Plecand de la analogia formulei de mai sus cu forma "array" a lui LOOKUP se constata ca in formula de mai sus e cautata valoarea 1 intr-un array, dar care e array-ul? Array-ul e format prin apelarea functiei RIGHT() folosind un array ca al doilea argument. Functia RIGHT(
sir,
n) returneaza din sirul de caractere
sir portiunea din dreapta a sirului formata din
n caractere. Prin apelarea acestei functii in forma din formula de mai sus se creaza array-ul format din 6 elemente, care sunt tot siruri de caractere extrase din dreapta sirului de caractere furnizat ca prim argument: 1 - sirul format din ultimul caracter din dreapta al sirului, 2 - sirul format din ultimele doua caractere din dreapta ale sirului, 3 - sirul format din ultimele 3..., ..., 6 - sirul format din ultimele 6 caractere din dreapta ale sirulu. In aceasta situatie s-a estimat ca numarul cautat (pe care il va returna formula in final) nu va avea mai mult de 6 cifre (inclusiv separatorul zecimal) - daca se doreste se poate mari numarul de cifre, iar exprimarea array-ului sub forma {1,2,3,4,5,6} poate fi inlocuita cu forma ROW($1:$6).
Primul argument al functiei RIGHT() in formula de mai sus e reprezentat de portiunea din sirul aflat in A1care incepe cu primul caracter al acestui sir si se termina inainte de "marker-ul" cautat in sir cu functia FIND().
Recapituland cele de mai sus, putem spune asa:
- functia FIND() cauta in sirul initial (cel din A1) aparitia sirului "g/L" si returneaza numarul pozitiei acestui sir (n) in sirul initial, iar expresia n - 1 e folosita apoi ca al doilea argument al functiei LEFT() care extrage din sirul initial primele n - 1 caractere, pe care le paseaza functiei TRIM() iar rezultatul returnat de TRIM() e folosit ca prim argument in functia RIGHT(), cea care creaza array-ul format din atatea elemente cate sunt cuprinse in array-ul furnizat ca al doilea argument acelaiasi functii RIGHT().
Buun, dar care e rolul celor doi de "minus" ?! Aici e "schmekeria"

Minusul din fata lui RIGHT are un dublu rol: forteaza conversia din sir de caractere in numeric - daca elementul nu poate fi convertit rezulta eroare, dar schimba si semnul numarului rezultat din conversie, pentru a-l face <1. Cu ocazia acestei analize observam ca exista si o limitare a folosirii acestei formule: ea va returna intotdeauna un numar POZITIV, deci daca numarul cautat in sirul initial este negativ, va mai trebui sa facem o verificare legata si de semnul din fata acestui numar in sirul initial. Prin adaugarea acestui "-" in fata lui RIGHT(), array-ul care reprezinta al doilea argument al functiei LOOKUP se va transforma din array de siruri in array de valori numerice si erori. Cum LOOKUP() ignora erorile, se va returna ultima dintre valorile din array mai mici decat valoarea cautata (1). Fiindca aceasta valoare va fi negativa, minusul din fata lui LOOKUP() schimba semnul acestei valori.
Iata acum si formele "generalizate" ale formulei, in care nu e necesara prezenta unui "marker" in sirul initial:
- pentru returnarea ultimului numar existent intr-un sir:
Cod: Selectaţi tot
=-LOOKUP(1,-RIGHT(LEFT(A1,LOOKUP(1,-MID(A1,ROW(INDIRECT("$1:$"&LEN(A1))),1),ROW(INDIRECT("$1:$"&LEN(A1))))),ROW($1:$10)))
- pentru returnarea primului numar existent intr-un sir:
Cod: Selectaţi tot
=-LOOKUP(1,-LEFT(MID(A1,LEN(A1)-LOOKUP(2,1/MID(A1,LEN(A1)-ROW(INDIRECT("$1:$"&LEN(A1)))+1,1),ROW(INDIRECT("$1:$"&LEN(A1))))+1,256),ROW($1:$10)))