Excel i wybieranie dat

by Marcin

Dzisiaj o tym, w jaki sposób zrobić bardzo prostą „wybieraczkę” dat w Excelu.  W zasadzie cały problem sprowadza sie do tego, aby w zależności od wybranego miesiąca i roku ( dla lat przestępnych luty bedzie miał 29 dni, dla pozostałych 28)  wyświetlić  odpowiednią liczbę dni.  Dla miesiąca stycznia lista powinna zawierać 31 dni, dla czerwca 30, dla lutego 28 lub 29 i tak dalej. Całość wygląda docelowo mniej więcej tak, jak na animacji poniżej.

Proste wybieranie daty w Excelu
Wszystko czego potrzebujemy to trzy listy rozwijane utworzone przy pomocy sprawdzania poprawności, jeden dynamiczny zakres, kilka zakresów statycznych, i sposób, aby połączyc to wszystko w jedną całość.

Zaczniemy od zdefiniowania trzech, zupełnie niedynamicznych zakresów.

Wybieranie daty w Excelu - zdefniowane statyczne zakresy

Nazwałem je sobie (oczywiście chcąc podkreślić moje międzynarodowe „obycie” 🙂 ) odpowiednio:

sett_rngYears – dla lat,
sett_rngMonths – dla miesięcy, oraz
sett_rngDays dla poszczególnych dni.

Posiadając tak zdefiniowane zakresy, od razu, bez żadnych dodatkowych „kombinacji” możemy wstawić do skoroszytu listę rozwijaną dla lat oraz miesięcy.

Wystarczy, że w ustawieniach sprawdzania poprawności, jako źródło ustawisz sobie sett_rngYears dla lat oraz sett_rngMonths dla miesięcy i powinno działać. Proste, prawda?

Pozostaje jeszcze kwestia zdefiniowania odpowiedniego zakresu dla dni. Można oczywiście wykorzystać zakres sett_rngDays, ale zbudowana na jego podstawie lista rozwijana wyświetli Ci wtedy za każdym razem 31 dni, a nie o to nam przecież chodziło.

Zdefiniujemy więc sobie jeszcze jeden, tym razem dynamiczny zakres. W zależności od wybranego roku i miesiącu powinien on zmieniać rozmiar i swoim „zasięgiem” objąć odpowiednią liczbę dni.

Nowy zakres nazwałem sobie rngDaysToChooseFrom i w pierwszym (jak zwykle u mnie, nieco przekombinowanym podejściu) zdefiniowałem go sobie następująco:

=JEŻELI(rngMonthChosenNo=2;PRZESUNIĘCIE(sett_rngDays;0;0;DZIEŃ(DATA(rngYearChosen;rngMonthChosen+1;1)-1);1);JEŻELI(CZY.BŁĄD(PODAJ.POZYCJĘ(rngMonthChosen;{1\3\5\7\8\10\12};0));PRZESUNIĘCIE(sett_rngDays;0;0;30;1);sett_rngDays))

Nazwa rngMonthChosenNo odwołuje się w tym przypadku (jak wspomniałem wcześniej, nieco zawiłym i przekombinowanym, ale ciekawym z „edukacyjnego” punktu widzenia ) do komórki, w której znajduje się numer aktualnie wybranego miesiąca.

Jak zapewne pamiętasz na naszej liście pojawiają się nazwy, a nie numery miesięcy. Dlatego też, w jednej z komórek skoroszytu (rngMonthChosenNo właśnie) „tłumaczę” sobie nazwę miesiąca na jego numer przy pomocy funkcji:

=PODAJ.POZYCJĘ(rngMonthChosen;sett_rngMonths;0)

gdzie rngMonthChosen to oczywiście komórka z wybraną nazwą miesiąca.

Swoją drogą nic nie stoi na przeszkodzie, aby zamiast tego całego „tłumaczenia” nazwy na numer miesiąca, po prostu wpisać w funkcji

rngMonthChosen="February"

Rezultat ten sam. Wracając jednak do problemu. Po chwili namysłu zdałem sobie sprawę, że mozna jednak całośc zapisać proście, a efekt będzie ten sam:

=PRZESUNIĘCIE(sett_rngDays;0;0;DZIEŃ(DATA(rngYearChosen;rngMonthChosenNo+1;1)-1);1)

rngYearChosen to oczywiście komórka z wybranym rokiem, a  rngMonthChosenNo to, podobnie ja w przykładzie powyżej, komórka z numerem własnie wybranego miesiąca.

Download

Marcin

{ 5 comments… read them below or add one }

wykapana

Fajna stronka – BĘDĘ TU CZĘŚCIEJ 🙂

kaj777

Można też użyć formantu niestandardowego – po naciśnięciu pojawia się mały kalendarzyk i można wybrać datę – nie wiem jak się nazywa bo w office 2010 nie działa ):

rafalhart

tworzysz userform w vba dodajesz kalendarz i juz 🙂

lamkkk

=PRZESUNIĘCIE(sett_rngDays;;;DZIEŃ(DATA(rngYearChosen;rngMonthChosenNo+1;0)))

sc00by

Czy nie prościej użyć samej funkcji JEŻELI?
Np. tak (zakładając że lista z miesiącami do wybrania jest w komórce F2):
=IF($F$2=”February”;rngDaysToChooseFrom;Days;sett_rngDays)

Leave a Comment

Previous post:

Next post: