VBATools

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.

Obrazek

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.

Obrazek

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.

Obrazek

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.