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