Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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



ou au mieux ça




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: 18

jurassic pork

XLDnaute Occasionnel
Hello,
Voilà une solution en PowerQuery sans passer par une feuille.
1 - J'ai amélioré la requête de Staple1600 . Je vais chercher la ville à partir de la cellule nommée MaVille
2 - Quand il y a plusieurs codes postaux pour une même commune, je les mets tous sur une même ligne, séparés par une virgule.
Voici ma requête qui s'appelle Requête1 (connexion uniquement) :
PowerQuery:
let
    Ville = Excel.CurrentWorkbook(){[Name="MaVille"]}[Content]{0}[Column1],
    Source = Json.Document(Web.Contents("https://geo.api.gouv.fr/communes?nom=" & Ville)),
    #"Converti en table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Column1 développé" = Table.ExpandRecordColumn(#"Converti en table", "Column1", {"nom", "code", "codeDepartement", "siren", "codeEpci", "codeRegion", "codesPostaux", "population", "_score"}),
    #"Valeurs extraites" = Table.TransformColumns(#"Column1 développé", {"codesPostaux", each Text.Combine(List.Transform(_, Text.From), ","), type text})
in
    #"Valeurs extraites"
Attention il y a une option de sécurité à modifier (si un gourou de PQ peut me dire comment éviter d'avoir ce problème)

Je crée une connexion au Data Model avec la procédure Add_ConnectionDM(sReq, sName)
sReq
est le nom de la requête Origine et sName et le nom de la nouvelle connexion au DM :
voici la procédure :
VB:
Sub Add_ConnectionDM(sReq, sName)
Dim wb As Workbook
Dim wq As WorkbookQuery
Dim bExists As Boolean
Dim vbAnswer As VbMsgBoxResult
Dim vbDataModel As VbMsgBoxResult
    Set wb = ActiveWorkbook
        bExists = False
        For Each wq In wb.Queries
          If wq.Name = sName Then
            bExists = True
          End If
        Next wq
        ''Add to Data Model if it does not exist
        If bExists = False Then
            wb.Connections.Add2 Name:=sName, _
                                Description:="Connection to the '" & sReq & "' query in the workbook.", _
                                ConnectionString:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & sReq & ";Extended Properties=", _
                                CommandText:="" & sReq & "", _
                                lCmdtype:=6, _
                                CreateModelConnection:=True, _
                                ImportRelationships:=False
  
        End If
End Sub
et un exemple d'utilisation :
VB:
Sub TestAddConnectionDM()
     Add_ConnectionDM "Requête1", "CodeINSEE"
End Sub
Exemple pour supprimer une connexion créée :
VB:
Sub SupprimerConnexion()
ActiveWorkbook.Connections("codeINSEE").Delete
End Sub
Et voici un exemple pour lire les données du DM :
VB:
Sub GetPQResult(sName)
    Dim oConn As WorkbookConnection, oRS As Object ' Recordset
    Dim oCnn As Object, sTabName As String
    Set oConn = ThisWorkbook.Connections(sName)
    sTabName = oConn.ModelTables(1).Name
    Set oCnn = ThisWorkbook.Model.DataModelConnection.modelConnection.ADOConnection
    Set oRS = CreateObject("ADODB.RecordSet")
    oRS.Open "EVALUATE '" & sTabName & "'", oCnn
    Do While Not oRS.EOF
        Debug.Print "Ville: " & oRS.Fields(sTabName & "[nom]") & _
                    " - Code INSEE: " & oRS.Fields(sTabName & "[code]") & _
                    " - Dep: " & oRS.Fields(sTabName & "[codeDepartement]") & _
                    " - Cp: " & oRS.Fields(sTabName & "[codesPostaux]") & _
                    " - Pop: " & oRS.Fields(sTabName & "[population]")
        oRS.MoveNext
    Loop
End Sub


Sub TestGetPQResult()
  GetPQResult "codeINSEE"
End Sub

Voici le résultat avec MaVille qui est égale à Lille :

Si on change MaVille, il faut rafraîchir la requête Requête1 avant pour que le code de lecture la prenne en compte.
Le Data Model peut être visualisé avec Power Pivot (dans Excel complément à activer).

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

jcf6464

XLDnaute Impliqué
bonjour a vous tous et le forum

Très bon travail bravo,

Juste une info dans la phase des lunes il manque une lune nouvelle en décembre le 01/12 et le 30/12/2024 cette année nous avons 13 lunes nouvelles au lieux de 12,



bonne continuation jcf
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello,
Ok merci Jeannette.
J'ai fait des tests de performance en ce qui concerne la récupération des codes INSEE :
c'est au moins 3 fois plus rapide en utilisant la récupération directe que de passer par une requête PowerQuery. C'est le Refresh qui plombe le PowerQuery mais il est obligatoire car il faut aller chercher de nouvelles données si on change de ville.
D'autre part voici une amélioration pour RecupCodeInsee pour récupérer tous les codes postaux d'une commune plutôt que seulement le premier (ce qui n'est pas forcément nécessaire) :
VB:
Sub RecupCodeInsee(commune)
    Dim http As Object, res As Object, elem
    Const BaseURL = "https://geo.api.gouv.fr/communes?nom="
    Set http = CreateObject("MSXML2.XMLHTTP")
    UrL = BaseURL & commune
    On Error Resume Next
    With http
        .Open "GET", UrL, False
        .Send
        Set res = JsonConverter.ParseJSON(.responseText)
    End With
    For Each elem In res
       Forme.Lb_Result.AddItem elem("nom") & " -> Code INSEE: " & elem("code") & _
                               " - Dep: " & elem("codeDepartement") & _
                               " - Cp: " & JoinC(elem("codesPostaux"), ", ") & _
                               " - Pop: " & elem("population")
       If elem("codesPostaux").Count > 5 Then
          Forme.Lb_Result.ColumnWidths = Forme.Lb_Result.width + _
                   elem("codesPostaux").Count * 22
       End If
    Next
    Set http = Nothing
    Set res = Nothing
End Sub
Function JoinC(myCol, delimiter) As String
    Dim result  As Variant
    Dim cnt     As Long
    ReDim result(myCol.Count - 1)
    For cnt = 0 To myCol.Count - 1
        result(cnt) = CStr(myCol(cnt + 1))
    Next cnt
    JoinC = Join(result, delimiter)
End Function
Sub TestRecupCodeInsee()
    Forme.Show 0
    Forme.TB_Ville = "TestRecupCodeINSEE Paris"
    Forme.Lb_Result.Clear
    Forme.MultiPage1.Value = 2
    RecupCodeInsee "Paris"
End Sub
La fonction JoinC c'est la même chose que la fonction Join mais pour une collection car elem("CodesPostaux") est une collection.
Quand il y a plus de 5 codes postaux pour une commune (ex Paris, Lyon, Marseille qui ont des arrondissements), on ne voit pas l'ensemble de la ligne dans la ListBox.
Pour faire apparaître une barre de défilement horizontale il faut que l'ensemble des largeurs de colonnes soit supérieur à la largeur de la ListBox , d'où le code qui met une valeur de largeur de colonne supérieure à la largeur de la listBox quand il y a beaucoup de codes postaux.



Ami calmant, J.P
 

jcf6464

XLDnaute Impliqué
Bonjour à vous tous,

chez moi cela fonctionne,

Une remarque je prend la ville de Ger 64530 je tombe sur image 1 avec le code insee 64238 je tombe sur la bonne ville
j'ai rajouté sur le TB_Ville
VB:
Private Sub TB_Ville_Change()
Dim t As String
t = TB_Ville
If Left(t, 1) = " " Then t = Mid(t, 2)
TB_Ville = UCase(Left(t, 1)) & Mid(t, 2)
End Sub

Bonne continuation jcf
 

Pièces jointes

  • 2024-10-08.jpg
    131.8 KB · Affichages: 5
  • 2024-10-08-1.jpg
    122 KB · Affichages: 5

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Je rajouterai plutôt un truc comme ça:
et ou alors le code INSEE si plusieurs choix

VB:
Private Sub Lb_Result_Click()
    Dim selectedItem As String
    Dim firstWord As String
    Dim firstSpacePos As Integer
    selectedItem = Lb_Result.Value
    firstSpacePos = InStr(1, selectedItem, " ")
    If firstSpacePos > 0 Then
        firstWord = Left(selectedItem, firstSpacePos - 1)
    Else
        firstWord = selectedItem
    End If
    TB_Ville.Value = firstWord
End Sub

Dis moi ce que tu en dis
Nico
 

jcf6464

XLDnaute Impliqué
re

en sélectionnant dans la liste cela affiche bien la ville mais quand tu fait (prévision) nous retombons sur Gernio

Dans TB_Ville on saisi (Ge) cela donne tous les noms commençant par Ge je sélectionne Ger (64)64530
dans TB_Ville j'ai bien Ger je valide par (bouton prévision) et la mystère je tombe sur Gernio..

A+ bon appétit jcf
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD

Oui bizarre
J'ai pareil
 

jurassic pork

XLDnaute Occasionnel
C'est normal que cela fonctionne comme cela, prevision peut récupérer plusieurs réponses et alors il n'affiche que la première réponse qui n'est peut être pas la bonne. Il faut utiliser le code INSEE pour n'avoir qu'une seule commune en réponse et dans ce cas la prévision correspond bien à la commune
 
Dernière édition:

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Ou alors plutôt ça alors ?

VB:
Private Sub Lb_Result_Click()
    Dim selectedText As String
    Dim words() As String
    Dim fourthWord As String
    selectedText = Lb_Result.Value
    words = Split(selectedText, " ")
    If UBound(words) >= 4 Then
        fourthWord = words(4)
        TB_Ville = fourthWord
    End If
End Sub
 

jurassic pork

XLDnaute Occasionnel
En fait infoClimat (prévision) renvoie les communes qui commencent par le texte que l'on a mis ou avec le code postal que l'on a mis ou la commune avec le code INSEE que l'on a mis. Quand il y a plusieurs communes dans la liste, c'est la première qui est affichée.
CodeINSEE renvoie les communes qui contiennent le texte que l'on a mis.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…