Sunteți pe pagina 1din 29

Functii de cautare in Excel (nivel avansat)

forum DrExcel; expert VBA)

Autor: Sorin Georgescu (moderator

Cautam cautam
Ne cautam cheile de la casa, de la masina, ochelarii de pe nas, hartiuta aia pe care am scris ceva
important alaltaieri si pe care am pus-o undeva, bine, sa nu uitam de ea Cautam o adresa, un
numar in memoria telefonului, da cate nu cautam Pana si in Excel avem de cautat si daca
datele unde trebuie sa scormonim se intind pe vreo cateva sute (poate chiar mii) de randuri,
musai sa stim sa cautam bine (!)
Pana sa discutam despre functiile de cautare pe care ni le pune la dispozitie Excel-ul, trebuie sa
observam ca sunt patru elemente care caracterizeaza intotdeauna o cautare:
ce cautam;
unde cautam;
cum cautam;
ce rezultat asteptam in urma cautarii.
De regula cautam o valoare, iar valoarea cautata poate fi una concreta, sau o valoare pe care n-o
stim exact, dar stim ca trebuie sa indeplineasca anumite criterii. Daca in prima situatie lucrurile
sunt relativ simple, in cea de-a doua va trebui sa stapanim si alte proceduri in afara functiilor de
cautare.
Inainte de discutia despre unde cautam va trebui sa lamurim cateva lucruri mai generale.
In primul rand vor trebui bine stapanite adresarea si referinta. Pentru ca o discutie mai extinsa
asupra acstor aspecte ar lungi prea mult lucrurile, consideram ca adresarea folosind stilurile A1
sau R1C1 precum si referinta relativa, absoluta, sau mixta sunt lucruri comune si deja insusite.
De asemenea ceva experienta in utilizarea functiilor ADDRESS() si INDIRECT() ar fi de mare
ajutor.
In al doilea rand ar trebui subliniat ca nu putem face abstractie de faptul ca un proces de cautare
se poate desfasura pe un volum important de date. Oricare dintre functiile de cautare existente in
Excel are ca argument (alaturi de altele) si unde cautam. Deoarece descrierile functiilor de
cautare din help-ul programului fac referire atat la range, cat si la array, cat si la vector
cred ca e necesara o scurta discutie asupra semnificatiei acestor denumiri. Toate reprezinta
tablouri de date. Daca in cazul vectorului lucrurile sunt mai simple pentru ca e vorba de un
tablou de date cu o singura dimensiune (o coloana sau un rand), fie privit ca range, fie ca
array, in ceea ce priveste diferenta dintre range si array aveasta e ceva mai subtila.
Sinonime in aparenta, range-ul este un tablou de date care exista fizic intr-o pagina de Excel,
pe cand array-ul e tot un tablou de date care insa exista doar in memorie e volatil daca
valorile lui nu sunt inscrise undeva, intr-un range. Cele mai multe functii, inclusiv cele de
cautare, au inteligenta necesara de a transforma un range intr-un array, de aceea
explicatiile din help fac in general referinta la array, dar pe parcursul explicatiilor e inscrisa si
echivalenta cu range-ul. O formulare de genul: array a range of cells nu poate fi altfel
interpretata decat in sensul inteligentei despre care vorbeam mai sus pentru ca se pot folosi
ca argumente si array-uri de constante care exista doar in corpul functiei respective, ca
argumente, fara sa existe fizic in vreo foaie de calcul. Forma sub care se pot scrie aceste arrayuri este: {1,2,3;a,b,c} unde acoladele marginesc datele array-ului, virgulele separa
elementele aceluiasi rand (coloana), iar punctul si virgula serpara coloanele (randurile).

In al treilea rand (parca la trei ramasesem cu insiruirea) pentru definirea setului de date in care
se face cautarea (fie el range sau array) o buna intelegere si experienta in lucrul cu functiile
care pot fi folosite la definirea range-urilor sunt binevenite. Daca pana acum n-ati facut
cunostinta cu domnul OFFSET(), ar fi bine sa stiti ca dumnealui returneaza un range si e
foarte folositor si in (sau poate in primul rand in) functiile de cautare. Asa stand lucrurile,
inainte de a vorbi despre functiile de cautare propriu-zise, e musai sa-l descoperim pe domnul
OFFSET().
Dupa cum spuneam, domnul OFFSET() returneaza un range si are urmatoarele argumente:
OFFSET(celula_de_referinta, randuri, coloane, randuri_in_range,coloane_in_range)
celula_de_referinta - adresa celulei de la care se aplica urmatoarele doua argumente ale functiei
pentru determinarea range-ului de returnat;
randuri - distanta in randuri de la celula_de_referinta pana la inceputul range-ului de returnat;
coloane - distanta in coloane de la celula_de_referinta pana la inceputul range-ului de returnat;
randuri_in_range - numarul de randuri ale range-ului de returnat;
coloane_in_range - numarul de coloane ale range-ului de returnat;
Deocamdata atat despre OFFSET() (nu-i mai spunem domn fiindca deja am facut cunostinta
cu el si pare destul de prietenos), dar vom vedea mai departe cat de folositor poate fi si, in
consecinta, cat de prieteni cu el trebuie si noi sa fim.
Cum cautam e simplu: intotdeauna de sus in jos si de la stanga la dreapta. Mai exista insa si alte
conditii in afara de cele triviale pe care le-am mentionat, conditii specifice fiecarei functii de
cautare in parte, care figureaza fie ca argumente explicite ale functiilor, fie ca mod implicit de
cautare, fara prezenta unor argumente asociate. Rezultatul returnat de oricare din functiile de
cautare depinde in mod direct de valoarea (implicita sau explicita) a acestui argument. De fapt
acest argument reprezinta modul in care se face comparatia elementului cautat cu elementele
componente ale tabloului de date in care cautam. De exemplu, daca dorim o potrivire exacta
(exact match) a valorii cautate cu una dintre valorile aflate in range-ul in care cautam, in
anumite situatii va trebui sa declaram aceasta intr-un mod explicit, iar daca in urma cautarii
potrivirea exacta nu a fost gasita, functia va returna o eroare. E posibil sa cautam o potrivire
aproximativa (approximate match), sau sa indicam o comparatie de tipul < sau > (mai
mic sau mai mare) pentru realizarea cautarii, dar folosirea acestor variante presupune intotdeauna
o ordonare intr-un sens crescator sau descrescator a valorilor din coloanele (randurile) unde se
face comparatia pentru realiarea cautarii. Diferite de la functie la functie, argumentele care indica
modul de cautare (cum_cautam), le vom discuta mai aplicat in sectiunile destinate fiecarei
functii de cautare in parte.
Pana sa luam fiecare functie de cautare in parte si sa-i descoperim caracteristicile si
intrebuintarile, a mai ramas sa discutam la modul general despre ce fel de rezultat asteptam de la
functiile de cautare. De cele mai multe ori asteptam ca rezultat o valoare asociata valorii cautate,
dar sunt situatii in care ne intereseaza doar daca valoarea cautata exista, sau pozitia (randul sau
coloana) in care se afla aceasta. Functiile de cautare vor intoarce intotdeauna un rezultat, fie ca e
vorba de o valoare (cea cautata, sau nu, in functie de cat de bine am folosit functia respectiva),
fie ca e vorba de o eroare pentru ca in urma cautarii nu s-a gasit valoarea respectiva in conditiile
cerute, sau pentru ca argumentele furnizate nu respecta conditiile solicitate. In functie de cum

vrem sa arate datele noastre care cuprind si formule care pot returna erori, trebuie sa fim pregatiti
pentru tratarea acestor erori, cunoscand modul de functionare al urmatoarelor functii: IF(),
IFERROR(), ISERR(), ISERROR() si ISNA().
Acestea fiind zise si, sper eu, si cat-de-cat intelese, Sa le numaram, coane Fanica (vorba
poetului )
Raspunsul e tot de pus intre ghilimele:
Cei patru evanghelisti sunt urmatorii trei: Luca si Matei (!)

Culmea e ca initialele chiar se potrivesc: Lookup si Match!!!


Acestea sunt cele doua functii de cautare de baza. LOOKUP() are si variantele VLOOKUP()
si HLOOKUP(), iar MATCH() se foloseste de obicei in combinatie cu INDEX(). Si asa se
explica si raportul dintre primul citat si al doilea, fiindca la numaratoare ne ies 5 in loc de 4
(Ghita! Renumeratie dupa buget mica, coane Fanica, sa traiti )
LOOKUP()
Help-ul acestei functii ne spune ca exista doua forme in care putem folosi LOOKUP: forma
vectoriala si forma de tip array. Sintaxa functiei difera si ea de la forma la forma, dupa cum
urmeaza:
Forma vectoriala: LOOKUP(valoare, vector_de_cautat,vector_de_returnat_rezultat);
Forma de tip array LOOKUP(valoare,array).
Argumentele functiei in forma vectoriala inseamna:
valoare - valoarea de cautat care poate fi sub forma unei valori, o referinta la o valoare de tip
numeric, sir de caractere, sau logic, sau o functie care returneaza asemenea tipuri de valori;
vector_de_cautat - vectorul in care se cauta;
vector_de_returnat_rezultat - vectorul din care se returneaza rezultatul.
Functia cauta valoarea in vectorul furnizat ca al doilea argument si returneaza valoarea asociata
pozitiei din vectorul furnizat ca al treilea argument. Pentru ca functia sa returneze un rezultat
corect primul vector trebuie sa aiba valorile ordonate crescator (...,-2, -1, 0, 1, 2, ..., A-Z,
FALSE, TRUE), iar cei doi vectori furnizati ca argumente vor trebui sa aiba acelasi numar de
elemente.
Functia nu face distinctie intre majuscule si minuscule la comparatia sirurilor de caractere. In
cazul in care valoarea cautata nu se afla printre valorile din vectorul de cautat, functia foloseste
relatia cea mai mare dintre cele mai mici sau egale cu valoarea cautata valori pentru a face
corespondenta intre valoarea cautata si valorile din vectorul de cautat. Daca valoarea cautata e
mai mica decat orice valoare din vectorul de cautat functia returneaza eroarea #N/A.
In figura de mai jos gasiti o ilustrare a folosirii functiei LOOKUP() pentru a atasa calificative
valorilor notelor obtinute de o grupa de elevi/studenti.

In exemplul de mai sus argumentele al doilea si al treilea sunt de fapt range-uri din aceeasi foaie
de calcul (aceste range-uri se pot afla si in alte foi de calcul, dar in aceasta situatie referinta ar
trebui prefixata de denumirea foii de calcul si separatorul !). De asemenea este de remarcat
folosirea referintelor absolute in cazul range-urilor furnizate ca argumente si a referintei relative
in cazul valorii de cautat pentru ca la copiere formula sa actualizeze doar referinta (relativa) a
valorii de cautat, referintele absolute pastrandu-se nemodificate.
Aceeasi formula se poate scrie folosind array-uri de constante pentru al doilea si al treilea
argument:
=LOOKUP(B2,{0,5,7,9, "absent"},{"nesatisfacator","satisfacator","bine","foarte
bine","X"})
Argumentele functiei in forma de tip array insemana:
valoare - valoarea de cautat care poate fi sub forma unei valori, o referinta la o valoare de tip
numeric, sir de caractere, sau logic, sau o functie care returneaza asemenea tipuri de valori;
array - tabloul de valori in care se face cautarea si din care se face si returnarea valorii asociate;
Al doilea argument, cel de tip array, va trebui sa fie un tablou de valori de minimum 2 randuri
(sau doua coloane) pentru a returna o valoare asociata valorii de cautat. In cazul in care se
furnizeaza ca al doilea argument un array cu o singura linie (coloana), valoarea returnata va fi
insasi valoarea de cautat. Modul de cautare este acelasi ca la forma vectoriala, iar pentru
stabilirea modului de parcurgere al array-ului (pe linie sau pe coloana) se compara cele doua
dimensiuni ale tabloului si se alege cea mai mare.
In imaginea de mai jos e reluat exemplul anterior, dar cu folosirea formei de tip array a functiei
LOOKUP():

Iata si forma cu array de constante pentru acceasi situatie:


=LOOKUP(B2,{0,5,7,9, "absent";"nesatisfacator","satisfacator","bine","foarte
bine","X"})
In exemplul de mai jos functia LOOKUP() e folosita pentru returnarea denumirii zilei
saptamanii pentru un sir de date dintr-un tabel:

Comparand cele doua forme al functiei LOOKUP(), putem spune ca prima forma ofera
posibilitatea ca al treilea argument sa nu fie strict legat de al doilea fapt evident atunci cand
folosim ca argumente range-uri (al doilea si al teilea argument pot fi range-uri aflate in foi de
lucru diferite, in pozitii diferite pe foaia de lucru etc.).
VLOOKUP() si HLOOKUP()
Cele doua functii sunt forme ale functiei LOOKUP() si singura diferenta dintre ele este aceea ca

VLOOKUP() executa o cautare pe verticala (cautand valoarea de cautat in prima coloana a


unui range), in timp ce HLOOKUP() cauta pe orizontala (cautand valoarea de cautat in primul
rand al unui range).
Ma voi referi doar la VLOOKUP(), analogia cu HLOOKUP() fiind foarte usor de facut avand
in vedere singura diferenta dintre cele doua, mentionata mai sus.
Forma generala a functiei este urmatoarea:
VLOOKUP(valoare, tablou_array, index_coloana, [modul_de_comparatie])
valoare - valoarea de cautat care poate fi sub forma unei valori, o referinta la o valoare de tip
numeric, sir de caractere, sau logic, sau o functie care returneaza asemenea tipuri de valori; daca
valoarea furnizata e mai mica decat orice valoare din prima coloana a celui de-al doilea
argument, functia returneaza eroarea #N/A;
tablou_array - range pe a carui prima coloana se face cautarea; se poate folosi o referinta la un
range sau un nume asociat range-ului respectiv; datele din range pot fi numerice, siruri de
caractere sau de tip logic ne se face distinctia intre minuscule si majuscule;
index_coloana - numarul coloanei tabloului (furnizat ca al doilea argument) de pe care se va
returna valoarea in cazul gasirii valorii cautate pe prima coloana (1 este indexul primei coloane
al tabloului furnizat ca al doilea argument); valoarea acestui argument trebuie sa fie numerica de
tip intreg (poate fi si o referinta, sau o alta functie care returneaza o valoare numerica) dar daca e
mai mica decat 1 se va returna eroarea #VALUE!, iar daca valoarea acestui argument depaseste
numarul de coloane al celui de-al doilea argument va fi returnata eroarea #REF!;
modul_de_comparatie - argument optional de tip logic, prin care se specifica modul in care se
face comparatia pentru a stabili daca valoarea cautata a fost gasita: FALSE pentru o potrivire
exacta, TRUE (sau omis) pentru o potrivire aproximativa, caz in care se utilizeaza metoda de
potrivire de la LOOKUP (cea mai mare dintre cele mai mici valori decat valoarea cautata sau
egala cu valoarea cautata) si tot ca la LOOKUP, array-ul trebuie sa fie ordonat ascendent dupa
prima coloana.
Din exemplele urmatoare ne vom lamuri si mai bine cum functioneaza VLOOKUP().
In primul exemplu functia VLOOKUP() e folosita pentru completarea automata a greutatii unui
reper dintr-un extras de armaturi folosit in proiectarea de rezistenta in constructii.
Mai intai se realizeaza intr-o foaie de lucru urmatorul tabel:

Denumim tabelul creat armaturi (se selecteaza celulele si se tasteaza armaturi in Name
Box confirmat cu Enter).
Tabelul in care dorim sa folosim informatia din tabelul armaturi ar arata cam asa:

In exemplul de mai sus functia VLOOKUP() e folosita pentru returnarea greutatii unitare a barei
in functie de diametrul acesteia (in E4 si apoi copiata in jos, pe coloana). Functia folosita in
celula F4 si apoi copiata in jos, pe coloana, calculeaza greutatea totala aferenta pozitiei
respective din lista, dar verifica si existenta datelor in celulele care sunt implicate in calcul, iar in
cazul in care fie grutatea unitara, fie numarul de bucati nu au fost completate, returneaza un sir
vid ().
Se pot imagina nenumarate exemple de folosire a functiilor VLOOKUP() sau HLOOKUP() in
situatiile in care cunoastem o informatie si dorim returnarea informatiilor asociate acesteia dintro lista prestabilita si intretinuta in timp.
Legat de folosirea functiilor VLOOKUP() si HLOOKUP() merita amintit faptul ca ambele
impun restrictia cautarii unei valori pe prima coloana (primul rand) al range-ului furnizat ca al
doilea argument.
O alta observatie valabila pentru toate functiile de cautare, este aceea ca o data gasita valoarea
cautata in tabloul de date folosit pentru cautare functia va furniza valoarea asociata, fara a exista
posibilitatea de a specifica o eventuala continuare a cautarii pentru a gasi eventualele alte aparitii
in tabloul de date a valorii cautate. Pentru rezolvarea unei asemenea probleme va trebui sa
imaginam o formula mai complexa, eventual de o factura speciala, care sa poata extinde cautarea
si dupa prima aparitie a valorii de cautat. Un exemplu in acest sens va fi discutat in finalul
acestui articol.
MATCH()
Similara functiilor descrise mai sus, functia MATCH() nu mai returneaza o valoare asociata
valorii cautate ci pozitia valorii cautate in segmentul de date furnizat ca al doilea argument.
Forma generala a functiei este urmatoarea:
MATCH(valoare, tablou_array, [modul_de_comparatie])
valoare - valoarea de cautat care poate fi sub forma unei valori, o referinta la o valoare de tip
numeric, sir de caractere, sau logic, sau o functie care returneaza asemenea tipuri de valori;
tablou_array - range-ul in care se face cautarea; se poate folosi o referinta la un range sau un
nume asociat range-ului respectiv; datele din range pot fi numerice, siruri de caractere sau de tip

logic;
modul_de_comparatie - argument optional de tip numeric (-1, 0 sau 1), prin care se specifica
modul in care se face comparatia pentru a stabili daca valoarea cautata a fost gasita (nu se face
distinctia intre minuscule si majuscule): 0 pentru o potrivire exacta, 1 (sau omis) pentru o
potrivire aproximativa, caz in care se utilizeaza metoda de potrivire de la LOOKUP (cea
mai mare dintre cele mai mici valori decat valoarea cautata sau egala cu valoarea cautata) si tot
ca la LOOKUP, array-ul trebuie sa fie in ordine ascendenta, -1 pentru situatia in care dorim o
potrivire aproximativa inversa ca cea folosita in cazul functiei LOOKUP() cea mai mica
sau egala cu valoarea de cautat dintre valorile mai mari decat aceasta, cu conditia ca array-ul
furnizat ca al doilea argument sa fie ordonat descrescator.
Pozitia returnata este intotdeauna relativa la elementul de inceput al array-ului furnizat ca al
doilea argument. De exemplu, daca array-ul furnizat ca al doilea argument este C3:C100, iar
valoarea cautata s a potrivit cu valoarea din celula C5, functia va returna valoarea 3.
In cazul folosirii functiei cu primul argument sir de caractere si al treilea argument 0 se pot folosi
wild card-uri (* - pentru un grup de caractere si ? pentru un singur caracter). Daca se
doreste gasirea chiar a caracterelor * sau ?, acestea trebuie prefixate de o tilda ~.
Daca functia nu a gasit nicio potrivire a valorii cautate in conditiile specificate de parametrul al
treilea, se returneaza eroarea #N/A.
In general utilizarea acestei functii este similara utlizarii functiilor descrise anterior, cu
mentiunea ca in afara de avantajele folosirii wild card-urilor si a metodei inverse de potrivire
fata de familia LOOKUP, mai exista si flexibilitatea ordinii de cautare (pe rand sau pe
coloana), iar in combinatie cu INDEX() dispare si restrictia legata de cautare a valorii asociate in
prima sau ultima coloana (rand) a array-ului in care se cauta.
Pana la prezentarea unui exemplu legat de folosirea functiei MATCH() cred ca ar fi bine sa
aruncam mai intai o privire si asupra functiei
INDEX()
Nu este tocmai o functie de cautare, ci mai degraba o functie care returneaza o referinta la un
range, functia INDEX() se prezinta si ea tot sub doua forme: forma referinta si forma array.
Ma voi opri aici doar asupra formei array, a carei sintaxa generala este:
INDEX(array, numar_rand, numar_coloana)
array - range-ul in care se face cautarea; se poate folosi o referinta la un range sau un nume
asociat range-ului respectiv; datele din range pot fi numerice, siruri de caractere sau de tip logic
poate fi si un array de constante; daca array-ul este format doar dintr-un rand sau doar dintr-o
coloana, argumentul corespunzator e optional (argumentul al treilea nu este necesar, se aplica cel
de-al doilea argument); daca array-ul are mai mult de un rand si mai mult de o coloana, e
necesara specificare ambelor argumente referitoare la rand si coloana (2 si 3), iar in cazul in care
unul din acestea lipseste, functia va returna un array constand in valorile intregului rand sau
coloane specificate;
numar_rand - indica numarul randului din care se va returna valoarea solicitata prin al treilea
argument daca acest argument lipseste, este obligatorie prezenta celui de-al treilea;
numar_coloana - indica numarul coloanei din care se va returna valoarea solicitata din randul
indicat prin al doilea argument daca acest argument lipseste, este obligatorie prezenta celui deal doilea;
Daca sunt furnizate ambele argumente referitoare la rand si coloana si acestea sunt >0, functia va
returna elementul din array aflat la intersectia randului si coloanei specificate.

Daca unul dintre argumentele referitoare la rand si coloana are valoarea 0, functia va
returna coloana, respectiv randul mentionat sub forma unui array (formula trebuie confirmata cu
Ctrl+Shift+Enter).
Ambele argumente referitoare la rand si coloana trebuie sa indice o pozitie existenta in array,
altfel functia va returna eroarea #REF!
Din cele scrise mai sus despre MATCH() si INDEX() putem acum deduce cu usurinta cum pot
fi folosite acestea in tandem:
=INDEX(array1,MATCH(valoare, array2, [modul_de_comparatie]), MATCH(valoare,
array2, [modul_de_comparatie]))
Este de rmarcat ca functia MATCH() poate fi aplicata asupra unor alte array-uri decat cel folosit
ca argument al functiei INDEX() cu grija de a exista corespondenta necesara intre valorile
furnizate de MATCH() pentru randul si coloana cautate cu INDEX().
In exemplul urmator vom vedea exact aceasta situatie si il vom vedea si pe OFFSET() in
actiune, intr-un mod colateral, dar care merita evidentiat.
Pornim de la un exemplu redus de baza de date inscrisa in foaia de calcul denumita Monitoare:

In tabelul de mai sus pe coloana A avem denumirile unor modele de monitoare, iar pe cooanele
B:F cateva caracteristici. Oricine a lucrat cu un asemenea tip de tabel stie din experienta ca atat
numarul de randuri cat si chiar numarul de coloane pot varia in timp (mai adaugam un model,
sesizam ca ni se cer informatii si despre alte caracteristici, asa ca mai adaugam coloanele
necesare si completam informatiile pentru toate modelele, stergem intreaga inregistrare pentru ca
modelul nu se mai comercializeaza etc.). O asemena baza de date bine intretinuta ne va permite
sa extragem informatiile inregistrate aici cu mare usurinta daca stim cum sa stapanim
dimensiunile si structura ei (numarul de randuri si numarul de coloane pe care avem date)
solutia: declararea de nume si asocierea acestora cu range-uri dinamice.
In tabelul de mai sus pe coloana A vom avea inscrise denumirile de modele indiferent daca
avem date despre un model sau altul, coloana A este definitorie pentru numarul de randuri al
bazei noastre de date, nu numai pentru ca denumirea modelului e importanta, dar aceste denumiri
vor fi unice. In exemplul de folosire a informatiilor din baza de date vom folosi lista de modele
pentru a extrage informatia necesara din baza de date si de aceea pentru realizarea acestei liste
(vom vedea cum, la momentul potrivit) vom defini numele modele.

Desi acest articol nu se refera in mod special la modul de definire a numelor in Excel, o scurta
introducere si in acest subiect cred ca e binevenita. Putem defini un nume in doua feluri:
1. selectand o celula sau un grup de celule si tastand numele respectiv (fara ghilimele) in campul
Name Box (in stanga barei de formule) si confirmand denumirea cu Enter (ca in exemplul
anterior cu extrasul de armaturi);
2. folosind Name Manager (Formulas -> Name manager in Excel 2007, Insert -> Name ->
Define in Excel 2003, sau mai simplu Ctrl+F3 in oricare dintre versiuni).
A doua optiune ne permite definirea unui nume si folosirea unei formule pentru definirea rangeului asociat numelui respectiv. In fereastra de dialog care apare, tastam numele pe care dorim sal definim, iar la Refers To: in loc sa introducem o referinta la un range, folosim OFFSET()
Definitia pentru numele modele va folosi urmatoarea formula pe care terbuie s-o scriem in
caseta Refers To:
=OFFSET(Monitoare!$A$2,0,0,COUNTA(Monitoare!$A$2:$A$1000))
Formula de mai sus returneaza un range care incepe in celula Monitoare!$A$2, si are un numar
de COUNTA(Monitoare!$A$2:$A$1000) randuri. Functia COUNTA() folosita pentru stabilirea
numarului de randuri returneaza numarul de celule care nu sunt goale dintr-un range (in cazul
asta range-ul Monitoare!$A$2:$A$1000, apreciind ca nu vom avea mai mult de 999 de modele
inregistrate, dar range-ul folosit poate merge pana la numarul maxim de randuri (65536 pentru
Excel 2003, sau intreaga coloana 220 pentru Excel 2007 in Excel 2007 se accepta si referinta
$A:$A pentru intreaga coloana). Procedand in acest fel ne asiguram ca daca mai adaugam un
model in baza de date, range-ul asociat acestui nume se va actualiza automat ca dimensiune, de
aceea si denumirea de range dinamic.
La fel vom proceda pentru definirea numelui caracteristici pentru denumirile coloanelor
folosite la inregistrarea caracteristicilor fiecarui model inscris in baza de date. Formula folosita
va fi:
=OFFSET(Monitoare!$B$1,0,0,1,COUNTA(Monitoare!$B$1:$Z$1))
presupunand ca nu vom folosi coloanele mai spre dreapta de coloana Z, dar putem folosi un
range mai mare ca argument al functiei COUNTA(), daca vom considera ca e cazul.
Avem pana acum doua nume definite: modele pentru coloana A si caracteristici pentru
randul 1. Ne mai ramane sa definim un nume si pentru datele propriu-zise. Vom defini data (nu
date pentru ca s-ar confunda cu functia cu acelasi nume si Excel-ul nu ne va permite folosirea
acestei denumiri) folosind urmatoarea formula:
=OFFSET(Monitoare!$B$2,0,0,COUNTA(Monitoare!$A$2:$A$1000),COUNTA(Monitoar
e!$B$1:$Z$1))
Remarcati folosirea acelorasi formule COUNTA() pentru definirea numarului de randuri si
coloane ca si cele folosite la definirea numelor anterioare.
Dupa definirea acestor nume putem edita baza noastra de date in aproape toate modurile cu
putinta (mai putin recomandabil ar fi sa stergem toate randurile si/sau toate coloanele, dar in
rest): adaugand randuri, adaugand coloane (scriind si ceva date in ele, mai ales pe coloana A si
randul 1, evident) sau stergand randuri sau coloane. Bineinteles ca editarea bazei de date va
trebui sa fie facuta in conjunctie cu editarea proceurilor prin care extragem informatia din baza
de date.
Una dintre posibilele proceduri e exemplificata mai jos:

Pe coloana A, incepand cu A2 si terminand unde consideram de cuviinta tot pe coloana A s-a


folosit procedura alegerii din lista a modelului folosind Data Validation (Data -> Data
Validation). Mai intai se selacteaza celulele unde dorim sa aplicam data validation, se
selecteaza din menu Data Validation (Data -> Data Validation) si in dialogul care apare se
selecteaza la Allow: tipul List, iar la Source: se scrie =modele (fara ghilimele, evident),
se confirma cu OK si am instituit in felul acesta pentru celulele selectate data validation de tip
list folosind ca sursa range-ul atasat numelui modele. Numele definite prin procedurile
explicate mai sus sunt nume accesibile la nivelul intregului fisier pot fi referite in orice formula
din orice foaie de lucru aceasta caracteristica ne-a permis sa folosim numele modele si in
formula folosita pentru definirea data validation, chiar daca range-ul asociat acestui nume se
afla in alta foaie de lucru decat cea in care sunt celulele unde dorim sa aplicam data validation.
Asa arata lista de modele pe care am definit-o folosind procedurile descrise mai sus si din care
putem selecta (in cele n randuri pentru care am aplicat acest tip de data validation) modelul ale
carui caracteristici dorim sa le vizualizam in coloanele B:F:

Dupa selectia din lista caracteristicile modelului selectat apar in coloanele B:F unde pe fiecare
rand pe care am instituit data validation exista formule ca cele specificate in imaginea de mai
jos:

In formulele folosite functia IF() n-are decat rolul de a testa daca exista o selectie din lista in
celula de pe coloana A a randului curent. Functia LEN() din conditia functiei IF() returneaza
numarul de caractere al textului existent in celula referita si e preferabila utilizarea ei pentru
testarea existentei sau nu a unei valori afisate intr-o anumita celula atunci cand nu stim sigur
daca celula respectiva contine o formula sau nu. In situatia in care celula testata contine o
formula care returneaza un sir vid (), atat functia ISBLANK() cat si COUNTA() raporteaza
celula ca nefiind goala, chiar daca in aparenta aceasta nu contine (nu afiseaza, de fapt) nimic (nu
aceasta e si situatia celulelor din baza de date, unde toate datele sunt introduse manual, fara
folosirea de formule). Folosind functia LEN(), testam doar existenta sau nu a unui text (numar,
valoare logica etc.) afisat in celula.
Dupa cum se vede, in cazul in care in celula din coloana A a randului curent exista o valoare
selectata, celulele din coloanele B:F afiseaza caracteristicile modelului selectat folosind
tandemul INDEX-MATCH. Deoarece definirea corpului de date (data) a fost facuta in
conjunctie cu definirea coloanei modele si a randului caracteristici, functiile MATCH()
folosite pentru returnarea numarului randului si numarului coloanei de la intersectia carora
functia INDEX() returneaza valoarea cautata, opereaza asupra numelor modele si
caracteristici, iar functia INDEX() are ca prim argument numele data.
In principiu cam astea ar fi principalele functii de cautare pe care ni le pune la dispozitie Excelul. Exista insa o multime de alte posibilitati ca prin combinarea altor functii sa cream formule
care folosesc tot la cautare. Ducand mai departe exemplul de mai sus, in cele ce urmeaza vom
exemplifica folosirea (si a) unor alte functii pentru a crea o lista de modele corespunzatoare unei
anumite valori pentru caracteristica Diagonala.
Vom folosi pentru alegerea valorii diagonalei acceasi procedura de selectare din lista (data
validation). Pentru aceasta, intr-o alta foaie de calcul vom introduce pe o coloana (nu conteaza
care) incepand cu randul 1 (sau altul) valorile de la 12 la 30 reprezentand posibilele valori pentru
caracteristica Diagonala. Selectam range-ul astfel completat si in Name Box tastam diag
(fara ghilimele) si confirmam cu Enter. Nu avem nevoie pentru aceasta exemplificare de un
nume cu un range dinamic atasat. Avem nevoie in schimb de un nume cu un range dinamic atasat
pentru valorile diagonalelor din baza de date, din motivele legate de intretinerea acesteia,
enuntate anterior. Folosim aceeasi procedura descrisa pentru crearea numelui modele, dar
evident ca vom inlocui in formula coloana A cu coloana B, iar numele folosit va fi
diagonala.

Spatiul pregatit pentru realizarea procedurii de creare a listei de monitoare existente in baza de
date si avand o anume diagonala va arata cam asa:

In celula B35 va aparea lista creata cu data validation din care vom selecta diagonala dorita, iar
in range-ul D35:D45 va aparea lista modelelor de monitoare inregistrate in baza noastra de date
care corespund acestei cerinte.
Imaginile urmatoare ilustreaza comportamentul acestei proceduri pentru diverse valori ale
diagonalei selectate.

Formula folosita pentru selectarea tipurilor de modele care indeplinesc cerinta specificata este
cea inscrisa in chenar, la baza imaginii , copiata in jos in range-ul D35:D45 si arata cam asa:
{=IF(LEN($B$35)=0,"",IF(SUMPRODUCT(--(diagonala=$B$35))=0,"",IF(ROW($A35)34>SUMPRODUCT(--(diagonala=$B$35)),"",INDEX(modele,SMALL(IF((-(diagonala=$B$35))=0,COUNTA(modele)+ROW(diagonala),ROW(diagonala)1),ROW($A35)-34)))))}
Formula folosita e de un tip special, denumit formula CSE, sau array formula si se confirma cu
Ctrl+Shift+Enter, nu doar cu Enter (de unde si denumirea de formula CSE). Astfel de formule
sunt folosite pentru prelucrarea in memorie a array-urilor folosite ca argumente in functiile
componente ale formulei. Acoladele care incadreaza formula nu se tasteaza, ele apar automat la
confirmarea formulei cu Ctrl+Shift+Enter si dispar, tot automat, atunci cand editam formula,
pentru reintroducerea ei ca formula CSE dupa editare fiind necesara confirmarea tot cu
Ctrl+Shift+Enter. Nu voi insista aici asupra formulelor CSE, ci voi incerca doar o analiza
succinta a modului ei de functionare.
Ca si in exemplul anterior primul IF() are rolul de a verifica existenta unei valori in celula in care
folosim data validation (B35).
Functia folosita drept conditie in cazul celui de-al doilea IF() este una pe care n-am discutat-o
pana acum, si nici n-o sa intru in detalii asupra ei in acest moment, fiind suficient sa mentionez
ca:
SUMPRODUCT(--(diagonala=$B$35))
Reutrneaza numarul de inregistrari din baza de date care indeplinesc cerinta de valoare a
diagonalei specificata in celula B35.
Al treilea IF() testeaza daca numarul randului pe care se afla inscrisa formula 34 (observati ca
in cazul randului 35, 35-34=1, pe randul 36 aceasta valoare va deveni 2 s.a.m.d.) este mai mare
decat numarul de inregistrari care indeplinesc conditia, raportat de SUMPRODUCT(-(diagonala=$B$35)). In cazul in care valoarea ROW($A35)-34 depaseste valoarea
SUMPRODUCT(--(diagonala=$B$35)) intreaga formula va returna un sir vid ().
Partea cea mai interesanta a formulei este insa ultima:
INDEX(modele,SMALL(IF((--

(diagonala=$B$35))=0,COUNTA(modele)+ROW(diagonala),ROW(diagonala)1),ROW($A35)-34))
In cazul in care conditia explicata mai sus este falsa, se vor returna din range-ul asociat numelui
modele acele valori care corespund cu valoarea calculata de:
SMALL(IF((-(diagonala=$B$35))=0,COUNTA(modele)+ROW(diagonala),ROW(diagonala)1),ROW($A35)-34)
Functia SMALL() returneaza cea mai mica k valoare dintr-un range, unde k=1 e valoarea cea
mai mica, iar k<=numarul_de_elemente_in_range ar fi valoarea cea mai mare. Analizand
portiunea de formula evidentiata mai sus putem observa ca valoarea lui k este calculata de
formula ROW($A35)-34 care pentru randul 35 returneaza valoarea 1, iar prin copiere, pe
celelalte randuri va returna valorile 2, 3, 4,
Mai ramane sa ne lamurim cum este creat range-ul (de fapt array-ul) din care se returneaza
SMALL(,k). Pentru ca folosim aceasta constructie cu SMALL() pentru a returna numarul
randului din modele, SMALL va trebui sa returneze acest numar.
Portiunea IF((-(diagonala=$B$35))=0,COUNTA(modele)+ROW(diagonala),ROW(diagonala)-1) este cea
care determina folosirea acestei formula ca formula CSE pentru ca in corpul acestei functii IF()
se creaza array-ul care este transmis ca parametru functiei SMALL(). Acest array este un array
de numere de randuri care indeplinesc conditia de valoare a diagonalei. Functia folosita pe post
de conditie a functiei IF in discutie, adica: ((--(diagonala=$B$35))=0 testeaza daca valoarea
expresiei (diagonala=$B$35) este egala cu 0 si daca da, functia IF returneza expresia
COUNTA(modele)+ROW(diagonala) care este un numar mai mare decat numarul de randuri
existente in baza de date +1, iar daca expresia este diferita de 0, functia IF returneaza expresia
ROW(diagonala)-1) care este de fapt numarul randului inregistrarii din baza de date care
satisface conditia legata de valoarea diagonalei. Pentru ca toata aceasta expresie este aplicata
asupra unui intreg range (cel atasat numelui diagonala) si ca intreaga formula e introdusa ca
formula CSE, aceasta portiune de formula va returna un array in care vor exista numerele
randurilor din modele care satisfac conditia impusa si numere de randuri care depasesc
numarul maxim de randuri din baza de date, dar care nu vor intra in discutie pentru ca functia
SMALL() va returna doar numarul randurilor al caror index in acest array este mai mic sau egal
cu cel numarul de inregistrari care satisfac conditia impusa.
In formula analizata mai sus am folosit functii care n-au facut obiectul acestui articol ca descriere
detaliata si explicare a modului lor de functionare si utilizare, dar depsre versatilitatea lui
SUMPRODUCT() sau magia formulelor CSE vom mai discuta, poate, cu alta ocazie.
Pana atunci, sa cautati bine (!)
Autor: Sorin Georgescu (moderator forum DrExcel; expert VBA)
SUMPRODUCT, probably the best function ever (nivel expert)
Georgescu (moderator forum DrExcel; expert VBA)

Autor: Sorin

Cei mai multi dintre noi folosim Excel-ul la pastrarea unor informatii in tabele, informatii pe care
pe urma le procesam. Cel mai adesea procesarea asta inseamna inmultiri, adunari si
numarari.
Ei bine, SUMPRODUCT() asta le poate face pe toate, ba si inca ceva pe deasupra. Cititi mai

departe, inecrcati exemplele si o sa va convingeti!


Din help-ul Excel-ului aflam despre SUMPRODUCT cam atat:
Multiplica elementele corespunzatoare ale array-urilor furnizate ca argumente si insumeaza
aceste produse.
Forma ei generala e simpla, poate printre cele mai simple dintre functiile care necesita
argumente:
SUMPRODUCT(array1, array2, array3,)
unde array1, array2, array3, pot fi pana la 256 la numar cu conditia ca toate sa aiba aceeasi
dimensiune si sa contina numai valori numerice.
Folosita in forma ei standard functia face exact ce spune help-ul ca face: inmulteste elementele
omoloage ale array-urilor furnizate ca argumente si insumeaza aceste produse, dar
Inmultirea are doua reguli pe care le putem specula:
orice_numar * 0 = 0;
orice_numar * 1 = orice_numar.
Ce ar fi daca in loc de array-uri ca argumente am folosi expresii logice asociate acelor array-uri?
Ceva de forma:
array = valoare
fiindca SUMPRODUCT stie sa lucreze cu array-uri, dar cu array-urile alea nu stie decat sa faca
inmultiri, bineinteles ca vom obtine ca rezultat o eroare pentru ca SUMPRODUCT asteapta
numere si noi ii oferim valori logice de inmultit.
Pai atunci trebuie sa gasim o metoda prin care sa transformam valorile logice in numere, si in ce
numere le-am putea transforma ? tocmai in 0 (pentru FALSE) si 1 (pentru TRUE), adica taman
aia doi care au un comportament mai aparte cand vine vorba sa-i inmultim maare smecherie!
Dar ca s-ajungem la cei doi (0 si 1) ne folosim de ceea ce se numeste operator unar, adica
operatoru ala care n-are nevoie de doi termeni ca sa faca o operatie, ci doar de unu. Cel mai
breaz dintre operatorii astia unari e domnul -, adica minus. Stim ca daca avem un numar si-l
punem pe domnul minus in fata lui, gata operatia numarul devine negativ (sau pozitiv daca
era initial negativ uite cum isi schimba numerele astea caracterul doar cand vad o linie-n fata
lor) Dar sa vedeti cum isi schimba caracterul valorice logice cu domnul minus in fata!
Ca sa va convingeti faceti urmatorul experiment:
In range-ul A1:A20 scrieti niste numere (unele dintre ele sa se repete de 2, 3 ori), in celula B1
scrieti un numar dintre cele care se repeta, in C1 scrieti formula =$A$1:$A$20=$B$1 si copiati-o
in jos pana in C20, in D1 scrieti formula =-($A$1:$A$20=$B$1) si copiati-o pana in D20, iar in
E1 mai adaugam un domn minus la formula din D1, adica =--($A$1:$A$20=$B$1) si copiati-o
pana in E20 ca in figura de mai jos:

Pe coloana E am obtinut o serie de 0 si 1 aferente valorilor de fals/adevarat ale relatiei de


egalitate folosita in formule. Acum cred ca e clar de ce avem nevoie de doi domnu minus, ca
pe 0 il reusisem, da 1 era pe dos
Pai si ce-i cu asta?
Pai e, ca daca punem de la inceput intr-o celula formula:
=SUMPRODUCT(--($A$1:$A$20=$B$1))
rezultatul ei va insemna numarul de aparitii a valorii inscrise in B2 in range-ul A1:A20. Fara
COUNTIF(), care ma si nerveaza ca trebuie sa-i scriu conditia ca pe un sir de caractere, intre
ghilimele
Si ce mare branza!?
Deocamdata branza e la ciobani, ca noi n-avem oi, da cand oi mai spune si continuarea s-ar
putea sa facem branza de SUMPRODUCT si s-o vindem ca pe telemea calitatea prima-ntai!
Plecam de la exemplul de mai sus, stergem coloanele B, C, D si E si in B1:B20 scriem niste date
calendaristice, da avem grija ca si astea sa se cam repete, iar in C1:C20 scriem alte numere, de
data asta la intamplare, fara grija si iese cam asa ceva:

In E1 inscriem o valoare care se regaseste in A1:A20, iar in B2 o data care se regaseste si ea in


B1:B20.
In E3 vom folosi:
=SUMPRODUCT(--($A$1:$A$20=$E$1),--($B$1:$B$20=$E$2))
iar in E4:
=SUMPRODUCT(--($A$1:$A$20=$E$1),--($B$1:$B$20=$E$2),$C$1:$C$20)
Ce-am obtinut? Cu prima formula am obtinut numarul de aparitii al perechii de valori din E1 si
E2 pe acelasi rand in range-ul A1:C20, iar in formula din E4 am obtinut suma valorilor de pe
coloana C asociate acestor aparitii. Cu alte cuvinte COUNTIFS() si SUMIFS() dar functiile
astea au aparut in Excel abia in versiunea 2007, pentru cei care folosesc insa versiunea 2003 sau
una mai veche tot SUMPRODUCT tre sa fie baza!
Si cum SUMPRODUCT() accepta pana la 256 de array-uri, numai s-avem noi atatea criterii
(coloane) in baza de date pe care vrem s-o luam la numarat si insumat.
Cred ca e clar acum: cand vrem sa folosim SUMPRODUCT() la numarat aparitii dupa mai multe
criterii (in loc de = putem folosi si orice alt operator logic: <, >, <>, <=, >=) punem conditia
logica intre paranteze si trantim doi de minus in fata parantezei, iar cand vrem sa insumam niste
valori asociate conditiilor de aparitie specificate prin relatiile logice adaugam si argumentul cu
range-ul care contine valorile de insumat, fara operatori unari, fara relatie logica cu ceva, pur-si-

simplu. Singurele conditii ca sa nu ne trezim cu vreo eroare sunt sa nu comparam mere cu


avioane in relatiile logice si ca toate array-urile folosite ca argumente sa aiba aceeasi
dimensiune.
Ar mai fi de spus despre mecanismele astea de coercitie a valorilor logice in numeric pe care leam folosit la SUMPRODUCT(), ca pot fi folosite cu succes si in alte formule mai complexe (de
regula formule CSE, sau array formulas).
Iata un exemplu (de fapt doua) de formule CSE care returneza numarul randului celei de-a n-a
aparitii a unui element intr-un range:

Forma generala a formulei este:


{=IF(SUMPRODUCT(--(range=valoare))=0,NA(),IF(SUMPRODUCT(--(range =
valoare))<n, NA(),SMALL(IF((--(range =
valoare))=0,ROW(range)+ROWS(range),ROW(range)),n)))}
unde:
range este range-ul in care se cauta valoarea;
valoare este valoarea cautata;
n este numarul aparitiei (a doua, a treia, a n-a)
Daca valoarea nu se gaseste in range, sau numarul aparitiilor ei e mai mic decat n, formula va
returna eroarea #N/A, ca orice functie de cautare care se respecta.
Se remarca nu numai prezenta in formula a lui SUMPRODUCT() cu care numaram aparitiile
valorii in range, dar si folosire operatorului dublu unar in secventa cu al treilea IF() pentru
coercitia in numeric a comparatiei logice din conditia IF-ului.
Logica formulei e simpla: primele doua IF-uri testeaza daca valoarea cautata exista in range si
daca numarul ei de aparitii este cel putin <= cu n, ca altfel returneaza #N/A.
Secventa SMALL(IF((--(range = valoare))=0,ROW(range)+ROWS(range),ROW(range)),n)
returneaza cel mai mic k element dintr-un range, unde k=1 pentru cel mai mic, k=2 pentru

urmatorul in ordinea marimii etc. Array-ul este construit din numerele randurilor unde se afla
range-ul pentru elementele din range care satisfac conditia range=valoare si numere mai mari
decat numarul total de randuri al range-ului + numarul randului pe care se afla elementul pentru
elementele care nu satisfac aceasta conditie. Folosind ca array formula functia ROW(range)
aceasta va returna un array cu numerele randurilor pe care se afla range-ul respectiv.
Iata si perechea acestei formule, care va returna numarul randului pe care se afla ultima,
penultima, antepenultima s.a.m.d. aparitie a valorii cautate in range-ul respectiv (pentru n=1 se
va returna numarul randului ultimei aparitii, pentru n=2, penultima s.a.m.d.):
{=IF(SUMPRODUCT(--(range=valoare))=0,NA(),IF(SUMPRODUCT(--(range =
valoare))<n, NA(),LARGE(IF((--(range = valoare))=0,-ROW(range)ROWS(range),ROW(range)),n)))}
Daca se doreste ca formula sa returneze pozitia relativa in range a valorii, secventele:
SMALL(,n) si LARGE(,n) trebuie inlocuite cu SMALL(,n)-ROW(range(1))+1 si
LARGE(,n)-ROW(range(1))+1 unde range(1) reprezinta referinta la primul element al rangeului. Sub aceasta forma formulele se pot folosi in asociere cu INDEX() pentru a returna o valoare
asociata de pe alta coloana cu tot atatea elemente cat are si range-ul folosit in formula CSE,
folosind formulele indicate mai sus pentru returnarea valorii randului cautat. Bineinteles ca
formula completata cu INDEX va trebui sa fie confirmata tot cu Ctrl+Shift+Enter.
La fel ca in cazul lui SUMPRODUCT conditia (range=valoare) se poate transforma in conditie
multipla:
(range1=valoare1), (range2=valoare2), (range3=valoare3), doar ca daca in cazul portiunii din
formula unde aceste conditii sunt argumente pentru SUMPRODUCT() vom folosi sintaxa
consacrata pentru SUMPRODUCT, in ultima secventa, cea cu SMALL sau LARGE, sectiunea
IF((--(range = valoare))=0 trebuie transformata in:
IF((--(range1 = valoare1))* (--(range2 = valoare2))* (--(range3 = valoare3))=0,
Si uite-asa, plecand de la una dintre cele mai banal descrise in help functii ale Excel-ului,
ajungem la sofisticarii din astea cu conditii multiple, coercitii si alte denumiri de ne e si rusine
sa le folosim pe strada ca s-ar putea sa ne ia unii de mai stiu si eu ce fitzoshi (ca sa nu zic altfel
)
P.S. tin sa multumesc in mod special Internetului in persoana pentru ca de la el am aflat
schmekeria asta cu SUMPRODUCT.
Autor: Sorin Georgescu (moderator forum DrExcel; expert VBA)

Articolul nr 3: Protectia informatiilor si Shared Workbooksxcel 2007

Autor: Timotei Dolean


Protectia informatiilor
In general, pentru a proteja informatiile aveti nevoie de 2 pasi "mari". Primul pas ar fi
blocarea/deblocarea individuala a unor celule din foaia de lucru, iar apoi aplicarea optiunii:
Protect Sheet. Chiar daca blocam niste celule si nu activam acea optiune, ele pot fi modificate.

Implicit, toate celulele din foaia Excel sunt blocate. Pentru asta putem aplica optiunea Protect
Sheet sau Protect Workbook. Dar totusi daca dorim anumite celule sa le putem modifica va
trebui sa le deblocam inainte de a aplica optiunea. In mod normal deblocam celulele unde este
necesara introducerea de date (celule care sunt surse pentru rapoarte, sau pentru formule), iar
cele unde avem formulele le tinem blocate.
Ca si exemplu, in Excel 2007 trebuie urmariti urmatorii pasi pentru a debloca celulele:
1) Introduceti niste numere in celulele A1:D1 (cnd notez in felul acesta ma refer la toate
celulele de la A1 la D1)
2) Click dreapta pe selectie ->Format cells

3) Alegeti tabul Protection si debifati optiunea: Locked

4) Dupa aceasta mergeti in tabul Review, si in a 3-a caseta (Changes) aveti Butonul Protect Sheet

4a) In momentul in care apasati butonul Protect Sheet, va va aparea o lista in care puteti selecta
anumite actiuni pe care utilizatorul le poate executa. In mod normal doar primele 2 actiuni sunt
implicit selectate (Select locked cells si Select unlocked cells). Puteti alege sa nu fie posibila
selectarea celulelor blocate, prin debifarea optiunii Select locked cells. Dar, spre exemplu, daca
doriti totusi sa se poata modifica formatarea unor anumite celule, puteti bifa optiunea Format
Cells si ele vor putea fi modificate (Daca nu ati observat tabul Protection din caseta de formatare
a celulei, a disparut dupa ce ati activat optiunea Protect Sheet)
Daca optiunea Select locked cells este debifata, atunci utilizatorul nu o poate selecta deci nu
poate vedea formula din spatele ei (utilizatorii rai nu pot copia formulele utilizate) (mersi

Alexx pentru observatie)


4b) Aveti posibilitatea sa adaugati si o parola necesara mai trziu pentru deblocarea celulelor. Ea
este folositoare cnd nu doriti sa fie modificate setarile privind protectia celulelor de catre
persoane neautorizate
4c) Daca doriti, puteti sa blocati tot Workbook-ul prin selectarea celei de-a 2-a optiuni din
caseta: Protect Workbook

Daca doriti puteti activa optiunea Track Changes -> Highlight Changes, care va tine minte ce
celule ati modificat. Pentru aceasta tineti sageata de la mouse pe celula respectiva si veti putea
vedea modificarile efectuate. La final puteti accepta sau nu modificarile.

1) Aveti mai multe optiuni in momentul in care activati optiunea Track Changes, puteti selecta sa
nu se tina seama de modificarile efectuate de Dvs., ci doar de ceilalti. Alta optiune mai
importanta este aceea in care ii specificati celulele in care vreti sa fie activa optiunea (Spre
exemplu, daca avem o foaie in care sunt calculate anumite preturi in functie de valorile curente
ale EUR/USD, putem activa optiunea doar pe acele celule in care sunt tinute valorile EUR/USD)

Nota: Din pacate nu se vede intreaga lista de modificari ci doar ultima modificare pe fiecare
celula. Daca dorim sa vedem toate modificarile putem face acest lucru bifnd optiunea List
changes on a new sheet. Daca aceasta nu se poate bifa se datoreaza unui singur motiv. Nu sunt
modificari facute in foaie. Pentru a putea activa optiunea urmariti urmatorii pasi:
a) Activati optiunea Highlight Changes. Debifati optiunea Highlight changes on screen
b) Modificati pentru prima data ceva in foaie.
c) Apasati pe butonul Accept/Reject Changes. Dati apoi OK.

d) Pentru fiecare modificare care ati facut-o va va fi afisata o fereastra unde puteti accepta sau nu
modificarea. Daca doriti puteti accepta sau nu toate modificarile.

e) Dupa ce am acceptat macar o schimbare, mergem din nou la optiunea Highlight Changes, iar
de data aceasta bifam ultima optiune: List changes on a new sheet. Debifati inainte toate

optiunile pentru a va fi afisate toate modificarile.


f) Dati OK.
g) Acum aveti o noua foaie numita History, unde va sunt afisate schimbarile.

g1) in momentul in care salvati fisierul, foaia History va disparea.


Nota2: In momentul in care activati optiunea Track Changes, implicit se partajeaza si
documentul. Pentru detalii privind partajarea cititi urmatoarea sectiune.
Shared Workbooks(Documente partajate)
Partajarea este utila pentru cazul in care mai multi utilizatori lucreaza pe acelasi fisier. Daca se
stie exact unde trebuie sa modifice fiecare (adica nu trebuie sa modifice in zone comune), se
poate folosi partajarea documentului. Pentru a partaja un document, acesta trebuie creat inainte.
Autorul il salveaza ca Shared/Partajat, si il pune pe retea (nu pe web).
Nota: Trebuie retinut ca in momentul in care partajam un document anumite elemente din el nu
mai pot fi modificate. Dintre acestea fac parte: Imagini, grafice, validari de date, celule unite,
formatari conditionate, link-uri, sub-totaluri, macro-uri, rapoarte tabele pivot, scenarii.
in momentul in care partajam documentul, putem selecta anumite optiuni ca de exemplu:
numarul de zile de tinere a evidentei modificarilor, modul de actualizare a modificarilor (putem

sa facem actualizare automata si vom vedea din X in X minute ce au modificat ceilalti utilizatori
intre timp.

Dupa ce am partajat fisierul si il punem pe retea mai multi utilizatori il pot deschide in mod
concomitent si pot modifica documentul. Daca sunt conflicte la modificari va aparea o caseta de
dialog care va intreba ce doriti sa faceti in continuare.
Cam att momentan, multumesc pentru atentie.
Autor: Timotei Dolea

Urmarirea schimbarilor

S-ar putea să vă placă și