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 :
    strUrl = "http://openexchangerates.org/api/latest.json?app_id=XYZ"
    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 :

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

  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").
{
"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...