Tworzenie kalendarza w arkuszu
by vbatools on Jan.24, 2012, under Excel, Porady
W niektórych przypadkach chcemy oznaczyć wydarzenia w arkuszu, bazując na aktualnym kalendarzu. Nie chcemy tworzyć go na podstawie formuł, które obciążają obliczenia, ale przedstawić jako tabelę.
Poniższy sposób przedstawia jak taki kalendarz wykonać kodem VBA:
Rys: Wygląd utworzonego kalendarza w arkuszu.
Option Explicit Dim jakie_sw$ Sub tworz_kalendarz_w_arkuszu() 'VBATools.pl MVP Oskar Shon Dim i%, x&, kon_msca&, miesiac$, dzientyg$, nrtyg&, Rok& On Error GoTo blad_rok ponownie: With Application Rok = .InputBox("Podaj rok, dla którego będzie utworzony kalendarz:", _ "Rysownie kalendarza w arkuszu:", Year(Now), Type:=2) 'określenie typu danych On Error GoTo blad If Rok = 0 Then GoTo koniec .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual .StatusBar = "Tworzenie kalendarza..." For i = 1 To 12 kon_msca = Day(DateSerial(Rok, i + 1, 1) - 1) miesiac = Format(DateSerial(Rok, i, 1), "mmmm") For x = 1 To 31 nrtyg = Weekday(DateSerial(Rok, i, x), vbUseSystemDayOfWeek) dzientyg = WeekdayName(nrtyg) Cells(i, x).Value = x & " " & miesiac & " " & Rok & vbNewLine & dzientyg If nrtyg > 5 Then Cells(i, x).Interior.ColorIndex = 15 If czy_swieta(DateSerial(Rok, i, x)) = True Then Cells(i, x).Interior.ColorIndex = 8 Cells(i, x).Value = Cells(i, x).Value & vbNewLine & jakie_sw End If If x = kon_msca Then Exit For Next x Next i koniec: .StatusBar = False .EnableEvents = True .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With Beep Exit Sub blad_rok: Resume ponownie Exit Sub blad: MsgBox "Błąd:" & Err.Number & vbCr & Err.Description Resume koniec End Sub Private Function czy_swieta(ByVal dData As Date) As Boolean 'mod by MVP Oskar Shon Dim iRok As Integer: iRok = Year(dData) If dData = DateSerial(iRok, 1, 1) Then czy_swieta = True: jakie_sw = "Nowy Rok" If dData = Wielkanoc(iRok) Then czy_swieta = True: jakie_sw = "Wielkanoc" If dData = Wielkanoc(iRok) + 1 Then czy_swieta = True: jakie_sw = "Wielkanoc" If dData = DateSerial(iRok, 5, 1) Then czy_swieta = True: jakie_sw = "Święto Pracy" If dData = DateSerial(iRok, 5, 3) Then czy_swieta = True: jakie_sw = "3 Maja" If dData = Wielkanoc(iRok) + 49 Then czy_swieta = True: jakie_sw = "Zielone Świątki" If dData = Wielkanoc(iRok) + 49 + 11 Then czy_swieta = True: jakie_sw = "Boże ciało" If dData = DateSerial(iRok, 8, 15) Then czy_swieta = True: jakie_sw = "Wniebowzięcie NMP" If dData = DateSerial(iRok, 11, 1) Then czy_swieta = True: jakie_sw = "Wszystkich Świętych" If dData = DateSerial(iRok, 11, 11) Then czy_swieta = True: jakie_sw = "Święto Niepodległości" If dData = DateSerial(iRok, 12, 25) Then czy_swieta = True: jakie_sw = "Boże Narodzenie" If dData = DateSerial(iRok, 12, 26) Then czy_swieta = True: jakie_sw = "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
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.