Intrucat completarea pe care a propus-o Răzvan Popa in comentariul subiectului
Instrumentul Data Validation-List, crearea listelor dependente , este utila in multe situatii, m-am gandit ca n-ar fi rau sa generalizez un pic abordarea pe care am propus-o in raspuns si sa vedem care ar fi situatiile in care ne-am dori ca lista utilizata ca sursa pentru Data Validation sa fie una dinamica, in sensul ca se poate actualiza ( se adauga informatii noi, se sterg informatii existente). Nu e deloc comod sa actualizezi denumirile din Name Manager ori de cate ori faci o modificare a listei.
Cum cream o lista dinamica pe care sa o folosim ca sursa pentru Data Validation, si in ce situatii o putem aplica?
Pentru aceasta avem nevoie de cateva functii: OFFSET, INDIRECT, ADDRESS, ROW, MATCH, COUNTA si de o lista sursa pentru Data Validation.
Sa luam exemplul judetelor si a localitatilor, prezentat in topicul Instrumentul Data Validation-List, crearea listelor dependente
Pregatim o foaie de calcul cu lista judetelor ca antet de tabel si cu localitatile judetului respectiv pe coloana corespunzatoare, ca in imagine:
Am denumit fila respectiva “sursa”.
In foaia de calcul in care doresc sa realizez doua liste cu Data Validation, una pentru judete si una pentru localitati am pregatit un tabel:
In fila “sursa” selectam antetul tabelului si in Name box scriem “Judete” pentru a denumi in acest fel zona A1:AO1, cea cu denumirile de judete.
In foaia 2, pe care am denumit-o “Localitati DV” selectăm celulele A1:A15, si din Tab-ul Data, deschidem fereastra Data Validation si trecem, perntru optiunea List, ca sursa, lista cu judete.
Prima parte e gata. Acum să vedem cum putem alege doar din lista cu localitatile judetului introdus pe coloana A, indiferent de cat de multe sunt, sa se actualizeze lista cand in sursa introducem o localitate noua si sa nu avem in meniul derulant mai multe pozitii(celule goale) decat numarul de localitati din judetul respectiv.
Care sunt informatiile necesare?
1. ce coloana din tabelul cu localitati corespunde judetului ales?
2 de pe coloana respectiva, lista celulelor completate, incepand cu randul al doilea
Pentru aceasta avem nevoie de adresa primei celule si adresa ultimei celule ale domeniului ce va compune lista pentru data validation, adica: daca am selectat Arad coloana este a doua (B) si zona de celule necesara este B2:B11
Cum obtinem o lista care sa se expandeze automat?
Folosim functia Offset care permite referirea la o celula, sau un domeniu de celule, plecand dintr-o celula ca origine, cu un numar de randuri sau coloane in orice directie.
Daca dorim sa plecam dintr-o celula si sa “selectam” o intreaga zona, vom completa “inaltimea zonei”(numarul de celule)
exemplu: =OFFSET(B3,0,0,5) va returna continutul zonei B3:B8 (de la 3 inca 5 randuri in plus=8), sub forma de vector(sir)
Cum obtinem adresa celulei “de plecare” si cum obtinem “inaltimea” coloanei completate?
Pentru adresa celulei de plecare ca adresa absoluta, vom folosi intai functia Address care ne va returna o expresie de tip text cu denumirea referintei respective, pe care o transformam in referinta cu functia indirect.
Functia ADDRESS are urmatoarea sintaxa:
ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])
ADRESS(2,3,2,,”sursa”)
inseamna: randul 2, coloana a treia, cu referinta absoluta pentru rand, din fila “sursa”
si returneaza: sursa!C$2
Stim ca vom incepe cu randul al doilea, dar numarul coloanei cine il returneaza?
Pentru aceasta voi folosi functia Match, care va cauta numele judetului in antetul tabelului si va returna numarul de ordine al acestuia in antet ( numarul coloanei pe care se afla)
=MATCH(A3,Judete,0) va returna 1 (prima coloana) daca in A3 am ales judetul “Alba” si 4 daca am ales “Bacau”
Astfel, functia noastra Address va arata asa:
=ADDRESS(2,MATCH(A3,Judete,0),2,,”sursa”) si va returna sursa!B$2 daca in A3 am ales judetul Arad.
Pentru a obtine chiar adresa celulei aplicam functia Indirect:
=INDIRECT(ADDRESS(2,MATCH(A3,Judete,0),2,,”sursa”))
Am obtinut acum formula cu care vom inlocui in Functia OFFSET adresa B3
Pana in acest moment formula noastra arata asa:
=OFFSET(INDIRECT(ADDRESS(2,MATCH(A3,Judete,0),2,,”sursa”)),0,0,5)
Mai avem acum nevoie de o formula care sa ne returneze “inaltimea” coloanei cu nume de localitati. (una care sa inlocuiasca valoarea 5 din OFFSET cu dimensiunea zonei cu localitati)
Vom numara cate celule sunt de la prima (cea returnata de prima functie Address, pe aceeasi coloana, cate sunt completate, mai putin una, ccea de antet)
Formula:
=COUNTA(INDIRECT(ADDRESS(1,MATCH(A3,Judete,0),2,,”sursa”)&”:”&ADDRESS(ROWS(sursa!A:A),MATCH(A3,Judete,0),2)))-1
Va aparea in OFFSET, in locul lui 5.
Formula OFFSET, completa, o copiem, selectam coloana pe care dorim sa aplicam regula de validare si ca mai sus, selectam optiunea list si dam paste formulei noastre si… gata!
Alegem un judet si avem la dispoziie doar localitatile lui, fara randuri goale si cu posibilitatea actualizarii listei.