XL 2021 Intégration vacances scolaires à mon calendrier

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Nicolas JACQUIN

XLDnaute Accro
Supporter XLD
Bonjour à toutes et tous,

Je peine encore sur mon calendrier pour la création d'une ou plusieurs boucles.
Pour la création du calendrier automatique c'est bon (sur la feuil Calendrier), sur la feuille Vacances j'ai les dates des vacances scolaires par zone, du coup sur mon calendrier, j'ai rajouté 3 colonnes pour chaques zones, mon soucis c'est qu'à la création du calendrier (depuis le module Mod_Calendrier), j'aimerai pouvoir si la date est comprise entre les dates de la colonne "D" et "E" de la feuille Vacances, ça me colore la colonne correspondande du jour automatiquement sur ma feuille Calendrier.

Feuille Calendrier
Capture d’écran 2024-12-30 203237.jpg


Feuille Vacances
Capture d’écran 2024-12-30 203258.jpg


J'espère être assez compréhensif.
Merci à tous.
Nicolas

Et bonne fête de fin d'année
 

Pièces jointes

VB:
'patricktoulon
Sub test2()
    url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-2024-2025.html"
    getdatevac url
End Sub


Function getdatevac(url)
    Dim req As Object, zoneA, zoneB, zoneC, tables, table, trs, tds
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", url, False
    req.send
    'Debug.Print req.responsetext
    code = req.responsetext
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche", ",")

    For i = 0 To UBound(tj)
        code = Replace(code, "Du " & tj(i), "")
        code = Replace(code, " au " & tj(i), "||")
    Next
    code = Replace(code, "1er", "1")
    code = Replace(code, "Lundi ", "")


    With CreateObject("htmlfile")
        .body.innerhtml = code
        Set tables = .body.getelementsbytagname("table")
        Set table = tables(0)
        Set trs = table.getelementsbytagname("tr")
        For i = 2 To trs.Length - 2
            Set tds = trs(i).getelementsbytagname("td")
            zoneA = "": zoneB = "": zoneC = ""
            titrevacance = trs(i).Children(0).innertext
            zoneA = Split(trs(i).Children(1).innertext, vbCrLf)(0)
            t = Split(zoneA, "||"): zoneA = "zoneABC " & DateValue(Trim(t(0)))
            If UBound(t) > 0 Then zoneA = zoneA & " || " & DateValue(Trim(Replace(t(1), "1er", "1")))


            If tds.Length >= 2 Then

                zoneA = trs(i).Children(1).innertext
                t = Split(zoneA, "||"): zoneA = "zoneA " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneB = trs(i).Children(2).innertext
                t = Split(zoneB, "||"): zoneB = "zoneB " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneC = trs(i).Children(2).innertext
                t = Split(zoneC, "||"): zoneC = "zoneC " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

            End If
            Debug.Print titrevacance & vbCrLf & zoneA & vbCrLf & zoneB & vbCrLf & zoneC
            Debug.Print "--------------------------------------- "
        Next
    End With
End Function
 
re et de 4
'patricktoulon
VB:
'patricktoulon
Sub test2()
    url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-2024-2025.html"
    getdatevac url
End Sub


Function getdatevac(url)
    Dim req As Object, zoneA, zoneB, zoneC, tables, table, trs, tds
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", url, False
    req.send
    'Debug.Print req.responsetext
    code = req.responsetext
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche", ",")

    For i = 0 To UBound(tj)
        code = Replace(code, "Du " & tj(i), "")
        code = Replace(code, " au " & tj(i), "||")
    Next
    code = Replace(code, "1er", "1")
    code = Replace(code, "Lundi ", "")


    With CreateObject("htmlfile")
        .body.innerhtml = code
        Set tables = .body.getelementsbytagname("table")
        Set table = tables(0)
        Set trs = table.getelementsbytagname("tr")
        For i = 2 To trs.Length - 2
            Set tds = trs(i).getelementsbytagname("td")
            zoneA = "": zoneB = "": zoneC = ""
            titrevacance = trs(i).Children(0).innertext

            zoneA = Split(trs(i).Children(1).innertext, vbCrLf)(0)
            t = Split(zoneA, "||"): zoneA = "zoneABC " & DateValue(Trim(t(0)))
            If UBound(t) > 0 Then zoneA = zoneA & " || " & DateValue(Trim(Replace(t(1), "1er", "1")))
            t = Split(zoneA, " || ")
          
           If UBound(t) > 0 Then
                dat2 = CDate(t(1)): dat1 = CDate(Replace(t(0), "zoneABC ", ""))
                For k = 0 To dat2 - dat1
                    Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 3) = dat1 + k
                Next
            End If

            If tds.Length >= 2 Then

                zoneA = trs(i).Children(1).innertext
                t = Split(zoneA, "||"): zoneA = "zoneA " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneB = trs(i).Children(2).innertext
                t = Split(zoneB, "||"): zoneB = "zoneB " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneC = trs(i).Children(2).innertext
                t = Split(zoneC, "||"): zoneC = "zoneC " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

            End If
            Debug.Print titrevacance & vbCrLf & zoneA & vbCrLf & zoneB & vbCrLf & zoneC
            Debug.Print "--------------------------------------- "
        Next
    End With
End Function
 
VB:
'patricktoulon
Sub test2()
    url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-2024-2025.html"
    dd = Split(GetDataVac(url), vbCrLf)
    For i = 5 To UBound(dd)
        Select Case True
            Case dd(i) Like "zoneABC*"
                col = 4
                dd(i) = Split(dd(i), "zoneABC ")(1)
                
            Case dd(i) Like "zoneA*"
                col = 1
                dd(i) = Split(dd(i), "zoneA ")(1)
                
            Case dd(i) Like "zoneB*"
                col = 2
                dd(i) = Split(dd(i), "zoneB ")(1)
                
            Case dd(i) Like "zoneC*"
                col = 3
                dd(i) = Split(dd(i), "zoneC ")(1)
            Case Else: col = 0
        End Select


        If col > 0 Then
            t = Split(dd(i), " || ")
            dat1 = CDate(t(0)): dat2 = CDate(t(1))
            For k = 0 To dat2 - dat1
                If col = 4 Then
                    Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 3) = dat1 + k
                Else
                    Cells(Rows.Count, col).End(xlUp).Offset(1) = dat1 + k

                End If

            Next
        End If

    Next
End Sub


Function GetDataVac(url)
    Dim req As Object, zoneA, zoneB, zoneC, tables, table, trs, tds
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", url, False
    req.send
    'Debug.Print req.responsetext
    code = req.responsetext
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche", ",")

    For i = 0 To UBound(tj)
        code = Replace(code, "Du " & tj(i), "")
        code = Replace(code, " au " & tj(i), "||")
    Next
    code = Replace(code, "1er", "1")
    code = Replace(code, "Lundi ", "")


    With CreateObject("htmlfile")
        .body.innerhtml = code
        Set tables = .body.getelementsbytagname("table")
        Set table = tables(0)
        Set trs = table.getelementsbytagname("tr")
        For i = 2 To trs.Length - 2
            Set tds = trs(i).getelementsbytagname("td")
            zoneA = "": zoneB = "": zoneC = ""
            titrevacance = trs(i).Children(0).innertext

            zoneA = Split(trs(i).Children(1).innertext, vbCrLf)(0)
            t = Split(zoneA, "||"): zoneA = "zoneABC " & DateValue(Trim(t(0)))
            If UBound(t) > 0 Then zoneA = zoneA & " || " & DateValue(Trim(Replace(t(1), "1er", "1")))


            If tds.Length >= 2 Then

                zoneA = trs(i).Children(1).innertext
                t = Split(zoneA, "||"): zoneA = "zoneA " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneB = trs(i).Children(2).innertext
                t = Split(zoneB, "||"): zoneB = "zoneB " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneC = trs(i).Children(2).innertext
                t = Split(zoneC, "||"): zoneC = "zoneC " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

            End If
            Data = Data & vbCrLf & titrevacance & vbCrLf & zoneA & vbCrLf & zoneB & vbCrLf & zoneC & vbCrLf & "--------------------------------------- "
        Next
    End With
    GetDataVac = Data
End Function
 
Re Patrick,
je pense avoir trouvé ton erreur,

Code:
'patricktoulon
Sub test20()
    url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-2024-2025.html"
    dd = Split(GetDataVac(url), vbCrLf)
    For i = 5 To UBound(dd)
        Select Case True
            Case dd(i) Like "zoneABC*"
                col = 4
                dd(i) = Split(dd(i), "zoneABC ")(1)
                
            Case dd(i) Like "zoneA*"
                col = 1
                dd(i) = Split(dd(i), "zoneA ")(1)
                
            Case dd(i) Like "zoneB*"
                col = 2
                dd(i) = Split(dd(i), "zoneB ")(1)
                
            Case dd(i) Like "zoneC*"
                col = 3
                dd(i) = Split(dd(i), "zoneC ")(1)
            Case Else: col = 0
        End Select


        If col > 0 Then
            t = Split(dd(i), " || ")
            dat1 = CDate(t(0)): dat2 = CDate(t(1))
            For k = 0 To dat2 - dat1
                If col = 4 Then
                    Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 3) = dat1 + k
                Else
                    Cells(Rows.Count, col).End(xlUp).Offset(1) = dat1 + k

                End If

            Next
        End If

    Next
End Sub


Function GetDataVac(url)
    Dim req As Object, zoneA, zoneB, zoneC, tables, table, trs, tds
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", url, False
    req.send
    'Debug.Print req.responsetext
    code = req.responseText
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche", ",")

    For i = 0 To UBound(tj)
        code = Replace(code, "Du " & tj(i), "")
        code = Replace(code, " au " & tj(i), "||")
    Next
    code = Replace(code, "1er", "1")
    code = Replace(code, "Lundi ", "")


    With CreateObject("htmlfile")
        .body.innerhtml = code
        Set tables = .body.getElementsByTagName("table")
        Set table = tables(0)
        Set trs = table.getElementsByTagName("tr")
        For i = 2 To trs.Length - 2
            Set tds = trs(i).getElementsByTagName("td")
            zoneA = "": zoneB = "": zoneC = ""
            titrevacance = trs(i).Children(0).innertext

            zoneA = Split(trs(i).Children(1).innertext, vbCrLf)(0)
            t = Split(zoneA, "||"): zoneA = "zoneABC " & DateValue(Trim(t(0)))
            If UBound(t) > 0 Then zoneA = zoneA & " || " & DateValue(Trim(Replace(t(1), "1er", "1")))


            If tds.Length >= 2 Then

                zoneA = trs(i).Children(1).innertext
                t = Split(zoneA, "||"): zoneA = "zoneA " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneB = trs(i).Children(2).innertext
                t = Split(zoneB, "||"): zoneB = "zoneB " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

                zoneC = trs(i).Children(3).innertext
                t = Split(zoneC, "||"): zoneC = "zoneC " & DateValue(Trim(t(0))) & " || " & DateValue(Trim(t(1)))

            End If
            Data = Data & vbCrLf & titrevacance & vbCrLf & zoneA & vbCrLf & zoneB & vbCrLf & zoneC & vbCrLf & "--------------------------------------- "
        Next
    End With
    GetDataVac = Data
End Function

Ca devrait être mieux 😉😉
 
Bonjour à toutes et tous,

Je reviens encore une fois vers vous sur mon souci d'intégration des vacances scolaires automatiquement, je tiens déjà à remercier #patricktoulon pour le le temps qu'il a pris avec moi pour la création de son code du post #33.

Depuis url concernée sur le code de Patrick, je peux récupérer 2023-2024 et 2024-2025 avec les vacances d'été, mais dès que je mets 2025-2026, j'ai un plantage alors que si l'on passe directement par le site, les dates 2025-2026 donne les dates.

Du coup, depuis une semaine j'ai bricolé le code dans tous les sens, avec le code que je vais présenter ci-dessous, j'arrive à récupérer 2023-2024 avec les vacances d'été, mais dès que je veux 2024-2025 ou 2025-2026, j'ai bien toutes les vacances sauf les vacances d'été.

Apparemment se serait un problème de conversion de date, mais je n'arrive pas à trouver le problème.

Je vous joint le code le débug et le fichier.

Merci d'avance à tous.

Nicolas

VB:
Sub Vacanc()
    Dim maDate As Date
    Dim ws As Worksheet
    Dim an1 As Integer, an2 As Integer
    Dim url As String, dd As Variant, i As Integer, k As Integer
    Dim col As Integer, dat1 As Date, dat2 As Date, T As Variant
    Dim currentYear As Integer, selectedYear As Integer, selectedMonth As Integer

    Set ws = ThisWorkbook.Sheets("Vacances")

    url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-2024-2025.html"
    dd = Split(GetDataVac(url), vbCrLf)

    For i = 5 To UBound(dd)
        Select Case True
            Case dd(i) Like "zoneABC*"
                col = 4
                dd(i) = Split(dd(i), "zoneABC ")(1)
            Case dd(i) Like "zoneA*"
                col = 1
                dd(i) = Split(dd(i), "zoneA ")(1)
            Case dd(i) Like "zoneB*"
                col = 2
                dd(i) = Split(dd(i), "zoneB ")(1)
            Case dd(i) Like "zoneC*"
                col = 3
                dd(i) = Split(dd(i), "zoneC ")(1)
            Case Else: col = 0
        End Select

        If col > 0 Then
            T = Split(dd(i), " || ")

            ' Vérification que T(0) existe
            If UBound(T) >= 0 Then
                T(0) = CleanDateFormat(CStr(T(0))) ' Nettoie et corrige la date
            End If

            ' Si T contient un seul élément, assurez-vous que T(1) existe
            If UBound(T) < 1 Then
                ReDim Preserve T(1) ' Redimensionner pour éviter l'erreur
                T(1) = "" ' Si pas de deuxième date, mettre une valeur vide
            Else
                ' Nettoyer la deuxième date si elle existe
                T(1) = CleanDateFormat(CStr(T(1)))
            End If

            ' Conversion sécurisée des dates
            dat1 = SafeConvertDate(CStr(T(0)))  ' Conversion propre (passage de T(0) comme chaîne)
            dat2 = SafeConvertDate(CStr(T(1)))  ' Conversion propre (passage de T(1) comme chaîne)

            ' Affichage des valeurs pour vérifier
            Debug.Print "Date 1 : "; T(0); " -> "; dat1
            Debug.Print "Date 2 : "; T(1); " -> "; dat2

            If dat1 > 0 And dat2 > 0 Then
                For k = 0 To dat2 - dat1
                    If col = 4 Then
                        ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 3).Value = dat1 + k
                    Else
                        ws.Cells(ws.Rows.Count, col).End(xlUp).Offset(1).Value = dat1 + k
                    End If
                Next k
            Else
                Debug.Print "Erreur de conversion de date pour : "; dd(i)
            End If
        End If
    Next i
End Sub

' Fonction de nettoyage pour supprimer les jours de la semaine et autres éléments non pertinents
Function CleanDateFormat(dateString As String) As String
    Dim cleanedDate As String
    ' Supprimer les jours de la semaine (par exemple "Samedi", "Dimanche", etc.)
    cleanedDate = Replace(dateString, "Lundi", "")
    cleanedDate = Replace(cleanedDate, "Mardi", "")
    cleanedDate = Replace(cleanedDate, "Mercredi", "")
    cleanedDate = Replace(cleanedDate, "Jeudi", "")
    cleanedDate = Replace(cleanedDate, "Vendredi", "")
    cleanedDate = Replace(cleanedDate, "Samedi", "")
    cleanedDate = Replace(cleanedDate, "Dimanche", "")

    ' Nettoyer les espaces inutiles
    cleanedDate = Trim(cleanedDate)

    ' Retourner la date nettoyée
    CleanDateFormat = cleanedDate
End Function

' Fonction de conversion sécurisée d'une date (convertit une chaîne en date si possible)
Function SafeConvertDate(dateString As String) As Date
    On Error Resume Next ' Ignore les erreurs si la conversion échoue
    SafeConvertDate = DateValue(dateString) ' Tente la conversion
    On Error GoTo 0 ' Désactive l'ignorance des erreurs après la tentative
End Function


' Fonction pour récupérer les données des vacances
Function GetDataVac(url As String) As String
    Dim req As Object, tables As Object, table As Object, trs As Object, tds As Object
    Dim zoneA As String, zoneB As String, zoneC As String, titrevacance As String, Data As String
    Dim i As Integer, T As Variant, code As String
    Dim tj As Variant

    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "GET", url, False
    req.send
    code = req.responseText

    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
            MsgBox "Erreur lors du chargement de la page.", vbExclamation, "Erreur"
            Exit Function
        End If
    End If

    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche", ",")
    For i = 0 To UBound(tj)
        code = Replace(code, "Du " & tj(i), "")
        code = Replace(code, " au " & tj(i), "||")
    Next
    code = Replace(code, "1er", "1")
    code = Replace(code, "Lundi ", "")

    With CreateObject("htmlfile")
        .body.innerHTML = code
        Set tables = .body.getElementsByTagName("table")

        If tables.Length = 0 Then
            MsgBox "Aucune table trouvée sur la page.", vbExclamation, "Erreur"
            Exit Function
        End If

        Set table = tables(0)
        Set trs = table.getElementsByTagName("tr")

        For i = 2 To trs.Length - 2
            Set tds = trs(i).getElementsByTagName("td")
            zoneA = "": zoneB = "": zoneC = ""
            titrevacance = trs(i).Children(0).innerText

            zoneA = Split(trs(i).Children(1).innerText, vbCrLf)(0)
            T = Split(zoneA, "||"): zoneA = "zoneABC " & Trim(T(0))
            If UBound(T) > 0 Then zoneA = zoneA & " || " & Trim(T(1))

            If tds.Length >= 2 Then
                zoneA = trs(i).Children(1).innerText
                T = Split(zoneA, "||"): zoneA = "zoneA " & Trim(T(0)) & " || " & Trim(T(1))

                zoneB = trs(i).Children(2).innerText
                T = Split(zoneB, "||"): zoneB = "zoneB " & Trim(T(0)) & " || " & Trim(T(1))

                zoneC = trs(i).Children(3).innerText
                T = Split(zoneC, "||"): zoneC = "zoneC " & Trim(T(0)) & " || " & Trim(T(1))
            End If

            Data = Data & vbCrLf & titrevacance & vbCrLf & zoneA & vbCrLf & zoneB & vbCrLf & zoneC & vbCrLf & "--------------------------------------- "
        Next
    End With

    GetDataVac = Data
End Function

Code:
Date 1 : 19 octobre 2024 -> 19/10/2024
Date 2 : 4 novembre 2024 -> 04/11/2024
Date 1 : 21 décembre 2024 -> 21/12/2024
Date 2 : 6 janvier 2025 -> 06/01/2025
Date 1 : 22 février 2025 -> 22/02/2025
Date 2 : 10 mars 2025 -> 10/03/2025
Date 1 : 8 février 2025 -> 08/02/2025
Date 2 : 24 février 2025 -> 24/02/2025
Date 1 : 15 février 2025 -> 15/02/2025
Date 2 : 3 mars 2025 -> 03/03/2025
Date 1 : 19 avril 2025 -> 19/04/2025
Date 2 : 5 mai 2025 -> 05/05/2025
Date 1 : 5 avril 2025 -> 05/04/2025
Date 2 : 22 avril 2025 -> 22/04/2025
Date 1 : 12 avril 2025 -> 12/04/2025
Date 2 : 28 avril 2025 -> 28/04/2025
Date 1 : 28 mai 2025 -> 28/05/2025
Date 2 : 2 juin 2025 -> 02/06/2025
Date 1 : 5 juillet 2025 -> 05/07/2025
Date 2 : 1er septembre 2025 -> 00:00:00
Erreur de conversion de date pour : 5 juillet 2025 || 1er septembre 2025



 

Pièces jointes

Bonjour,
On peut aussi faire simple en interrogeant le site opendataSoft.
Avec le lien suivant :
Un simple clic ou un ThisWorkbook.FollowHyperlink permet de télécharger l'ensemble des data officiellement publiées dans un fichier xlsx.
Il suffit alors de copier/coller les données, et avec un "traducteur" de dates on obtient l'ensemble des résultats de toutes les académies, de toutes les années publiées, en une fois.
Même sans aucun code, juste avec des formules on peut s'en tirer.
Simple, basique.
P.
 
Bonjour,
On peut aussi faire simple en interrogeant le site opendataSoft.
Avec le lien suivant :
Un simple clic ou un ThisWorkbook.FollowHyperlink permet de télécharger l'ensemble des data officiellement publiées dans un fichier xlsx.
Il suffit alors de copier/coller les données, et avec un "traducteur" de dates on obtient l'ensemble des résultats de toutes les académies, de toutes les années publiées, en une fois.
Même sans aucun code, juste avec des formules on peut s'en tirer.
Simple, basique.
P.

Bonjour,

Merci du retour, le but est d'avoir chaque dates de vacances en colonne,
colonne "A" = Zone "A", colonne "B" = Zone "B", colonne "C" = Zone "C" et plus pourquoi pas

Capture d’écran 2025-02-09 114955.jpg


Pour une intégration dans calendrier

test.gif


Nicolas
 
Bonjour,
Juste pour le fun (Résultat conforme à la demande, avec les 13 zones - Métro et Ultramarines)
L'année centrale (2025, par exemple), restituera les dates des vacances scolaires des années 2024-2025 et 2025-2026
Via Power Query, et données issues du lien fourni par Pierre
Temps de mise à jour, à l'ouverture du fichier, de l'ordre de 6 secondes, puis moins de 2 secondes (du moins, chez moi)
Bon dimanche
 

Pièces jointes

bonsoir à tous
@Nicolas JACQUIN j'ai pris un peu de temps pour reprendre mon idée
du coup je vais chercher dans d'autres éléments de la page web
et je te fait tes 3 colonnes pour rester dans l'acabit et ton principe déjà en place
tu envoie les deux année a la fonction et elle se charge de tout
remplace feuil1 par ta feuille dans tout le code
on pourrait la variabiliser aussi pour se faciliter la tache

le code
VB:
Option Explicit
'patricktoulon
Sub test2()
    Feuil1.UsedRange.ClearContents
    GetDataVac 2025, 2026
End Sub


Function GetDataVac(an1, an2)
    Dim req As Object, cel As Range, Url, code, tj, i&, j, uls, z, t, lig, arr, dat1, dat2, x, col&
    Url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-" & an1 & "-" & an2 & ".html"
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", Url, False
    req.send
    'Debug.Print req.responsetext
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    code = req.responsetext
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche,Samedi", ",")
    For i = 0 To UBound(tj)
        code = Replace(code, tj(i) & " ", "")
        code = Replace(code, "du ", "")
        code = Replace(code, " au ", ":")
        code = Replace(code, " à la rentrée scolaire", "")
        code = Replace(code, " après les cours", "")
        code = Replace(code, an1 & " " & an1, an1)
        code = Replace(code, an2 & " " & an2, an2)
    Next

    With CreateObject("htmlfile")
        .body.innerhtml = code
        Set uls = .getelementsbytagname("ul")
        z = Split("A,B,C", ",")
        For i = 5 To 7
            t = Split(uls(i).innertext, vbCrLf)
            For lig = 0 To UBound(t)
                Set cel = Cells(Rows.Count, 6).End(xlUp).Offset(1)
                arr = Split(t(lig) & ":", ":")
                cel.Value = "zone " & z(i - 5)
                cel.Offset(, 1) = arr(0)
                On Error Resume Next
                cel.Offset(, 2) = DateValue(Trim(arr(1)))
                cel.Offset(, 3) = DateValue(Trim(arr(2)))
                On Error GoTo 0
            Next
        Next
    End With

    For i = 2 To Feuil1.Cells(Rows.Count, 6).End(xlUp).Row
        Select Case Feuil1.Cells(i, 6).Value
            Case "zone A": col = 1
            Case "zone B": col = 2
            Case "zone C": col = 3
        End Select
        If Feuil1.Cells(i, 9).Value <> "" Then

            dat1 = Feuil1.Cells(i, 8).Value
            dat2 = Feuil1.Cells(i, 9).Value
            x = dat2 - dat1
            For j = 0 To x
                Feuil1.Cells(Rows.Count, col).End(xlUp).Offset(1) = dat1 + j
            Next
        End If
    Next
End Function
voila chez moi c'est instantané
démo
demo1.gif

le fichier exemple joint
patrick
 

Pièces jointes

Dernière édition:
les modifs que j'ai fait
dans la create calendrier
VB:
Feuil2.cells.ClearContents
   
    If mois >= 9 And mois <= 12 Then
        GetDataVac année, année + 1
    Else
        GetDataVac année - 1, année
    End If
et ton module vacance j ai mis tout mon code
VB:
Option Explicit
'patricktoulon
Sub test2()
    Feuil2.UsedRange.ClearContents
    If Date < DateSerial(Year(Date), 1, 1) Then
        GetDataVac Year(Date), Year(Date) + 1
    Else
        GetDataVac Year(Date) - 1, Year(Date)
    End If
End Sub


Function GetDataVac(an1, an2)
    Dim req As Object, cel As Range, Url, code, tj, i&, j, uls, z, t, lig, arr, dat1, dat2, x, col&
    Url = "https://www.vacances-scolaires-education.fr/vacances-scolaires-" & an1 & "-" & an2 & ".html"
    Set req = CreateObject("microsoft.xmlhttp")
    req.Open "get", Url, False
    req.send
    'Debug.Print req.responsetext
    If req.ReadyState = 4 Then
        If req.Status <> 200 Then
        End If
    End If
    code = req.responseText
    tj = Split("lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche,Samedi", ",")
    For i = 0 To UBound(tj)
        code = Replace(code, tj(i) & " ", "")
        code = Replace(code, "du ", "")
        code = Replace(code, " au ", ":")
        code = Replace(code, " à la rentrée scolaire", "")
        code = Replace(code, " après les cours", "")
        code = Replace(code, an1 & " " & an1, an1)
        code = Replace(code, an2 & " " & an2, an2)
    Next

    With CreateObject("htmlfile")
        .body.innerHTML = code
        Set uls = .getElementsByTagName("ul")
        z = Split("A,B,C", ",")
        For i = 5 To 7
            t = Split(uls(i).innerText, vbCrLf)
            For lig = 0 To UBound(t)
                Set cel = Feuil2.cells(rows.Count, 6).End(xlUp).Offset(1)
                arr = Split(t(lig) & ":", ":")
                cel.Value = "zone " & z(i - 5)
                cel.Offset(, 1) = arr(0)
                On Error Resume Next
                cel.Offset(, 2) = DateValue(Trim(arr(1)))
                cel.Offset(, 3) = DateValue(Trim(arr(2)))
                On Error GoTo 0
           If cel.Offset(, 3) = "" Then cel.Offset(, 3) = CDate("02/09/" & an2)
           Next
        Next
    End With

    For i = 2 To Feuil2.cells(rows.Count, 6).End(xlUp).row
        Select Case Feuil2.cells(i, 6).Value
            Case "zone A": col = 1
            Case "zone B": col = 2
            Case "zone C": col = 3
        End Select
        If Feuil2.cells(i, 9).Value <> "" Then

            dat1 = Feuil2.cells(i, 8).Value
            dat2 = Feuil2.cells(i, 9).Value
            x = dat2 - dat1
            For j = 0 To x
                Feuil2.cells(rows.Count, col).End(xlUp).Offset(1) = dat1 + j
            Next
        End If
    Next
End Function
 
Bonjour Nicolas
quand j'avais fait ce menu je ne connaissais pas les tenants et aboutissants de ton projet
il s'avère qu'a y regarder de plus prêt c'est pas le bon acabit
en effet une année scolaire commence en septembre et termine en debut juillet
don quand tu affiche ton menu pour une année les intitulé des bouton induisent en erreur
en effet si je choisi 2025 j'ai tout les mois mais avec 2025
hors une année scolaire comment en septembre 2025 et termine en juillet 2026
donc ceci est faux
1739347202552.png

car selon toute logique on devrait commencer en septembre
reste que ce calendrier ( je suppose n'est pas que pour le scolaire)

en tout cas là a l'affichage j'ai une année complète révolue mais pour une année scolaire ça ne correspond pas
d’où le petit stratagème que j'ai ajouté pour aller chercher les vacances
cela dit reste que l'affichage du menu n'est pas cohérent avec l'intention
si tu veux on pourrait reprendre cela voir même avec un autre bouton et autres menu spécial année scolaire

en tout cas pour les vacances on est bons par contre j'ai un doute sur la nécessité d'avoir autant d'année disponible
je pense que année en cours +2 est amplement suffisant d'autant plus que les calendriers scolaires disponibles sur la toile en page web ne donne a disposition que les vacances année en cours /année en cours +1
comme dans mon menu l'année part de year(date)-1 à x l'incrémentation est automatique
ce la dit perso je l'arrêterais a 2026
mais là encore une fois c'est le fait de mélanger un calendrier tout court a un calendrier scolaire qui titille ma reflexion
je te laisse méditer là dessus

d'ailleurs je me pose une question
si je choisi janvier 2025
on est donc dans l'année scolaire 2024-2025
est tu sur que le calendrier se met a jour avec janvier 2025 et non 2024?
je te dis ça je n'ai pas regardé mais je me pose quand même la question

voila Nicolas
ps: bien recu ton SMS
 
Bonjour Patrick,

Oui l'idée de partir sur une année scolaire serait sans doute plus simple à mettre en place par rapport au vacances,
j'avais pensé à l'idée.

D'ou le souci, comme je te disais que selon le mois crée le calendrier ne donnera pas forcément la bonne période de vacances récupéré.

Je suis tout ouïe.

Nico
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
1 K
Retour