Et avec l'aide d'une IA... L'exercice est amusant, à tester avec des étudiants? Un truc du genre pour les BTSA AP:
"Créer une feuille de suivie de chantier avec date de départ, indication des WE et jours fériés" pour :
- montrer que le python du lycée sert à "sentir" le Basic de LibreOffice ou le VBA d'Excel
- que la macro existe
Lancer Libre Office, activer les macros en abaissant la sécurité à Moyen pour quand même avoir une alerte.
Evidemment il faudra coller le script dans une macro puis le lancer =>
Remarque:
InputBox 1 = Nbre de colonnes par mois, dans la copie d'écran le mois de Septembre à 4 colonnes comme les mois suivants...
InputBox 2 = Le mois de départ de l'année désirée
Script en dessous
REM ***** BASIC *****
' Calcule la date de Pâques pour une année donnée
Function DatePaques(annee As Integer) As Date
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
Dim jour As Integer, mois As Integer
a = annee Mod 19
b = annee \ 100
c = annee Mod 100
d = (19 * a + b - b \ 4 - ((b - (b + 8) \ 25 + 1) \ 3) + 15) Mod 30
e = (32 + 2 * (b Mod 4) + 2 * (c \ 4) - d - (c Mod 4)) Mod 7
jour = d + e + 1
If jour > 31 Then
DatePaques = DateSerial(annee, 4, jour - 31)
Else
DatePaques = DateSerial(annee, 3, jour)
End If
End Function
Sub CalendrierPerpetuel
Dim oDoc As Object, oSheet As Object
Dim sDateDebut As String, dDateDebut As Date
Dim sMoisAnnee As String, tabDate() As String
Dim i As Integer, j As Integer
Dim mois(12) As String
Dim dDate As Date
Dim anneeDebut As Integer, moisDebut As Integer
Dim a As Integer, m As Integer
Dim nbJours As Integer
Dim col As Integer, row As Integer
Dim jourSemaine As Integer
Dim oCell As Object
Dim z As Integer'z correspond au nombre de colonnes affectées à 1 mois dans le calendrier
mois(1) = "Janvier"
mois(2) = "Février"
mois(3) = "Mars"
mois(4) = "Avril"
mois(5) = "Mai"
mois(6) = "Juin"
mois(7) = "Juillet"
mois(8) = "Août"
mois(9) = "Septembre"
mois(10) = "Octobre"
mois(11) = "Novembre"
mois(12) = "Décembre"
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oSheet.clearContents(1023) ' Efface la feuille
z = InputBox("Saisissez le nbre de colonnes désirées par mois", "Nbre de colonnes =", "Saisir un entier >= 2")
If z = "" Then Exit Sub
sMoisAnnee = InputBox("Saisissez le mois et l'année de départ (MM/AAAA) :", "Mois et année de départ", "09/2026")
If sMoisAnnee = "" Then Exit Sub
tabDate = Split(sMoisAnnee, "/")
If UBound(tabDate) <> 1 Then
MsgBox "Format incorrect. Veuillez saisir sous la forme MM/AAAA."
Exit Sub
End If
moisDebut = Val(tabDate(0))
anneeDebut = Val(tabDate(1))
dDateDebut = DateSerial(anneeDebut, moisDebut, 1)
' Prépare les jours fériés pour chaque année affichée
Dim joursFeriesDates(11) As Variant
Dim joursFeriesNoms(11) As Variant
For i = 0 To 11
m = ((moisDebut + i - 1) Mod 12) + 1
a = anneeDebut + Int((moisDebut + i - 1) / 12)
Dim paques As Date, ascension As Date, pentecote As Date
paques = DatePaques(a)
ascension = paques + 39
pentecote = paques + 50
joursFeriesDates(i) = Array( _
DateSerial(a, 1, 1), _
paques, _
paques + 1, _
DateSerial(a, 5, 1), _
DateSerial(a, 5, 8), _
ascension, _
pentecote, _
DateSerial(a, 7, 14), _
DateSerial(a, 8, 15), _
DateSerial(a, 11, 1), _
DateSerial(a, 11, 11), _
DateSerial(a, 12, 25) _
)
joursFeriesNoms(i) = Array( _
"Jour de l'an", _
"Pâques", _
"Lundi de Pâques", _
"Fête du Travail", _
"Victoire 1945", _
"Ascension", _
"Lundi de Pentecôte", _
"Fête Nationale", _
"Assomption", _
"Toussaint", _
"Armistice", _
"Noël" _
)
Next i
' Ecrit les mois en entête de colonnes (dès la colonne 0)
col = 0
For i = 0 To 11
m = ((moisDebut + i - 1) Mod 12) + 1
a = anneeDebut + Int((moisDebut + i - 1) / 12)
oSheet.getCellByPosition(col, 0).String = mois(m) & " " & a
' Fusionne les z colonnes pour l'en-tête
oSheet.getCellRangeByPosition(col, 0, col + z-1, 0).merge(True)
' Largeur des colonnes vides à 1cm (environ 1000 microns)
for j = 1 to z-1
oSheet.Columns(col + j).Width = 1000
Next j
col = col + z
Next i
' Remplit les jours pour chaque mois (dès la colonne 0)
For i = 0 To 11
m = ((moisDebut + i - 1) Mod 12) + 1
a = anneeDebut + Int((moisDebut + i - 1) / 12)
' Calcul du nombre de jours dans le mois (méthode simple)
If m = 2 Then
If (a Mod 4 = 0 And a Mod 100 <> 0) Or (a Mod 400 = 0) Then
nbJours = 29
Else
nbJours = 28
End If
ElseIf m = 4 Or m = 6 Or m = 9 Or m = 11 Then
nbJours = 30
Else
nbJours = 31
End If
For j = 1 To nbJours
dDate = DateSerial(a, m, j)
jourSemaine = WeekDay(dDate, 2) ' 1 = lundi, 7 = dimanche
Set oCell = oSheet.getCellByPosition(i*z, j)
oCell.String = j & "-" & Format(dDate, "ddd")
' Vérifie si le jour est férié ou sam-dim pour formatage
Dim isFerie As Boolean
Dim nomFerie As String
isFerie = False
For k = 0 To UBound(joursFeriesDates(i))
If dDate = joursFeriesDates(i)(k) Then
isFerie = True
nomFerie = joursFeriesNoms(i)(k)
Exit For
End If
Next k
If isFerie Then
oCell.CharWeight = com.sun.star.awt.FontWeight.BOLD
oCell.CharColor = RGB(0, 0, 0) ' noir
oCell.CellBackColor = RGB(255, 180, 180) ' rouge clair
oCell.String = j & "-" & Format(dDate, "ddd") & " (" & nomFerie & ")"
ElseIf jourSemaine = 6 Or jourSemaine = 7 Then
oCell.CharWeight = com.sun.star.awt.FontWeight.BOLD
oCell.CellBackColor = RGB(200, 200, 200) ' gris clair
End If
Next j
Next i
MsgBox "Calendrier généré à partir du " & sDateDebut
End Sub
Aucun commentaire:
Enregistrer un commentaire
Tout commentaire nous engage ;)