XL 2021 Calendrier des marées info

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

A ceux qui ont le pied marin,

je voulais savoir s'il était possible de créer un calendrier des marées avec :
-les heures de marée Haute
-les heures de marée Basse

et éventuellement les coefs.

Je ne sais pas du tout si c'est possible, mais si certains ont déjà étudiés sur la chose je suis preneur.

Je sais qu'il y a plein de site en ligne qui donne ce que je veux, mais se serait pour compléter un calendrier
avec les phases lunaires, éphémérides ..........

Si ça peut aider je suis de la région Lorientaise (Bretagne)

En vous remerciant d'avance.

Nicolas
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

Dernière question sur le sujet pour finir,

Est-ce possible de modifier une donnée dans powerquéry (la ville dans mon cas) via vba depuis une liste déroulante pour choisir n'importe quelle ville ?
Pour faire un choix différent selon le lieux ou l'on se trouve
je remercie encore Jeannette pour son travail sur ce sujet.

S'il faut je refais une discussion si hors sujet

Merci à tous
Nico
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, @Nicolas JACQUIN

[En passant]
Est-ce possible de modifier une donnée dans powerquéry (la ville dans mon cas) via vba depuis une liste déroulante pour choisir n'importe quelle ville ?
Pas besoin de VBA, il suffit d'adapter le code M en conséquence (*)
(voir les exemples dans les archives du forum)

(*) en passant par un TS nommé .

Sinon voir cet exemple qui est assez explicite

[/En passant]
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour le fil, @Nicolas JACQUIN

[En passant]

Pas besoin de VBA, il suffit d'adapter le code M en conséquence (*)
(voir les exemples dans les archives du forum)

(*) en passant par un TS nommé .

Sinon voir cet exemple qui est assez explicite

[/En passant]
Bonjour Staple1600,

Merci du retour, je vais regarder mais c'est pas gagné pour moi, déjà les bases de PQ je connais pas alors la suite ;) ;)

Merci
Nico
 

dysorthographie

XLDnaute Accro
Bonsoir,
je t'es fait un macros qui récupère toutes les ville du site. dans ton message en privé tu formulais le souhait de permettre aux utilisateurs de sélectionner la ville de leur rêve!


1724690801992.png


j'ai rédigé un VBScript villes.vbs que tu pourras exécuté depuis le planificateur de tâche pour récupérer automatiquement les heures des marées sur le jours actuelle et les 10 suivant.

notes que je ne me souci pas de la date fourni mai je considère la date d'aujourd'hui
et +1,+2 etc; pour les suivante.
1724691359673.png


gères le planificateur de tâche pour qu'il s'exécute le plus proche de l'apprès minuit en faisan gaffe à l'heur de mise à jour du site.

note que ADODB gère le type de données par apprentissage d'où la première ligne.

je n'ai pas utilisé ton fichier vue qu'il contient des déclaration de librairies spécifique au 64Bits incompatible avec mon Excel et je n'avais pas de temps pour tout recaler.
 

Pièces jointes

  • villes.zip
    50.3 KB · Affichages: 5
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjoir,
VB:
Option Explicit
Sub ParVentEtMaré()

Dim city, url As String, VILLES()    As ville, conn As Object
 ' Créer une connexion ADODB
    Set conn = CreateADODBConnection(ThisWorkbook.FullName)
    For Each city In RetournVille(conn)

   ' Construire l'URL de la page web
    url = "https://horaire-maree.fr/maree/" & city & "/"
    If CheckURL(url, CStr(city)) And city <> "" Then
        RetorunVilleMatin CStr(city), VILLES, Now, GetHTMLDocument(url)
        RetorunVilleAprès CStr(city), Now, VILLES
        
        ' Insérer les données de marées
        ProcessAndInsertTideData conn, VILLES
    End If
 Next
    ' Fermer la connexion ADODB
    conn.Close
    Set conn = Nothing
 
  
End Sub
Sub RetorunVilleMatin(v As String, TbVille() As ville, D As String, htmlDoc As Object)

 Dim NB As Integer, Champ As Integer, tb, tb2, i As Integer, T, A
 tb = Split(htmlDoc.getElementById("i_donnesJour").getElementsByTagName("table")(0).innerhtml, "<TD class=""blueoffice whitetxt"">")
  For i = 1 To UBound(tb)
  ReDim Preserve TbVille(NB)
 If TypeName(TbVille(NB)) = "Nothing" Then Set TbVille(NB) = New ville
   TbVille(NB).ville = v: TbVille(NB).MyDate = Format(D, "yyyy-mm-dd")
    tb2 = Split(tb(i), "<STRONG>")
  
        For Each T In tb2
        
        Debug.Print T
           A = Split(Replace(Replace(Replace(Replace(T, "</STRONG>", ""), "<BR>", ";"), "<TD>", ""), "</TD>", "") & ";", ";")
           Select Case Champ
            Case 1: If A(0) <> "" Then TbVille(NB).Matin_Coeff = CStr(A(0))
            Case 2: If A(0) <> "" Then TbVille(NB).Matin_Basse_mere = CDate(Replace(A(0), "h", ":")): TbVille(NB).Matin_Basse_mere_Niveau_Zéro = Val(Replace(A(1), ",", "."))
            Case 3: If A(0) <> "" Then TbVille(NB).Matin_Pleine_mere = CDate(Replace(A(0), "h", ":")): TbVille(NB).Matin_Pleine_mere_Niveau_Zéro = Val(Replace(A(1), ",", "."))
            Case 4: If A(0) <> "" Then TbVille(NB).Après_midi_Coeff = CStr(A(0))
            Case 5: If A(0) <> "" Then TbVille(NB).Après_midi_Basse_mere = CDate(Replace(A(0), "h", ":")): TbVille(NB).Après_midi_Basse_mere_Niveau_Zéro = Val(Replace(A(1), ",", "."))
            Case 6: If A(0) <> "" Then TbVille(NB).Après_midi_Pleine_mere = CDate(Replace(A(0), "h", ":")): TbVille(NB).Après_midi_Pleine_mere_Niveau_Zéro = Val(Replace(A(1), ",", "."))
           End Select
           Champ = Champ + 1
        Next
        
  Next

End Sub
Function RetournVille(Cn As Object) As String()
With Cn.Execute("Select * from[VILLES$]")
    If .EOF Then RetournVille = Array("")
    RetournVille = Split(.getstring, vbCr)
End With
End Function
'Sub RetorunVilleAprès(city As String, D As String, VS() As ville)
'Dim tideTable As Object, htmlDoc As Object
'  ' Récupérer le document HTML
'    Set htmlDoc = GetHTMLDocument("https://horaire-maree.fr/maree/" & city & "/")
'
'    ' Trouver la table de marées par ID
'    Set tideTable = htmlDoc.getElementById("i_donnesLongue").getElementsByTagName("table")(0)
'
'    ' Extraire les données de marées
'    Set tideData = ExtractTideData(tideTable)
'    For i = 1 To tideData.count
'        ReDim Preserve VS(i)
'
'        If TypeName(VS(i)) = "Nothing" Then Set VS(i) = New ville
'         VS(i).ville = city
'         VS(i).MyDate = Format((CDate(D) + i), "yyyy-mm-dd")
'
'        If Trim("" & tideData(i)(2)) <> "" Then VS(i).Matin_Coeff = tideData(i)(2)
'        If Trim("" & tideData(i)(3)) <> "" Then
'            VS(i).Matin_Basse_mere = Replace(Left(tideData(i)(3), 5), "h", ":")
'            VS(i).Matin_Basse_mere_Niveau_Zéro = Val(Replace(Split(tideData(i)(3), Left(tideData(i)(3), 5))(1), ",", "."))
'        End If
'        If Trim("" & tideData(i)(4)) <> "" Then
'            VS(i).Matin_Pleine_mere = Replace(Left(tideData(i)(4), 5), "h", ":")
'            VS(i).Matin_Basse_mere_Niveau_Zéro = Val(Replace(Split(tideData(i)(4), Left(tideData(i)(4), 5))(1), ",", "."))
'        End If
'        If Trim("" & tideData(i)(5)) <> "" Then VS(i).Après_midi_Coeff = tideData(i)(5)
'        If Trim("" & tideData(i)(6)) <> "" Then
'            VS(i).Après_midi_Basse_mere = Replace(Left(tideData(i)(6), 5), "h", ":")
'            VS(i).Après_midi_Basse_mere_Niveau_Zéro = Val(Replace(Split(tideData(i)(6), Left(tideData(i)(6), 5))(1), ",", "."))
'        End If
'        If Trim("" & tideData(i)(7)) <> "" Then
'            VS(i).Après_midi_Pleine_mere = Replace(Left(tideData(i)(7), 5), "h", ":")
'            VS(i).Après_midi_Pleine_mere_Niveau_Zéro = Val(Replace(Split(tideData(i)(7), Left(tideData(i)(7), 5))(1), ",", "."))
'        End If
'
'    Next
'
'End Sub
Sub RetorunVilleAprès(city As String, D As String, VS() As ville)
    Dim tideTable As Object, htmlDoc As Object, rows As Object
    Dim i As Integer
    ' Récupérer le document HTML
    Set htmlDoc = GetHTMLDocument("https://horaire-maree.fr/maree/" & city & "/")
    
    ' Trouver la table de marées par ID
    Set tideTable = htmlDoc.getElementById("i_donnesLongue").getElementsByTagName("table")(0)
    Set rows = tideTable.getElementsByTagName("tr")

    ' Boucle pour parcourir toutes les lignes de données (ignorer les premières lignes de titres)
    For i = 1 To rows.Length - 2
        ReDim Preserve VS(i) ' Utilisation de i directement
        If TypeName(VS(i)) = "Nothing" Then Set VS(i) = New ville
        
        ' Extraire les cellules de chaque ligne
        Dim cells As Object
        Set cells = rows(i + 1).getElementsByTagName("td") ' i+1 pour ignorer la première ligne de titres
        
        ' Assurez-vous que la ligne contient des données (c'est-à-dire qu'elle a le bon nombre de colonnes)
        If cells.Length = 7 Then
            VS(i).ville = city
            VS(i).MyDate = Format((CDate(D) + i), "yyyy-mm-dd")
            
            If Trim("" & cells(1).innerText) <> "" Then VS(i).Matin_Coeff = cells(1).innerText
            If Trim("" & cells(2).innerText) <> "" Then
                VS(i).Matin_Basse_mere = Replace(Left(cells(2).innerText, 5), "h", ":")
                VS(i).Matin_Basse_mere_Niveau_Zéro = Val(Replace(Split(cells(2).innerText, Left(cells(2).innerText, 5))(1), ",", "."))
            End If
            If Trim("" & cells(3).innerText) <> "" Then
                VS(i).Matin_Pleine_mere = Replace(Left(cells(3).innerText, 5), "h", ":")
                VS(i).Matin_Pleine_mere_Niveau_Zéro = Val(Replace(Split(cells(3).innerText, Left(cells(3).innerText, 5))(1), ",", "."))
            End If
            If Trim("" & cells(4).innerText) <> "" Then VS(i).Après_midi_Coeff = cells(4).innerText
            If Trim("" & cells(5).innerText) <> "" Then
                VS(i).Après_midi_Basse_mere = Replace(Left(cells(5).innerText, 5), "h", ":")
                VS(i).Après_midi_Basse_mere_Niveau_Zéro = Val(Replace(Split(cells(5).innerText, Left(cells(5).innerText, 5))(1), ",", "."))
            End If
            If Trim("" & cells(6).innerText) <> "" Then
                VS(i).Après_midi_Pleine_mere = Replace(Left(cells(6).innerText, 5), "h", ":")
                VS(i).Après_midi_Pleine_mere_Niveau_Zéro = Val(Replace(Split(cells(6).innerText, Left(cells(6).innerText, 5))(1), ",", "."))
            End If
        End If
    Next i
End Sub

Sub ProcessAndInsertTideData(conn As Object, VILLES() As ville)
    Dim v As Integer
    Dim sql As String
    Dim Rs As Object
    Dim item As Variant

    For v = 0 To UBound(VILLES)
        
        
        ' Construire la requête SQL de sélection
        sql = "SELECT * FROM [Marées$] WHERE [Date]=#" & VILLES(v).MyDate & "# AND [Ville]='" & Replace(VILLES(v).ville, "'", "''") & "'"

        ' Créer un objet Recordset
        Set Rs = CreateObject("ADODB.Recordset")
        Rs.Open sql, conn, 1, 3
 
        If Rs.EOF Then Rs.AddNew ' Insérer une nouvelle ligne si la date et la ville n'existent pas
            
           If VILLES(v).ville <> "" Then Rs.Fields("Ville").Value = VILLES(v).ville
           If VILLES(v).MyDate <> "" Then Rs.Fields("Date").Value = VILLES(v).MyDate
            
             Rs.Fields("Matin Coeff").Value = VILLES(v).Matin_Coeff
            
           If VILLES(v).Matin_Basse_mere <> "" Then Rs.Fields("Matin Basse mer").Value = VILLES(v).Matin_Basse_mere
          Rs.Fields("Matin Basse mer Niveau Zéro").Value = VILLES(v).Matin_Basse_mere_Niveau_Zéro
            
           If VILLES(v).Matin_Pleine_mere <> "" Then Rs.Fields("Matin Pleine mer").Value = VILLES(v).Matin_Pleine_mere
       Rs.Fields("Matin Pleine mer Niveau Zéro").Value = VILLES(v).Matin_Pleine_mere_Niveau_Zéro
            
            
        Rs.Fields("Après-midi Coeff").Value = VILLES(v).Après_midi_Coeff
            
           If VILLES(v).Après_midi_Basse_mere <> "" Then Rs.Fields("Après-midi Basse mer").Value = VILLES(v).Après_midi_Basse_mere
        Rs.Fields("Après-midi Basse mer Niveau Zéro").Value = VILLES(v).Après_midi_Basse_mere_Niveau_Zéro
            
          If VILLES(v).Après_midi_Pleine_mere <> "" Then Rs.Fields("Après-midi Pleine mer").Value = VILLES(v).Après_midi_Pleine_mere
         Rs.Fields("Après-midi Basse mer Niveau Zéro") = VILLES(v).Après_midi_Pleine_mere_Niveau_Zéro
            Rs.Update


    Next
End Sub
Function CheckURL(url As String, ville As String) As Boolean

    Dim http As Object
    Dim statusCode As Integer
    Dim responseText As String
    
    ' Créer un objet ServerXMLHTTP
    Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    
    ' Envoyer une requête GET
   On Error GoTo Fin
    http.Open "GET", url, False
    http.setRequestHeader "User-Agent", "Mozilla/5.0" ' Ajouter un User-Agent
    http.send
  
    
    ' Obtenir le code de statut HTTP
  
    
    ' Obtenir le texte de la réponse

    responseText = LCase(http.responseText)
    CheckURL = InStr(responseText, LCase(ville))
Fin:
Err.Clear
 On Error GoTo 0
End Function
Function CreateADODBConnection(workbookPath As String) As Object
    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & workbookPath & ";Extended Properties=""Excel 12.0;HDR=Yes"";"
    Set CreateADODBConnection = conn
End Function

Function GetHTMLDocument(url As String) As Object
    Dim http As Object
    Dim htmlDoc As Object

    ' Créer une nouvelle instance de MSXML2.XMLHTTP
    Set http = CreateObject("MSXML2.XMLHTTP")
    
    ' Envoyer une requête GET pour récupérer le contenu de la page
    http.Open "GET", url, False
    http.send
    
    ' Charger le contenu HTML dans un document
    Set htmlDoc = CreateObject("HTMLFile")
    htmlDoc.body.innerhtml = http.responseText
    
    Set GetHTMLDocument = htmlDoc
End Function


Function ExtractTideData(tideTable As Object) As Collection
    Dim rows As Object
    Dim row As Object
    Dim tideData As Collection
    Dim tideEntry As Collection
    Dim dateStr As String

    Set tideData = New Collection
    
    ' Parcourir chaque ligne de la table HTML
    Set rows = tideTable.getElementsByTagName("tr")
    For Each row In rows
        ' Obtenir la date à partir de la première cellule
        If row.getElementsByTagName("td").Length > 0 Then
            dateStr = row.getElementsByTagName("td")(0).innerText
            
            ' Vérifier si la date contient "août" (mois spécifié)
            If InStr(dateStr, "août") > 0 Then
                ' Créer une nouvelle entrée de marée
                Set tideEntry = New Collection
                tideEntry.Add Replace(dateStr, "Demain", "")
                tideEntry.Add row.getElementsByTagName("td")(1).innerText ' Matin Coeff
                tideEntry.Add row.getElementsByTagName("td")(2).innerText ' Matin Basse mer
                tideEntry.Add row.getElementsByTagName("td")(3).innerText ' Matin Pleine mer
                tideEntry.Add row.getElementsByTagName("td")(4).innerText ' Après-midi Coeff
                tideEntry.Add row.getElementsByTagName("td")(5).innerText ' Après-midi Basse mer
                tideEntry.Add row.getElementsByTagName("td")(6).innerText ' Après-midi Pleine mer
                tideData.Add tideEntry
            End If
        End If
    Next row
    
    Set ExtractTideData = tideData
End Function
 

Discussions similaires

Statistiques des forums

Discussions
315 105
Messages
2 116 260
Membres
112 704
dernier inscrit
zanda19