1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
Public Type tMeteo
isErreur As Boolean 'vrai si erreur
Erreur As String 'texte de l'erreur
PaysCode As String 'retourne le code pays pour vérification
VilleId As Long 'Id de la ville
VilleNom As String 'retourne le nom de la ville(~) pour vérification
VilleLongitude As Double 'retourne la longitude de la commune
VilleLatitude As Double 'retourne la latitude de la commune
UpdateUTCDate As Date 'date de la dernière mise à jour
UpdateUTCHeure As Date 'heure de la dernière mise à jour
LeverSoleilUTCDate As Date 'date lever du soleil
LeverSoleilUTCHeure As Date 'heure lever du soleil
CoucherSoleilUTCDate As Date 'date coucher du soleil
CoucherSoleilUTCHeure As Date 'heure coucher du soleil
TemperatureActuelle As Single 'temperature en °C car units=metric
TemperatureActuelleMini As Single 'temperature actuelle mini
TemperatureActuelleMaxi As Single 'temperature actuelle maxi
Humidite As Byte 'taux d'humidité en %
Pression As Integer 'pression atmospherique
PressionUnite As String 'unité de pression
VentVitesse As Single 'vitesse du vent en m/s
VentName As String 'en anglais : Description de la force du vent
VentDirection As Integer '180 = sud - 360 = Nord
Nebulosite As Integer '% couverture nuageuse
NebulositeName As String 'en anglais : Nom de la couverture nuageuse
Visibilite As Long 'Visibilite en mètre
Precipitation As Integer 'précipitation en mm si le relevé existe...
PrecipitationName As String 'en anglais : no, rain, snow
MeteoName As String 'Nom de la météo en anglais
MeteoIcone As String 'Nom de l'icone correspondant
parse As String 'toutes les infos en texte
End Type
Public Function getMeteo(ByVal APIkey As String, _
Optional ByVal VilleNom As String, _
Optional ByVal CodePostal As String, _
Optional ByVal Longitude As Double = 999, _
Optional ByVal Latitude As Double = 99, _
Optional ByVal VilleId As Long = 0, _
Optional ByVal PaysCode As String = "Fr" _
) As tMeteo
'get météo - v1.0 - janv 2019
On Error GoTo Erreur
Const cBaseURL As String = "https://api.openweathermap.org/data/2.5/weather?"
Const cConfigURL As String = "&mode=xml&units=metric&APPID="
Dim oHttp As Object, oXml As Object, oNode As Object, URL As String, dt As Date
PaysCode = Trim$(PaysCode)
If Trim$(VilleNom) <> vbNullString Then
URL = cBaseURL & "q=" & Trim$(VilleNom): If PaysCode <> vbNullString Then URL = URL & "," & PaysCode
ElseIf Trim$(CodePostal) <> vbNullString Then
URL = cBaseURL & "zip=" & Trim$(CodePostal): If PaysCode <> vbNullString Then URL = URL & "," & PaysCode
ElseIf Abs(Longitude) <= 180# And Abs(Latitude) <= 90# Then
URL = cBaseURL & "lat=" & Trim$(Str(Latitude)) & "&lon=" & Trim$(Str(Longitude))
ElseIf VilleId > 0 Then
URL = cBaseURL & "id=" & VilleId
End If
If URL <> vbNullString And Trim$(APIkey) <> vbNullString Then
URL = URL & cConfigURL & Trim$(APIkey)
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "POST", URL, False
oHttp.send
If oHttp.Status = 200 Then
Set oXml = oHttp.responseXML
If oXml.parseError.errorCode = 0 Then
With getMeteo
Set oNode = oXml.selectSingleNode("//city")
.VilleId = Val(oNode.Attributes.getNamedItem("id").text)
.VilleNom = oNode.Attributes.getNamedItem("name").text
Set oNode = oXml.selectSingleNode("//city/coord")
.VilleLongitude = Val(oNode.Attributes.getNamedItem("lon").text)
.VilleLatitude = Val(oNode.Attributes.getNamedItem("lat").text)
Set oNode = oXml.selectSingleNode("//city/country")
.PaysCode = oNode.text
Set oNode = oXml.selectSingleNode("//city/sun")
dt = CDate(Replace(oNode.Attributes.getNamedItem("rise").text, "T", " "))
.LeverSoleilUTCDate = DateValue(dt)
.LeverSoleilUTCHeure = TimeValue(dt)
dt = CDate(Replace(oNode.Attributes.getNamedItem("set").text, "T", " "))
.CoucherSoleilUTCDate = DateValue(dt)
.CoucherSoleilUTCHeure = TimeValue(dt)
Set oNode = oXml.selectSingleNode("//temperature")
.TemperatureActuelle = Val(oNode.Attributes.getNamedItem("value").text)
.TemperatureActuelleMini = Val(oNode.Attributes.getNamedItem("min").text)
.TemperatureActuelleMaxi = Val(oNode.Attributes.getNamedItem("max").text)
Set oNode = oXml.selectSingleNode("//humidity")
.Humidite = Val(oNode.Attributes.getNamedItem("value").text)
Set oNode = oXml.selectSingleNode("//pressure")
.Pression = Val(oNode.Attributes.getNamedItem("value").text)
.PressionUnite = oNode.Attributes.getNamedItem("unit").text
Set oNode = oXml.selectSingleNode("//wind/speed")
.VentVitesse = Val(oNode.Attributes.getNamedItem("value").text)
.VentName = oNode.Attributes.getNamedItem("name").text
Set oNode = oXml.selectSingleNode("//wind/direction")
.VentDirection = Val(oNode.Attributes.getNamedItem("value").text)
Set oNode = oXml.selectSingleNode("//clouds")
.Nebulosite = Val(oNode.Attributes.getNamedItem("value").text)
.NebulositeName = oNode.Attributes.getNamedItem("name").text
Set oNode = oXml.selectSingleNode("//visibility")
.Visibilite = Val(oNode.Attributes.getNamedItem("value").text)
Set oNode = oXml.selectSingleNode("//precipitation")
If oNode.Attributes.length > 1 Then .Precipitation = Val(oNode.Attributes.getNamedItem("value").text)
.PrecipitationName = oNode.Attributes.getNamedItem("mode").text
Set oNode = oXml.selectSingleNode("//weather")
.MeteoName = oNode.Attributes.getNamedItem("value").text
.MeteoIcone = oNode.Attributes.getNamedItem("icon").text
Set oNode = oXml.selectSingleNode("//lastupdate")
dt = CDate(Replace(oNode.Attributes.getNamedItem("value").text, "T", " "))
.UpdateUTCDate = DateValue(dt)
.UpdateUTCHeure = TimeValue(dt)
.parse = "VilleId=" & .VilleId & " VilleNom=" & Replace(Trim$(.VilleNom), " ", "-") & " VilleLon=" & Trim$(Str(.VilleLongitude)) & _
" VilleLat=" & Trim$(Str(.VilleLatitude)) & " UpdateUTCDate=" & .UpdateUTCDate & _
" UpdateUTCHeure=" & .UpdateUTCHeure & " LeverSoleilUTCDate=" & .LeverSoleilUTCDate & _
" LeverSoleilUTCHeure=" & .LeverSoleilUTCHeure & " CoucherSoleilUTCDate=" & .CoucherSoleilUTCDate & _
" CoucherSoleilUTCHeure=" & .CoucherSoleilUTCHeure & " TemperatureActuelle=" & .TemperatureActuelle & _
" TemperatureActuelleMini=" & .TemperatureActuelleMini & " TemperatureActuelleMaxi=" & .TemperatureActuelleMaxi & _
" Humidite=" & .Humidite & " Pression=" & .Pression & " PressionUnite=" & .PressionUnite & _
" VentVitesse=" & .VentVitesse & " VentDirection=" & .VentDirection & " Nebulosite=" & .Nebulosite & _
" Visibilite=" & .Visibilite & " PrecipitationName=" & Replace(.PrecipitationName, " ", "-") & " MeteoName=" & Replace(.MeteoName, " ", "-")
End With
End If
Else
getMeteo.isErreur = True
getMeteo.Erreur = "oHttp.Status =" & oHttp.Status
End If
Else
getMeteo.isErreur = True
getMeteo.Erreur = "Paramètre(s) de la fonction non conforme(s)"
End If
Fin:
Set oNode = Nothing: Set oXml = Nothing: Set oHttp = Nothing
Exit Function
Erreur:
getMeteo.isErreur = True
getMeteo.Erreur = "Erreur n°" & Err.Number & " -> " & Err.Description
Resume Fin
End Function |
Partager