Utiliser un Web Service JSON – Episode 3
On continue la série sur l’utilisation d’un Web Service. L’objectif de départ était de récupérer la liste des devises et leur taux de change à partir du site Open Exchange Rates. Dans cinq minutes ce sera fait ! 🙂
Si vous avez manqué le début…
Les articles précédents ont permis de mettre en place la base de données Access pour pouvoir traiter les données JSON. Consultez-les, sinon ce qui suit ne fonctionnera pas ! 😉
Mise à jour
Les bonnes choses ont parfois une fin 😉 : depuis un certain temps, le service Open Exchange Rates n’est plus accessible directement. Ça veut déjà dire que le code de ce cette article vous affichera une erreur à l’exécution.
Le service est devenu payant, mais il reste possible de l’utiliser gratuitement, pour un nombre limité de requêtes, et dans le cadre d’un usage personnel. Cliquez sur ce lien pour vous inscrire aux options payantes ou pour l’option gratuite (voyez le lien Forever free sous les options payantes).
Pour adapter le code de ces articles au nouveau service, il suffit a priori de :
- Vous inscrire sur Open Exchange Rates pour obtenir un code d’application (
APP_ID
). - De remplacer le contenu de la variable
strUrl
du code Visual Basic par :
1strUrl = "http://openexchangerates.org/api/latest.json?app_id=XYZ"
en remplaçantXYZ
par votre code d’application.
La table des devises
Il nous faut une table pour stocker les devises. Celle-ci est plutôt simple :
- un code (de type Texte, taille 3 caractères),
- un taux (de type Numérique / Réel double).
Si vous modifiez les noms de table ou de champs, adaptez le code VBA qui suit, bien sûr…
Le code VBA
Dans le premier article, vous aviez créé une fonction LectureDevisesJSON()
, dans un module standard. Rouvrez ce module, et ajoutez la procédure suivante :
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 |
' --- ' IMPORTATION DE DEVISES AU FORMAT JSON ' --- ' Sub ImportationDevises() Dim strDevises As String Dim dctDevises As Scripting.Dictionary Dim varDevise As Variant Dim dblEuro As Double Dim dblTaux As Double Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset ' Lire les devises brutes strDevises = LectureDevisesJSON() If strDevises = "" Then MsgBox "Impossible de lire les devises !", vbExclamation Exit Sub End If ' Vider la table des devises CurrentDb.Execute "DELETE * FROM [tbl Devises];" ' Transformer les devises JSON en dictionnaire VBA Set dctDevises = JSON.parse(strDevises) ' Lire le taux de conversion de l'euro ' par rapport au dollar dblEuro = dctDevises.Item("rates").Item("EUR") ' Recordset pour accéder à la table Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset Set cnn = CurrentProject.Connection rst.Open "[tbl Devises]", cnn, adOpenDynamic, adLockOptimistic ' Parcourir toutes les devises ' et les stocker For Each varDevise In dctDevises.Item("rates").keys ' Taux de la devise par rapport au dollar dblTaux = dctDevises.Item("rates").Item(varDevise) ' On stocke ! rst.AddNew rst("Code Devise") = varDevise rst("Taux") = dblTaux / dblEuro rst.Update Next ' Fini ! rst.Close cnn.Close Set cnn = Nothing Set dctDevises = Nothing MsgBox "Opération terminée !", vbInformation End Sub |
Tester le code
Comme d’habitude, vous pouvez tester le code de cette manière :
- Faites apparaître la fenêtre Exécution (
CTRL
+G
). - Tapez ceci :
ImportationDevises
- Validez par
Entrée
. - Un message de confirmation s’affiche, vous pouvez consulter la table des devises !
Vous pouvez aussi, plus simplement, placer le curseur dans le bloc de code plus haut, et cliquer sur l’icône Exécuter Sub/UserForm. Si tout se passe bien, vous associerez cet appel à un bouton, par exemple.
Quelques compléments
- La fonction qui fait le travail de conversion est la fonction
parse()
du moduleJSON
. Vous lui passez une chaîne en entrée (les données JSON brutes), et elle fournit un objetDictionary
en sortie.Dictionary
est une classe fournie par la bibliothèque Microsoft Scripting Runtime, qui sert à stocker des paires clefs/valeurs. A chaque clef (Key
) est associée une valeur.C’est finalement assez logique, si vous vous rappelez que l’objet JSON lui-même est fait de paires clefs/valeurs. - Si vous analysez l’objet
Dictionary
dans l’Explorateur d’objets (toucheF2
), vous voyez qu’il propose des méthodes pour ajouter, compter, supprimer des éléments (Items
), chaque élément étant une paire clef/valeur. Une valeur peut être de nature quelconque, y compris un autre « sous-objet »Dictionary
. - L’objet
Dictionary
fournit également la liste de toutes ses clefs (Keys
), et la liste de toutes ses valeurs (Items
). - Si vous vous souvenez de la structure JSON de départ, on obtient donc la devise de base (le dollar), par
dctDevises.Item("base")
, puisque la clefbase
est au niveau supérieur. Le taux de l’euro, par contre, est obtenu par le dictionnaire de second niveau :dctDevises.Item("rates").Item("EUR")
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "timestamp":1340443716, "base":"USD", "rates": { "AED":3.6733, "AFN":48.299999, "ALL":110.040001, "AMD":418.540009, "ANG":1.79, "AOA":95.360001, "ARS":4.509, "EUR":0.79545, "USD":1, "ZMK":5210, "ZWL":322.355011 } } |
- Comme les taux sont fournis en dollar, on se servira du taux de l’euro pour ramener toutes les devises à ce taux. Il suffit de diviser le taux d’origine (en dollars) par le taux de l’euro.
- Enfin, pour stocker les données dans la table, on passe par un Recordset ADO. Je rappelle que vous avez coché la bibliothèque adéquate dans l’article précédent, parce que VB-JSON l’utilise également.
Il n’y a plus qu’à exploiter la table des devises dans votre projet, et à la mettre à jour de temps en temps, en appelant la procédure ImportationDevises
…
Bonjour , j’essaye d’adapter votre script sur un tableur excel , j’ai pratiquement terminé sauf que j’ai un problème :
‘ Transformer les devises JSON en dictionnaire VBA
Set dctDevises = JSON.parse(strDevises)
me renvoie une erreur de type, la méthode parse() renvoie un objet ce qui ne correspond pas au type scripting.dictonary
merci pour vôtre future réponse.
Est-ce que tous les réglages décrits dans les articles 1 et 2 de la série sont en place ?
Tresco > J’ai vérifié, le problème ne vient pas du code VBA, mais d’un changement de conditions sur Open Exchange Rates. J’ai ajouté un paragraphe « Mise à jour », dans cet article, pour expliquer les choses.
Bonjour ,
Non,pas des references manquantes,pas de bogs…,mais le message persis: »variable objet ou variable with non defini à la ligne de code suivant »
Tresco > Est-ce qu’il y a des références marquées « MANQUANT » dans le menu Outils / Références ?
Est-ce qu’il y a des erreurs signalées après un Débogage / Compiler ?
Bonjour hérve Inisan,
bien ,j’ai vérifiéla bibliotheque scripting runtime est coché
Tresco >
dctDevises
est une variable de typeScripting.Dictionary
. Est-ce que la bibliothèque Microsoft Scripting Runtime est cochée pour le projet (voir le deuxième article de la série) ?Bonjour en utilisant les codes ci-haut dans une application ,j’ai ce message erreur ci-après:variable objet ou variable with non defini à la ligne de code suivant:
dblEuro = dctDevises.Item(« rates »).Item(« EUR »).
pourriez m’aider à corriger cette erreur svp,
par Tresco
Vincent > A priori, une partie des infos fournies par Google Maps sont effectivement données au format JSON. Donc on devrait pouvoir les extraire (reste à vérifier l’accès à l’API depuis VBA). Une idée de tuto à creuser… 🙂
Bonjour Hervé,
Est ce possible d adapter cela sur gmap?
Via un itinéraire, avoir la possibilité de récupérer :
Le nombre de kilomètres
La durée du trajet
Est de stoker les valeurs dans des champs d une table?
Cela pourrait etre une idée de tuto?
Merci pour ce site fort utile en tout cas…
Les articles se font rares depuis un an que j ai decouvert mais sont d une excellente qualité, on ne peut pas tout avoir…