Szkoła policealna rządzi się swoimi prawami – zajęcia odbywają się w tzw. „blokach”. Program PLANSP próbuje opanować chaos, jaki mógłby wkraść się w zupełnie inne podejście do układania planu lekcji. W związku z tym, że to właśnie ja zajmuję się układaniem planów dla szkoły policealnej, dlatego też program jest prosty, efektywny i nie musi być wyposażony w różnorodne zabezpieczenia – ja wiem, jak go nie zepsuć! Najważniejsza jest informacja o ilości zajęć do odbycia, wolnych miejscach i drukowanie różnorodnych zestawień: dla studentów, nauczycieli, listy obecności, itp.
mgr inż. Wacław Libront
Niewiele programowania i prawie "zero" formuł w arkuszu. Już jakiś czas temu stwierdziłem, że bezpieczniej jest (niekoniecznie wygodniej) jeśli arkusz nie będzie zawierał formuł, ale wszystko obliczone zostanie za pomocą makropoleceń i wyświetlone dla użytkownika w odpowiednich komórkach.
Ciekawostki z kodu:
- pokazywanie i chowanie kolumn (Sub ZerowePrzedmiotyChowaj())
- funkcja wyszukaj.pionowo() tym razem za pomocą funkcji VB (Function NazwaPrzedmiotu(skr As Variant) As Variant)
- bardzo skomplikowane drukowanie różnorodnych planów zajęć (Sub DrukujListęRD(w, k As Variant))Sub DrukujRozkładN(nau, m1, m2 As Variant)
'wykorzystane w planach nauczania Sub SchowajCzwartki() For w = 7 To 136 Step 3 Rows(w).RowHeight = 0 Next w End Sub Sub PokażCzwartki() For w = 7 To 136 Step 3 Rows(w).RowHeight = 15 Next w End Sub 'pokaż wszystkie Sub ZerowePrzedmiotyPokaż() For k = 8 To 70 Columns(k).ColumnWidth = 2.6 If (k = 23) Or (k = 39) Or (k = 55) Then Columns(k).ColumnWidth = 4 Next k End Sub 'jeśli w wierszy 3 i 4 jest zero ' to nie ma godzin i można całą kjolumnę schować Sub ZerowePrzedmiotyChowaj() For k = 8 To 70 g = Cells(3, k) + Cells(4, k) p = Cells(1, k) & Cells(2, k) If g > 0 Or p <> "" Then Columns(k).ColumnWidth = 2.6 Else Columns(k).ColumnWidth = 0 End If If (k = 23) Or (k = 39) Or (k = 55) Then Columns(k).ColumnWidth = 4 Next k End Sub 'wstawiamy skrót i otrzymujemy pełną nazwę przedmiotu 'arkusz STUD Function NazwaPrzedmiotu(skr As Variant) As Variant On Error GoTo błąd s = Application.WorksheetFunction.VLookup(skr, _ Sheets("STUD").Range("B2:C50"), 2, False) NazwaPrzedmiotu = s Exit Function błąd: NazwaPrzedmiotu = "" End Function 'drukuje listę z wybranego kursorem roku i dnia Sub DrukujListę() w = ActiveCell.Row k = ActiveCell.Column DrukujListęRD w, k Sheets("razem").Select End Sub 'drukuje cztery listy dla czterech kiedrunków z wybranego dnia Sub DrukujListęDzień() w = ActiveCell.Row k = ActiveCell.Column DrukujListęRD w, 7 DrukujListęRD w, 23 DrukujListęRD w, 39 DrukujListęRD w, 55 Sheets("razem").Select End Sub 'drukujemy dla jednej daty D i wybranej grupy R 'parametrami są wybrany wiersz i kolumna Sub DrukujListęRD(w, k As Variant) 'czyść Sheets("OBEC").Select Range("D3:J12").Select Selection.ClearContents Range("C14:J63").Select Selection.ClearContents Range("C4").Select Rows("14:63").RowHeight = 16.5 Sheets("razem").Select 'w = ActiveCell.Row 'k = ActiveCell.Column '1 od 7 kol i 15 kolumn '2 - 23 do rok = Int(((k - 7) / 16)) + 1 kol = (rok - 1) * 16 + 7 'pierwsza kolumna zawiera nazwę grupu i sumę godzin dat = Cells(w, 1) dty = Cells(w, 2) Sheets("OBEC").Range("D3") = Cells(1, kol) Sheets("OBEC").Range("D6") = dat 'studenci na listę wi = 2 Do student = Sheets("STUD").Cells(wi, kol) Sheets("OBEC").Cells(wi + 12, 3) = student wi = wi + 1 Loop Until Sheets("STUD").Cells(wi, kol) = "" ko = 4 'od której kolumny zapisujemy w OBEC wo = 7 'wiersz od którego zapisujemy znalezione przedmioty For k1 = kol + 1 To kol + 15 ile = Cells(w, k1) If ile > 0 Then 'zmalazło godziny prz = Cells(1, k1) 'skrót przedmiotu nau = Cells(2, k1) 'skrót nauczyciela Sheets("OBEC").Cells(wo, 4) = prz Sheets("OBEC").Cells(wo, 5) = nau 'a teraz trzeba znaleźć pełną nazwę Sheets("OBEC").Cells(wo, 6) = NazwaPrzedmiotu(prz) wo = wo + 1 For i = 1 To ile Sheets("OBEC").Cells(11, ko) = ko - 3 Sheets("OBEC").Cells(12, ko) = prz ko = ko + 1 'żeby pamiętało do następnego przedmiotu w tym dniu Next i End If Next k1 'drukowanie 'sprawdzamy ile ukryć wierszy wi = 64 Do Sheets("OBEC").Rows(wi).RowHeight = 0 wi = wi - 1 Loop Until Sheets("OBEC").Cells(wi, 3) <> "" Sheets("OBEC").Select zakres = "$B$3:$J$63" ActiveSheet.PageSetup.PrintArea = zakres CzyPodgląd = Sheets("razem").Range("E5") If CzyPodgląd = True Then ActiveWindow.SelectedSheets.PrintPreview Else ActiveWindow.SelectedSheets.PrintOut Copies:=1 End If Sheets("OBEC").Select End Sub 'drukowanie rozkładu dla wybranego roku i okresu od do miesiąca Sub DrukujRozkład() w = ActiveCell.Row k = ActiveCell.Column 'na wszelki wypadek rok = 1 nau = "LW" m_od = Range("E3") m_do = Range("E4") Sheets("DRUK").Select Columns("A:D").Select Selection.ClearContents Range("B2").Select Sheets("razem").Select rok = Int(((k - 7) / 16)) + 1 nau = Cells(w, k) If w = 1 Then DrukujRozkładM rok, m_od, m_do End If If w = 2 Then DrukujRozkładN nau, m_od, m_do End If If (w > 2) Or (rok = 0) Or (nau = "") Then MsgBox "zaznacz rok lub nauczyciela aby wydrukować plan" End If End Sub 'r=1 k=7 'r=2 k=23 'r=3 k=39 'r=4 k=55 'drukowanie rozkładu dla nauczyciela Sub DrukujRozkładN(nau, m1, m2 As Variant) w = ActiveCell.Row k = ActiveCell.Column rok = Int(((k - 7) / 16)) + 1 Sheets("DRUK").Range("A1") = nau w1 = 2 For w = 8 To 366 + 7 dat = Cells(w, 1) mie = Month(dat) 'god = Cells(w, kol) If (mie >= m1) And (mie <= m2) Then 'And (god > 0) Then For k = 7 To 70 g = Cells(w, k) n = Cells(2, k) If (g > 0) And (n = nau) Then 'dni tygodnia txtd = Format(dat, "yyyy-mm-dd") 'data txtw = Format(dat, "ddd") 'dzień tyg txt0 = txtd & " (" & txtw & ")" 'tutaj sprawdzamy datę 'ale mogłoby sprawdzić poprzednią datę 'jesli taka sama to do poprzedniej dokleić dataAKT = txt0 dataPOP = Sheets("DRUK").Cells(w1 - 1, 2) If dataPOP = dataAKT Then w1 = w1 - 1 End If Sheets("DRUK").Cells(w1, 2) = txt0 'godziny If Weekday(dat) < 7 Then txtg = "15:00" 'czw 'If Weekday(dat) = 6 Then txtg = "15:00" 'pią If Weekday(dat) = 7 Then txtg = "8:00" 'sob Sheets("DRUK").Cells(w1, 3) = txtg 'Weekday(dat) txt1 = "" prz = Cells(1, k) If k >= 7 Then r = 7 If k >= 23 Then r = 23 If k >= 39 Then r = 39 If k >= 55 Then r = 55 rok = Cells(1, r) txt1 = rok & " [" & g & "] " & prz Sheets("DRUK").Cells(w1, 1) = w1 - 1 txtx = Sheets("DRUK").Cells(w1, 4) If txtx <> "" Then txtx = txtx & ", " Sheets("DRUK").Cells(w1, 4) = txtx & txt1 w1 = w1 + 1 End If Next k End If Next w Sheets("DRUK").Select End Sub 'drukowanie rozkłądu dla roku Sub DrukujRozkładM(r, m1, m2 As Variant) kol = 7 + (r - 1) * 16 rok = Cells(1, kol) Sheets("DRUK").Range("A1") = rok w1 = 2 For w = 8 To 366 + 7 dat = Cells(w, 1) mie = Month(dat) god = Cells(w, kol) If (mie >= m1) And (mie <= m2) And (god > 0) Then 'dni tygodnia txtd = Format(dat, "yyyy-mm-dd") 'data txtw = Format(dat, "ddd") 'dzień tyg txt0 = txtd & " (" & txtw & ")" Sheets("DRUK").Cells(w1, 2) = txt0 'godziny If Weekday(dat) < 7 Then txtg = "15:00" 'czw 'If Weekday(dat) = 6 Then txtg = "15:00" 'pią If Weekday(dat) = 7 Then txtg = "8:00" 'sob Sheets("DRUK").Cells(w1, 3) = txtg 'Weekday(dat) 'przedmioty txt1 = "" txtp = ", " For k = kol + 1 To kol + 15 g = Cells(w, k) If g > 0 Then prz = Cells(1, k) nau = Cells(2, k) If txt1 = "" Then txt1 = prz & " [" & g & "] " & nau Else txt1 = txt1 & ", " & prz & " [" & g & "] " & nau End If End If Next k Sheets("DRUK").Cells(w1, 1) = w1 - 1 Sheets("DRUK").Cells(w1, 4) = txt1 w1 = w1 + 1 End If Next w Sheets("DRUK").Select End Sub Sub skokPLAN() Sheets("razem").Select End Sub Sub DzieńNie() DzieńOnOff 1 End Sub Sub DzieńPon() DzieńOnOff 2 End Sub Sub DzieńWto() DzieńOnOff 3 End Sub Sub DzieńŚro() DzieńOnOff 4 End Sub Sub DzieńCzw() DzieńOnOff 5 End Sub Sub DzieńPią() DzieńOnOff 6 End Sub Sub DzieńSob() DzieńOnOff 7 End Sub Sub DzieńOnOff(jaki) For w = 8 To 311 dt = CInt(Cells(w, 4)) If dt = jaki Then If Rows(w).RowHeight = 0 Then Rows(w).RowHeight = 15.75 Else Rows(w).RowHeight = 0 End If End If Next w End Sub Sub próba() 'DzieńOnOff 1 w = ActiveCell.Row k = ActiveCell.Column x = CInt(Cells(w, k)) MsgBox x End Sub Sub PodkreślenieNiedzieli() wi = ActiveCell.Row ko = ActiveCell.Column For w = 8 To 311 dt = CInt(Cells(w, 4)) If dt = 1 Then Rows(w).Select 'Selection.Borders(xlDiagonalDown).LineStyle = xlNone 'Selection.Borders(xlDiagonalUp).LineStyle = xlNone 'Selection.Borders(xlEdgeLeft).LineStyle = xlNone 'Selection.Borders(xlEdgeTop).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With 'Selection.Borders(xlEdgeRight).LineStyle = xlNone 'Selection.Borders(xlInsideVertical).LineStyle = xlNone 'Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End If Next w Cells(wi, ko).Select End Sub 'wystarczy wybrać komórkę i pokazuje do której skok Private Sub Worksheet_SelectionChange(ByVal Target As Range) w = Target.Row k = Target.Column 'MsgBox w & " " & k End Sub 'pokazuje komórkę w której coś zmieniliśmy Private Sub Worksheet_Change(ByVal Target As Range) 'Target.Interior.Color = RGB(255, 0, 0) w = Target.Row k = Target.Column 'MsgBox w & " " & k End Sub