Ottimo esattamente come hai detto, se la Form principale non è associata va digitato a mano, o copiaincollato.
Il codice per compilare i 31 Controlli è banale, le funzioni poi da usare per la somma dei gg è DateAdd("d",1,DataInizio) in un ciclo.
Fai però attenzione che alcuni mesi hanno 30gg e Febb<30 quindi se sommi sempre 31 sbordi mese, il che va bene basta saperlo.
Per i Sabati, le Domeniche usa WeekDay per rilevare 6 e 7 come giorno della settimana, e gestire la grafica, puoi usare questa funzione
Private Function WeekEnd(ByVal laDate As Date) As Boolean
WeekEnd = ((Weekday(laDate, vbMonday) = 6) Or (Weekday(laDate, vbMonday) = 7))
End Function
Quindi ad esempio:
If WeekEnd(VariabileData) Then
Me.Controls("d" & IndiceProgr).BackColor=vbRed
Else
Me.Controls("d" & IndiceProgr).BackColor= Grigio
End if
Oppure, io preferisco questa:
Select Case Weekday(VariabileData, vbMonday)
Case 6: Me.Controls("d" & IndiceProgr).BackColor= ColoreSabato
Case 7: Me.Controls("d" & IndiceProgr).BackColor=ColoreDomenica
Case Else: Me.Controls("d" & IndiceProgr).BackColor=ColoreFeriale
End Select
mentre per i Festivi uso queste Funzioni:
Public Function Holiday(ByVal DateIsHoliday As Date) As Boolean
Dim YearOfDate As Integer
Dim NotWorkingDay(1 To 12) As Date
Dim i As Integer
YearOfDate = Year(DateIsHoliday)
NotWorkingDay(1) = DateSerial(YearOfDate, 1, 1)
NotWorkingDay(2) = DateSerial(YearOfDate, 1, 6)
NotWorkingDay(3) = DateSerial(YearOfDate, 5, 1)
NotWorkingDay(4) = DateSerial(YearOfDate, 5, 8)
NotWorkingDay(5) = DateSerial(YearOfDate, 6, 2)
NotWorkingDay(6) = DateSerial(YearOfDate, 8, 15)
NotWorkingDay(7) = DateSerial(YearOfDate, 11, 1)
NotWorkingDay(8) = DateSerial(YearOfDate, 12, 25)
NotWorkingDay(9) = DateSerial(YearOfDate, 12, 26)
NotWorkingDay(10) = EasterMonday(YearOfDate)
NotWorkingDay(11) = NotWorkingDay(9) + 38 ' Ascension = lundi de Paques + 38
NotWorkingDay(12) = NotWorkingDay(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
For i = 1 To 11
If Fix(DateIsHoliday) = NotWorkingDay(i) Then
Holiday = True
Exit For
End If
Next
End Function
Public Function EasterMonday(ByVal Iyear As Integer) As Date
Dim L(6) As Long, Lj As Long, Lm As Long
L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
L(4) = (19 * L(1) + 24) Mod 30
L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
L(6) = 22 + L(4) + L(5)
If L(6) > 31 Then
Lj = L(6) - 31
Lm = 4
Else
Lj = L(6)
Lm = 3
End If
EasterMonday = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
End Function
Quindi riassumendo:
Dim VariabileData As Date
Dim i As Integer
Dim DtInizio As Date
dtInizio = #1/1/2020# ' Esempio per Gennaio
For i = 1 To 31
VariabileData = DateAdd("d", i, dtInizio)
If Holiday(VariabileData) Then
Me.Controls("d" & IndiceProgr).BackColor = ColoreFestivo 'io uso quello della Domenica
Else
Select Case Weekday(VariabileData, vbMonday)
Case 6: Me.Controls("d" & IndiceProgr).BackColor = ColoreSabato
Case 7: Me.Controls("d" & IndiceProgr).BackColor = ColoreDomenica
Case Else: Me.Controls("d" & IndiceProgr).BackColor = ColoreFeriale
End Select
End If
Next
Quì trovi una serie di funzioni per le Date, ad esempio che ti sarà utile è quella per determinare il 1°gg del Mese e l'Ultimo...
forum.masterdrive.it/access-79/raccolta-funzioni-manipolazione-date-95382/
FirstDayInMonth/LastDayInMonth
Buon lavoro.