Kolejny miesiąc, kolejny dzień …

by Marcin

Kolejny miesiąc, kolejny dzieńDzisiaj o tym, w jaki sposób napisać formułę, która na podstawie wskazanej nazwy miesiąca zwróci nazwę miesiąca kolejnego. Innymi słowy, jak mieć pewność, że po wpisaniu w jedną z komórek słowa „styczeń”, w innej komórce pojawi się automatycznie „luty”. Podobnie dla dni tygodnia. Jeżeli w jednej komórce jest „środa”, jak mieć pewność, że w innej pojawi się „czwartek”.

Kolejne miesiące

Najbardziej chyba oczywiste i najprostsze rozwiązanie problemu to wykorzystanie odpowiednio sformatowanych dat (w „excelowskim” rozumieniu). Jeżeli do komórki ( na przykład B8) wpiszesz datę 2008-01-01, a następnie nadasz komórce format niestandardowy „mmmm” Excel wyświetli w komórce oczywiście „styczeń”.

Kolejny miesiąc, kolejny dzień

Nazwę kolejnego miesiąca, w komórce C8, możesz uzyskać korzystając z formuły

= Edate(B8;1)

lub

=DATA(ROK(B9);MIESIĄC(B9)+1;DZIEŃ(B9))

Kolejny miesiąc, kolejny dzień

Takie rozwiązanie ma niestety jedną wadę. Trzeba posługiwać się datami. Nie wystarczy po prostu wpisać w komórkę słowa „styczeń”. Chcąc zmienić nazwę miesiąca podstawowego każdorazowo będziesz musiał zmieniać datę. Musisz także pamiętać o odpowiednim formatowaniu komórek.

Okazuje się, że problem można rozwiązać także przy założeniu, że nazwa miesiąca jest po prostu zwykłym ciągiem tekstowym.

W komórce B11 masz teraz zwykły tekst „styczeń”. Odpowiednia formuła, do wpisania w komórkę C11, może wyglądać tak:

=TEKST(MIESIĄC(1&B11)+1&”-1″;”mmmm”)

Także w tym przypadku używasz dat i odpowiednio je formatujesz, ale wszystko dzieje się niejako „w tle”. Nie musisz pamiętać, aby formatować cokolwiek ręcznie.

Kilka słów o tym jak działa formuła.

„Sklejając” razem jedynkę z nazwą miesiąca (1&B11) tworzę po prostu datę. Następnie, funkcją MIESIĄC, pobieram z tej daty nazwę miesiąca (styczeń) i dodaję 1 tak, aby „trafić” na kolejny miesiąc. W wyniku takiego działania otrzymuję „2”, czyli numer kolejnego miesiąca (luty). Wszystko, co teraz pozostaje, to zamienić ten numer na nazwę miesiacą. W tym celu posłużyłem się podobną sztuczką jak poprzednio. Utworzyłem datę (MONTH(1&B11)+1&”-1″) i sformatowałem sposób jej wyświetlania funkcją TEKST.


Dni tygodnia.

Podobnie jak z nazwami miesięcy postąpić możesz z nazwami kolejnych dni tygodnia.

Kolejny miesiąc, kolejny dzień

Jeżeli nie przeszkadza Ci korzystanie z odpowiednio sformatowanych dat (musisz je tak dobrać, aby odpowiadały wybranym dniom tygodnia) rozwiązanie jest banalnie proste.

Podobnie jak w przypadku miesięcy, w jednej komórce (B15 w moim przykładzie) znajdzie się data sformatowana jako „dddd”. Do kolejnej komórki (C15) wystarczy teraz wpisać

= B15+1

i odpowiednio sformatować, aby uzyskać nazwę kolejnego dnia tygodnia.

Kolejny miesiąc, kolejny dzień

Jeżeli jednak chciałbyś określić kolejny dzień na podstawie ciągu tekstowego z nazwą dnia tygodnia, sprawa wygląda na bardziej skomplikowaną. Jedyne rozwiązanie, jakie udało mi się znaleźć, to następująca formuła tablicowa:

{=TEKST(PODAJ.POZYCJĘ(B16;TEKST(DZIEŃ(WIERSZ(ADR.POŚR(„1:7″)));”dddd”);0)+1;”dddd”)}

Kolejny miesiąc, kolejny dzień

Skorzystałem tu z faktu, że Excel przechowuje daty jako liczby oraz że pierwszy dzień tygodnia w excelowskim systemie dat (1.01.1900) był niedzielą, (pomimo, że tak naprawdę był to poniedziałek).

Jak zwykle kilka słów wyjaśnienia.

[hidepost]
Fragment

WIERSZ(ADR.POŚR(„1:7”))

tworzy w pamięci komputera tablicę z liczbami 1-7. Jest to także pierwsze siedem dni (1-7 stycznia 1900 roku) w excelowskim systemie liczenia dat. Formatuję te daty następnie funkcją TEKST, tak, aby zamienić je na nazwy dni tygodnia.

TEKST(DZIEŃ(WIERSZ(ADR.POŚR(„1:7″)));”dddd”)

Po wykonaniu tej operacji, w pamięci komputera znajduje się tablica z nazwami dni tygodnia („niedziela”, „poniedziałek” etc). Kolejny krok to odszukanie, we wspomnianej tablicy, pozycji mojego dnia tygodnia.

PODAJ.POZYCJĘ(B16;TEKST(DZIEŃ(WIERSZ(ADR.POŚR(„1:7″)));”dddd”);0)

Na koniec dodałem 1 do znalezionej pozycji tak, aby trafić na kolejny dzień. Wyświetlam wynik formatując go wcześniej funkcją TEKST.

Download
[/hidepost]

{ 3 comments… read them below or add one }

Artquad

Dzięki za formułę odnosnie zmiany daty… Pozdrawiam

tutusem

Moja wersja rozwiązania problemu:
=WYSZUKAJ.POZIOMO(WYSZUKAJ.POZIOMO(A1;{„poniedziałek”;”wtorek”;”środa”;”czwartek”;”piątek”;”sobota”;”niedziela”\1;2;3;4;5;6;7};2;FAŁSZ)+1;{1;2;3;4;5;6;7\”poniedziałek”;”wtorek”;”środa”;”czwartek”;”piątek”;”sobota”;”niedziela”};2;FAŁSZ)
Formułę można łatwo zmodyfikować dla różnych potrzeb. Ma wadę: długość zapisu!

Pozdrawiam.

armal84

To ja dorzucę rozwiązanie w VBA:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim tb(1 To 7) As Variant
Dim i As Integer
tb(1) = „Poniedziałek”
tb(2) = „Wtorek”
tb(3) = „Środa”
tb(4) = „Czwartek”
tb(5) = „Piątek”
tb(6) = „Sobota”
tb(7) = „Niedziela”

Set zakres = Range(„A1:A7”)

For Each Cell In zakres
For j = 1 To 7
If Target.Address = Cells(j, „A”).Address Then
If UCase(Target.Value) = „NIEDZIELA” Then
Target.Offset(0, 1) = „Poniedziałek”
Exit Sub
End If

For i = 1 To 7
If UCase(Target.Value) = UCase(tb(i)) Then
Target.Offset(0, 1) = tb(i + 1)
End If
Next

End If
Next
Next

End Sub

Niestety nadal nie potrafię „pokonać” obiektu Target – powyższy Sub powinien działać po wciśnięciu ENTER na komórce wypełnionej nazwą dnia tygodnia. Niestety tak nie jest – po wciśnięcieu enter nic sie nie dzieje, trzeba strzałką wróćić do wypełnianej komórki i dopiero wówczas Sub zadziała.
Jeśli ktoś wie jak temu zaradzić, wielka prośba o podesłanie pomysłu.
Pozdrawiam.

Leave a Comment

Previous post:

Next post: