Article épinglé

vendredi 20 juin 2025

Calendrier, LibreOffice et Basic...

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
Bon, je dis ça mais les coordos me font remonter que trop d'informatique?!



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 ;)