CC2 – MonthView
MonthView to kontrolka ActiveX z zestawu biblioteki Common Controls 2 (plik mscomct2.ocx) dla kompilacji Office 32 bit.
Opisywana kontrolka to druga w zestawie CC2, która prezentuje się na formularzu jako pełny kalendarz. Niestety po zmianie standardów wymuszonych przez UE w formatach domyślnych zmieniono nazewnictwo dla dni tygodnia, co wymusiło poszerzenie się kontrolki w formie (z kwadratowej, j.n na prostokątną). Ale po kolei. Graficzna forma kontrolki to prostokąt wyświetlający miesiąc, rok i nazwy tygodni. Dobrze jest w takim razie aby osadzić go po prawej stronie naszego formularza na wypadek uruchamiania projektów w różnych wersjach systemu.

Kontrolka, jak każda w CC posiada parametr (Custom), odsłaniający możliwości jej ustawienia i tak… Mamy do dyspozycji lekko inne parametry niż wcześniej opisywany DTPicker. Przede wszystkim jest możliwość wyświetlenia wielu kalendarzy (jak poniżej 2 wiersze, ale i też nieograniczoną ilość kolumn). Do tego zaznaczanie wielu dni oraz często wymagane w działach finansowych nr tygodnia w roku.

Zabawmy się w takim razie w jakies oprogramowanie tej kontrolki. W poprzednim artykule proponowałem sprawdzenie, czy dany dziań jest weekendem. Pójdźmy o krok dalej i zaznaczmy na kalendarzu dni wolne od pracy (polskie święta nie tylko przypadające na 6 i 7-dmy dziań tygodnia). Do tego należało by lekko podkreślić widok opisów bo w domyślnym układzie wygląda to dość blado. Zróbmy to również kodem.
Private Sub UserForm_Initialize()
MonthView1.ShowToday = False
MonthView1.ShowWeekNumbers = True
MonthView1.StartOfWeek = mvwMonday
MonthView1.Value = Now
MonthView1.TitleBackColor = RGB(155, 100, 80) 'wymuszamy inny kolor podświetlenia
End Sub
Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
If czy_swieta(DateClicked) = True Then _
MsgBox "Ustawiono datę " & DateClicked & " która jest dniem wolnym od pracy!" & vbCr & _
"Zostanie ustawiona data dzisiejsza.", vbExclamation, "VBATools.pl": MonthView1.Value = Now
End Sub
Private Sub MonthView1_GetDayBold(ByVal StartDate As Date, ByVal Count As Integer, State() As Boolean)
Dim i%, d As Date
For i = 1 To Count
d = StartDate + i - MonthView1.StartOfWeek
If Day(d) < i Then 'od 1go liczyć czy jest to święto (liczba jeden zawsze będzie w widoku, a state reaguje na liczby)
If czy_swieta(d) = True Then State(i - MonthView1.StartOfWeek) = True
End If
Next
End Sub
Private Function czy_swieta(ByVal dData As Date) As Boolean
Dim iRok As Integer: iRok = Year(dData)
If dData = DateSerial(iRok, 1, 1) Then czy_swieta = True 'Nowy Rok
If dData = Wielkanoc(iRok) Then czy_swieta = True 'Wielkanoc
If dData = Wielkanoc(iRok) + 1 Then czy_swieta = True 'Wielkanoc
If dData = DateSerial(iRok, 5, 1) Then czy_swieta = True 'Święto Pracy
If dData = DateSerial(iRok, 5, 3) Then czy_swieta = True '3 Maja
If dData = Wielkanoc(iRok) + 49 Then czy_swieta = True 'Zielone Świątki
If dData = Wielkanoc(iRok) + 49 + 11 Then czy_swieta = True 'Boże ciało
If dData = DateSerial(iRok, 8, 15) Then czy_swieta = True 'Wniebowzięcie NMP
If dData = DateSerial(iRok, 11, 1) Then czy_swieta = True 'Wszystkich Świętych
If dData = DateSerial(iRok, 11, 11) Then czy_swieta = True 'Święto Niepodległości
If dData = DateSerial(iRok, 12, 25) Then czy_swieta = True 'Boże Narodzenie
If dData = DateSerial(iRok, 12, 26) Then czy_swieta = True 'Boże Narodzenie
If Weekday(dData, 2) > 5 Then czy_swieta = True
End Function
Private Function Wielkanoc(ByVal Rok As Integer) As Date
'http://www.cpearson.com/excel/holidays.htm poprawna dla lat 1900 - 2099
Dim id As Integer
id = (((255 - 11 * (Rok Mod 19)) - 21) Mod 30) + 21
Wielkanoc = DateSerial(Rok, 3, 1) + id + (id > 48) + 6 - ((Rok + Rok \ 4 + _
id + (id > 48) + 1) Mod 7)
End Function
A oto jak to się prezentuje oprogramowany kalendarz w praktyce. Kliknięty dzień zwykły ustawi na tej dacie kalendarz, a kliknięty na świętach wyświetli komunikat i cofnie do dnia dzisiejszego.

Mam nadzieje że artykuł wam się spodoba. Napiszcie do czego wy wykorzystujecie ten zestaw kontrolek np w grupie dyskusyjnej FB.
Jeśli uważasz że pokazane materiały są godne polecenia – podziel się tą wiadomością z innymi pozostawiając odnośnik to tego materiału.
(c) Shon Oskar – http://VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.