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 ! 🙂

vbjson_devises.jpg

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 :

  1. Vous inscrire sur Open Exchange Rates pour obtenir un code d’application (APP_ID).
  2. De remplacer le contenu de la variable strUrl du code Visual Basic par :

    en remplaçant XYZ 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).

vbjson_table_devises.jpg

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 :

Tester le code

Comme d’habitude, vous pouvez tester le code de cette manière :

  1. Faites apparaître la fenêtre Exécution (CTRL + G).
  2. Tapez ceci :
    ImportationDevises
  3. Validez par Entrée.
  4. Un message de confirmation s’affiche, vous pouvez consulter la table des devises !
    vbjson_devises.jpg

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 module JSON. Vous lui passez une chaîne en entrée (les données JSON brutes), et elle fournit un objet Dictionary 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 (touche F2), 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.scripting_dictionary.jpg
  • 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 clef base 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").

  • 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

Vous aimerez aussi...

10 réponses

  1. Perrai dit :

    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.

  2. Hervé Inisan dit :

    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.

  3. Tresco dit :

    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 »

  4. Hervé Inisan dit :

    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 ?

  5. Tresco dit :

    Bonjour hérve Inisan,
    bien ,j’ai vérifiéla bibliotheque scripting runtime est coché

  6. Hervé Inisan dit :

    Tresco > dctDevises est une variable de type Scripting.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) ?

  7. Tresco dit :

    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

  8. Hervé Inisan dit :

    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… 🙂

  9. Vincent dit :

    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…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *