понеделник, 30 август 2010 г.

#025 Уникални стойности

Зададоха ми задачата как да се извлекат уникалните стойности от зона. Създаване на индекс.

Примерни данни
Първи вариант
Първото което ми мина през главата е да показвам мускули:) Т.е. да използвам формули. Ето този вариант.
Стъпка 1. Създаваме помощна колонка D.  В клетка D2 въвеждам формулата:
=IF(COUNTIF($B$2:B2,B2)=1,ROW(B2),"") . Тази формулка "маркира" тези редове в които за първи път се среща дадената стойност. Тук магията е в зоната посочена в CountIF.
$B$2:B2. Това е  полуабсолютна зона. (Може да направя отделна тема за зоните). Хитростта е че тази зона ще се разширява при влачене на формулата надолу. Т.е. във втората клетка ще стане $B$2:B3 и т.н. Този трик е доста популярен. "Маркировката" се изразява в посочването номера на реда където за първи път се среща дадената стойност (Countif=1).
Помощна колонка
Стъпка 2. Формула за извличане. Формулата в клетка C2 e :
=IFERROR(INDEX(B:B,SMALL(D:D,ROW(A1))),"")
Тук се използва трикът с променящ се при размножение брояч вътре във формулата. Row(A1) ще осигури брояч със стойност 1,2,3 и т.н. (NB. Внимавайте ако вмъквате редове или местите формулата, защото А1 ще стане например A10 и броячът ще започне от 10!). Този брояч осигурява извличането на първата по големина стойност от колонка D (използва се Small), после втората и т.н. (В нашия случай 2,5,6....). Остава да превърнем тези числа (редове от таблицата) в конкретни стойности. За целта използваме Index (има отделна тема)!
"Пакетираме" в IFerror за да избегнем отговорите при липса на стойност (ние не знаем колко са уникалните стойности затова "дърпаме" формулата достатъчно надолу.

Както казах това е "мускулестия вариант":)

Ето ви по-простичко решение)

Втори вариант
Изпълняваме командата Data/Advanced Filter:
Data/Advanced filter
Правят се следните настройки в диалоговия прозорец

Използва се възможността за копиране само на уникалните стойности! (За повече информация книжките за начинаещи):):) И готово:) Няма мускули няма трикове:) 

Всеки само си избира кой вариант да избере:)




1 коментар:

  1. Ето и друг начин:

    =IF(COUNTIF($B$2:B2,B2)=1,VLOOKUP(B2,B:B,1,FALSE),"")

    След това с филтъра може да се премахват празните редове.
    Необходима е единствено една нова колона за формулата за извличане на данните и след това филтрирането й.

    ОтговорИзтриване