XL 2021 Récupérer info météo

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous et toutes,

En complément de mon "Calendrier, éphéméride, lunaison et marée V2.2", je pensais rajouter un module météo dans le style

Capture d’écran 2024-10-01 164305.jpg


ou au mieux ça


Capture d’écran 2024-10-01 164408.jpg


J'ai trouvé beaucoup de chose mais j'y arrive pas du tout
J'ai essayé sur ChatGPT mais ça me renvois systématiquement sur "api.openweathermap" qui demande une inscription obligatoirement pour avoir une clé d'enregistrement, mais pour moi ce n'est pas le but.

Je suis loin d'êtres un champion, très loin même, mais je n'arrive pas à trouver une solution satisfaisante à ce que je souhaite.
Je joint un fichier qui ne sert pas trop à grand chose, mais c'est loin d'être le résultat voulu, juste pour dire que j'ai quand même cherché ;) ;)

Si vous avez de meilleurs solutions, merci à vous tous.

Nicolas.
 

Pièces jointes

  • Météo.xlsm
    77.8 KB · Affichages: 22

jurassic pork

XLDnaute Occasionnel
Hello,
bon j'ai trouvé pourquoi le code de mon message précédent ne fonctionnait pas , c'est le sleep (pas kangourou) qui ne fonctionnait pas en utilisant ExecuteExcel4macro sachant que j'utilise un Excel 64 bits. Je suis revenu à la déclaration du Sleep par Api.
Voici la fonction qui va cherche la chaîne iframe html en fonction de la ville pour afficher les prévisions météo. A mettre dans un module standard.

VB:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Function InfosMeteo(ville) As String
 'Déclaration des variables
  Dim IE As New InternetExplorer
  Dim IEDoc As HTMLDocument, Elem As HTMLGenericElement, id
   IE.Navigate2 "https://www.infoclimat.fr/previsions-meteo/details/3013521/hennebont.html"
   IE.Top = 0
   IE.Height = 1
   IE.Visible = True
    Do Until IE.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents   ' tempo 50 ms
    Loop
    Set IEDoc = IE.Document
    IEDoc.querySelector("a[href=""#city""]").Click
    Sleep 1000: DoEvents
    IEDoc.querySelector("#city-name-autocomp").Value = ville
    IEDoc.querySelector("#city-name-autocomp").Focus
    'Sleep 50
    Application.SendKeys "{DOWN}"
    Sleep 1000
    Set Elem = IEDoc.querySelector("#ul-response-autocomp > li > a")
    Debug.Print Elem.innerText
    Debug.Print Elem.getAttribute("href")
    id = Split(Elem.getAttribute("href"), "/")(5)
    Debug.Print id
    'Sleep 50
    IE.Navigate "https://www.infoclimat.fr/api-previsions-meteo.html?id=" _
                & id & "&cntry=FR"
    Do Until IE.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents   ' tempo 50 ms
    Loop
    Set Elem = IEDoc.querySelector("textarea.better-inputs")
    InfosMeteo = Elem.innerText
    IE.Quit
End Function
Sub TestInfosMeteo()
Debug.Print InfosMeteo("Vannes")
End Sub
Voici ce que j'obtiens pour Vannes :
J'ai mis le contrôle activeX webBrower1 directement dans le formulaire Forme (pas dans une page) et j'ai rajouté une zone de texte pour rentrer la ville (cela pourra se faire par la ville rentrée à l'ouverture du classeur) et un bouton pour demander les prévisions. Une fois obtenue on pourra stocker la chaine iframe dans le classeur pour ne pas avoir à refaire le pilotage pour l'obtenir si on a toujours la même ville. A mettre dans le code du formulaire
Code:
Private Sub CommandButton1_Click()
   Me.WebBrowser1.Navigate2 "about:blank"
    Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents ' tempo 50 ms
    Loop
   Me.WebBrowser1.Document.Body.InnerHtml = InfosMeteo(Me.TB_Ville)
End Sub
Private Sub MultiPage1_Change()
If MultiPage1.SelectedItem.Name = "Page3" Then
  Me.WebBrowser1.Visible = True
Else
  Me.WebBrowser1.Visible = False
End If
End Sub
PrevMétéo.gif


Ami calmant, J.P
 
Dernière édition:

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Hello,
bon j'ai trouvé pourquoi le code de mon message précédent ne fonctionnait pas , c'est le sleep (pas kangourou) qui ne fonctionnait pas en utilisant ExecuteExcel4macro sachant que j'utilise un Excel 64 bits. Je suis revenu à la déclaration du Sleep par Api.
Voici la fonction qui va cherche la chaîne iframe html en fonction de la ville pour afficher les prévisions météo.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If

VB:
Function InfosMeteo(ville) As String
 'Déclaration des variables
  Dim IE As New InternetExplorer
  Dim IEDoc As HTMLDocument, Elem As HTMLGenericElement, id
   IE.Navigate2 "https://www.infoclimat.fr/previsions-meteo/details/3013521/hennebont.html"
   IE.Top = 0
   IE.Height = 1
   IE.Visible = True
    Do Until IE.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents   ' tempo 50 ms
    Loop
    Set IEDoc = IE.Document
    IEDoc.querySelector("a[href=""#city""]").Click
    Sleep 1000: DoEvents
    IEDoc.querySelector("#city-name-autocomp").Value = ville
    IEDoc.querySelector("#city-name-autocomp").Focus
    'Sleep 50
    Application.SendKeys "{DOWN}"
    Sleep 1000
    Set Elem = IEDoc.querySelector("#ul-response-autocomp > li > a")
    Debug.Print Elem.innerText
    Debug.Print Elem.getAttribute("href")
    id = Split(Elem.getAttribute("href"), "/")(5)
    Debug.Print id
    'Sleep 50
    IE.Navigate "https://www.infoclimat.fr/api-previsions-meteo.html?id=" _
                & id & "&cntry=FR"
    Do Until IE.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents   ' tempo 50 ms
    Loop
    Set Elem = IEDoc.querySelector("textarea.better-inputs")
    InfosMeteo = Elem.innerText
    IE.Quit
End Function
Sub TestInfosMeteo()
Debug.Print InfosMeteo("Vannes")
End Sub
Voici ce que j'obtiens pour Vannes :

J'ai mis le contrôle activeX webBrower1 directement dans le formulaire Forme (pas dans une page) et j'ai rajouté une zone de texte pour rentrer la ville (cela pourra se faire par la ville rentrée à l'ouverture du classeur) et un bouton pour demander les prévisions. Une fois obtenue on pourra stocker la chaine iframe dans le classeur pour ne pas avoir à refaire le pilotage pour l'obtenir si on a toujours la même ville.
Code:
Private Sub CommandButton1_Click()
   Me.WebBrowser1.Navigate2 "about:blank"
    Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE
        Sleep 50: DoEvents ' tempo 50 ms
    Loop
   Me.WebBrowser1.Document.Body.InnerHtml = InfosMeteo(Me.TB_Ville)
End Sub
Private Sub MultiPage1_Change()
If MultiPage1.SelectedItem.Name = "Page3" Then
  Me.WebBrowser1.Visible = True
Else
  Me.WebBrowser1.Visible = False
End If
End Sub
Regarde la pièce jointe 1204462

Ami calmant, J.P

Re,
je sais pas si y a un truc que j'ai mal fais mais chez moi ça match pas
 

Pièces jointes

  • Météo.xlsm
    94.3 KB · Affichages: 4

jurassic pork

XLDnaute Occasionnel
Bon , tu n'as pas trop suivi toutes mes directives et il y a beaucoup d'erreurs :
1 - le Sleep n'est pas déclaré et InfosMeteo n'est pas dans un module standard
2 - le contrôle activeX webBrowser est dans une page alors qu'il devait être directement dans le formulaire
3 - Dans le bouton de commande de la page principale on ouvre pas le formulaire
4 - etc ....
Le plus simple , je te mets en pièce jointe le classeur à peu près corrigé. A toi d'étudier tous les bouts de code.
Le fonctionnement Quand on clique sur le bouton de commande de la feuille 1 ,je prends la ville qui est en A2 , j'ouvre le formulaire en mode non modal et je vais chercher le code html de la ville , je met ce code dans le webBrower du formulaire.
Ami calmant, J.P
 

Pièces jointes

  • MétéoJP.xlsm
    87.6 KB · Affichages: 6

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bon , tu n'as pas trop suivi toutes mes directives et il y a beaucoup d'erreurs :
1 - le Sleep n'est pas déclaré et InfosMeteo n'est pas dans un module standard
2 - le contrôle activeX webBrowser est dans une page alors qu'il devait être directement dans le formulaire
3 - Dans le bouton de commande de la page principale on ouvre pas le formulaire
4 - etc ....
Le plus simple , je te mets en pièce jointe le classeur à peu près corrigé. A toi d'étudier tous les bouts de code.
Le fonctionnement Quand on clique sur le bouton de commande de la feuille 1 ,je prends la ville qui est en A2 , j'ouvre le formulaire en mode non modal et je vais chercher le code html de la ville , je met ce code dans le webBrower du formulaire.
Ami calmant, J.P

Merci de ton retour,
Je te rejoint le fichier original à adapter, j'arrive pas à adapter.
Quand on clic sur l'onglet "Météo" du Multipage, c'est à ce moment là que les infos météo s'affiche sur la ville de la feuille "MaPosition" en "B2" et ou modifiable (la ville) par rapport au textbox situé dans l'onglet du Multipage "Météo" du userform.
J'espère être assez clair sur cette demande
Merci
Nico
 

Pièces jointes

  • Calendrier Ephéméride Marée V2.4 dernière modif.xlsm
    407.6 KB · Affichages: 2

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Ce n'est pas clair du tout ce que tu veux exactement. Je met en pièce jointe ta version 2.2 où j'avais ajouté un onglet météo dans le formulaire Forme.
Merci,
désolé de pas être assez précis, ce que je disais, quand tu clic sur l'onglet météo, ça te donne la météo de la ville en feuille "MaPosition" en "B2" (ville enregistrée au début)
Et le textbox en plus c'est très bien .
 

jurassic pork

XLDnaute Occasionnel
Hello,
voici une version améliorée du classeur du message #36
1 - Affichage de tous les résultats de la recherche dans une ListBox. C'est le premier résultat qui est pris en compte pour aller chercher les prévisions.
2 - Gestion des erreurs dans InfosMeteo en particulier quand il n'y a pas de résultat
3 - Amélioration de l'affichage du formulaire Forme au démarrage -> le Show n'est effectué qu'à la fin de l'Initialize.
Il est à noter que le moyen le plus sûr de tomber sur la commune qu'on recherche c'est de taper son code INSEE (un seul code par commune). Par exemple pour Hennebont c'est 56083
Voici un exemple où il y a plusieurs résultats ( Vannes) :
Vannes1.jpg


Ce n'est pas le Vannes du Morbihan qui a été sélectionné. Alors on tape le code postal ou le code INSEE
et cette fois-ci on a le bon Vannes (le code INSEE est le plus sûr car lui normalement il ne renvoie qu'un seul résultat).
Vannes2.jpg


Ami calmant, J.P
 

Pièces jointes

  • Calendrier Ephéméride Marée V2.2.1 JP.xlsm
    390.3 KB · Affichages: 6

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Hello,
voici une version améliorée du classeur du message #36
1 - Affichage de tous les résultats de la recherche dans une ListBox. C'est le premier résultat qui est pris en compte pour aller chercher les prévisions.
2 - Gestion des erreurs dans InfosMeteo en particulier quand il n'y a pas de résultat
3 - Amélioration de l'affichage du formulaire Forme au démarrage -> le Show n'est effectué qu'à la fin de l'Initialize.
Il est à noter que le moyen le plus sûr de tomber sur la commune qu'on recherche c'est de taper son code INSEE (un seul code par commune). Par exemple pour Hennebont c'est 56083
Voici un exemple où il y a plusieurs résultats ( Vannes) :
Regarde la pièce jointe 1204491

Ce n'est pas le Vannes du Morbihan qui a été sélectionné. Alors on tape le code postal ou le code INSEE
et cette fois-ci on a le bon Vannes (le code INSEE est le plus sûr car lui normalement il ne renvoie qu'un seul résultat).
Regarde la pièce jointe 1204493

Ami calmant, J.P

Bonjour l'ami,
Merci je regarderai en rentrant ce soir, ça à l'air bien
Merci encore
Nico
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
juste en passant
demo1.gif

pourquoi navigate2?

je suis sur 2013 32 bits et mon internet explorer n'a pas été supprimé je n'ai donc pas de souci avec lui
ni avec un webbrowser d'ailleurs

le application.sendkeys grille le pavé numérique
et ne tape pas forcement dans la bonne fenêtre puisque c'est de l'application qu'il est envoyé

CreateObject("wscript.shell").SendKeys "{DOWN}"
bref en essayant sans le userform on voit bien que le send keys de l'application ne descent pas dans le LI
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello patricktoulon
le but du jeu c'est de fournir à Nicolas de quoi afficher des prévisions météo. Il n' y a pas de soucis pour améliorer mon code qui a été fait vite fait sans test sur d'autres machines que la mienne, alors si il y a des bugs ou des choses pas très bien , les indiquer et fournir une correction si possible.

ami calmant, Phipic
 

patricktoulon

XLDnaute Barbatruc
re
voila comment j'affiche la page web
deja j'ajoute le cdp en argument
par exemple pour toulon il y en a un petit paquet

il me reste a développer la table d'en bas par rapport au jours quand tu clique dessus
OU !! tout simplement laisser l'utilisateur faire
reste plus qu'a mettre ça dans un webbrowser
testé dans un module standard
je travaille en late binding pour les object IE
VB:
Option Explicit
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If

Sub test()
    InfosMeteo "toulon", (83)
End Sub
Function InfosMeteo(ville, cdp) As String
    'Déclaration des variables
    Dim IE As Object, IEDoc As Object, elem, id, p As Object, liste As Object, Ref As Object, TabL As Object
   
   
    Set IE = CreateObject("internetexplorer.application")
    'Forme.Lb_Result.Clear

    IE.Navigate "https://www.infoclimat.fr/previsions-meteo/details/3013521/hennebont.html"
    IE.Top = 0
    IE.Visible = True

    Do While IE.ReadyState < 4: DoEvents: Loop
    Set IEDoc = IE.Document
    Do While IEDoc < 3: DoEvents: Loop


    Set Ref = IEDoc.querySelector("a[href=""#city""]")
    Ref.Focus 'donne le focus pour mistifier et simuler l'action humaine
    Ref.Click

    Set p = IEDoc.querySelector("#city-name-autocomp")
    p.Focus 'donne le focus pour mistifier et simuler l'action humaine
    CreateObject("wscript.shell").SendKeys ville 'on tape la ville
    Sleep 500 'on laisse un peu de temps pour que la liste se crée
    CreateObject("wscript.shell").SendKeys "{DOWN}" 'on developpe la UL/LI liste
    Sleep 500 'on laisse un peu de temps
    Set liste = IEDoc.getelementbyid("ul-response-autocomp") 'on la shoppe en tant qu'object html

    For Each elem In liste.all 'on liste tout les LI/a
        If LCase(elem.tagname) = "a" Then
            'tout les items /A  auront la ville   mais il ont le cdp  qui diffère
            'il nous reste plus qu'a trouver le bon cdp
            If InStr(1, LCase(elem.innertext), cdp) Then elem.Click: Exit For
        End If
    Next

   
'-------------------------------
'  partie non opérationnelle
  ' developpons la table  de samedi 05 par exemple
    '"details-day-previ
    Sleep 2000

    Set TabL = IEDoc.getelementbyid("slider-previ-inner") 'on le shoppe en tant qu'object html par son ID
    For Each elem In TabL.all
        If elem.tagname = "LI" Then
           
            'pour tester
           ' MsgBox LCase(Elem.Children(0).Children(0).innertext) & vbCrLf & _
            Format(CDate("05/10/2024"), "dddd dd")
           
            If LCase(elem.Children(0).Children(0).innertext) = Format(CDate("05/10/2024"), "dddd dd") Then
                elem.Children(0).Children(0).Click 'ne fonctionne pas
                   End If
        End If
    Next
'-------------------------------

End Function
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

J'ai voulu intégrer dans mon dernier classeur, mais il ne ce passe rien du tout, je pense pourtant avoir tout bien intégré.

Sinon même soucis que Patrick pour le pavé numérique qui se désactive.

Merci
Nico
 

Pièces jointes

  • Calendrier Ephéméride Marée V2.4 dernière modif.xlsm
    411.3 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re
de toute facon perso j'avance a taton ton fichier me plante de partout
je ne peux que donner des idées de code
je ne pourrais jamais tester ton fichier dans son ensemble, trop de bug à corriger
et j'ai apparemment une listbox qui c'est fait la malle " Forme.Lb_Result" inexistante chez moi
je ne sais même pas ou elle est sensée être dans le userform

bon courage
 

jurassic pork

XLDnaute Occasionnel
Nicolas, j'ai corrigé ton classeur (en pièce jointe). Tu avais encore mis le WebBrowser dans une page. Tu avais aussi laissé un Forme.show au debut du Initialize du formulaire et d'autres petites erreurs. Pour patricktoulon et pour enlever le souci avec le pavé numérique j'ai supprimé le sendKeys que j'ai remplacé par :
VB:
Set eventObj = IE.Document.createEvent("KeyboardEvent")
eventObj.keyCode = 40 ' DOWN
eventObj.initEvent "keydown", True, False
IE.Document.querySelector("#city-name-autocomp").dispatchEvent eventObj
Attention au dispatchEvent si vieille version d'I.E
Forme.Lb_Result est dans la page Météo du formulaire.
Le formulaire se lance en cliquant sur un jour dans la feuille Calendrier.
Je ne sais pas ce qu'a fait exactement Nicolas mais quand je lance le formulaire dans l'Editeur VBA j'ai un message d'avertissement.
 

Pièces jointes

  • Calendrier Ephéméride Marée V2.4 JP.xlsm
    452.9 KB · Affichages: 5
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 711
Messages
2 112 125
Membres
111 430
dernier inscrit
rebmania67