XL 2016 Récupérer les taux de change depuis OAndaFX

excelentille

XLDnaute Nouveau
Bonjour !

J'essaie de mettre en oeuvre une fonction glanée sur un forum, censée faire très précisément ce que je cherche.
Il s'agit d'une fonction qui vise à récupérer un taux de change depuis une plateforme en ligne, en fonction d'une date donnée.

Elle fait appel, entre autre, à la création d'objets, et la récupération de données depuis le web.

Je ne dispose pas davantage d'infos sur sa mise en oeuvre, et ne suis pas familier de ce genre de macros.
Puisqu'il est question d'objets, j'ai créé la fonction ci-dessous dans un module de classe (j'ai cru comprendre que c'était nécessaire lorsqu'on fait appel à des objects) :

VB:
'DESCRIPTION: Get FX rates from OAndaFX based on a date
'SOURCE: https://www.reddit.com/r/excel/comments/4onnkq/exchange_rates_from_a_certain_date_automatically/

Function GetOandaFX(fromCurr As String, toCurr As String, AsofDate As Date) As String
Dim oHttp As Object
Dim sURL As String
Dim HTMLdoc As Object
Dim TDelements As Object
Dim TDelement As Object

' Create an XMLHTTP object
Set oHttp = CreateObject("MSXML2.XMLHTTP")
       
' get the URL to open
 sURL = "https://www.oanda.com/currency/table?" _
    & "date=" & AsofDate _
    & "date_fmt=us" _
    & "&exch=" & fromCurr _
    & "&sel_list=" & toCurr _
    & "&value=1&format=HTML&redirected=1"
 
' open connection and get website html
oHttp.Open "GET", sURL, False
oHttp.send

Set HTMLdoc = CreateObject("htmlfile")

With HTMLdoc
    If oHttp.readyState = 4 And oHttp.Status = 200 Then 'readystate checks loading, status checks the validity of URL

'    ' assign the returned text to a HTML document
    .body.innerHTML = oHttp.responseText
     
    Set TDelements = .getElementsByTagName("TD")
    'Loop within Table elements
    For Each TDelement In TDelements
        If RateFound = True Then
            GetOandaFX = TDelement.innerText
            Exit For
        End If
        If TDelement.innerText = toCurr Then RateFound = True
    Next
    End If
End With

Set oHttp = Nothing

End Function

Puis, je l'appelle depuis le bloc d'instructions suivant, dans ThisWorkbook :

VB:
Sub GetChangeRates()

Dim fromCurrency As String
Dim toCurrency As String
Dim dateBill As Date

' Variables fixées, pour simplifier le test
fromCurrency = "EUR"
toCurrency = "USD"
dateBill = "1/1/2016"

' N2, la cellule où je souhaite récupérer le taux de change EUR/USD du 1/1/2016
Range("N2").Select
Exchange = Classe1.GetOandaFX(fromCurrency, toCurrency, dateBill)
ActiveCell.Value = Exchange

End Sub

Bref... Je ne sais pas si mon "agencement" est le bon, mais le fait est qu'à l'exécution de la macro, j'obtiens un cinglant "/!\ Objet requis", sans code d'erreur.

Un petit coup de main serait le bienvenu !

Merci :)
 
Solution
re
je n'ai pas dis que ça n'etait pas possible
mais ta requête doit être faite différemment et pas sur l'url de la page mais celui que va chercher quand tu selectionne un item de la list
donc en ce qui concerne USD/EUR

un truc vite fait a améliorer
debrouille toi pour splitter le text et récupérer ta donnée
voilà comment cela doit être fait
VB:
' patricktoulon
Function GetOandaFX(From, tocurrency, dat) As String
Dim oHttp As Object
Dim sURL As String
dat1 = Format(dat, "yyyy-m-d")
dat2 = Format(dat + 1, "yyyy-m-d")
' Create an XMLHTTP object
Set oHttp = CreateObject("MSXML2.XMLHTTP")
     
URL = "https://www.oanda.com/fx-for-business/historical-rates/api/data/update/?&source=OANDA&adjustment=0&base_currency=USD&start_date=" & dat1...

Dranreb

XLDnaute Barbatruc
Bonjour.
Les modules de classe ne s'utilisent pas comme ça, car la structure des données qu'ils manipulent n'est qu'un squelette dépourvu de zones de mémoire correspondantes allouées. Ce avec quoi il faut travailler c'est un exemplaire préalablement créé de ce type d'objet. Le nom du module de classe est en même temps le nom de type.
Déclaration: Dim MonTruc As Classe1.
Création d'un exemplaire: Set MonTruc = New Classe1.
Après seulement vous pourrez invoquer MonTruc.GetDansFX.
 

patricktoulon

XLDnaute Barbatruc
Bonjour
c'est même pire
ou tu a vu dans la page un tag element "Table" dans la page ?????????????
je ne vois que des input type text et des list par les balise ul et li
1625653132564.png

si tu nous disais ce que tu veux récupérer on irait plus vite ;)
attention regarde le règlement dans les paramètres du site pour savoir si il autorise l’extraction par robots(vba ou autre )

bon si il développe une api c'est qu'il le veulent bien mais bon c'est juste pour savoir si au moins avant de faire ta demande tu avais vérifié
 

patricktoulon

XLDnaute Barbatruc
d'autant plus qu'il y a redirection il te sera donc impossible de gérer ça dans un htmldocument virtuel
il te faut reproduire la requete comme si c'est toi qui avais choisi "USD" dans la page
et le retour c'est un json
1625654959881.png


donc ta requête avec l'object xmlhttp sur l'url de la page tu peux oublier ;)
j'ai tout dis
si tu sait faire tu n'aura aucun problème a la reproduire
pour info tu a les retour de "EUR" sur les x dernière variations
démonstration
demo7.gif
 

excelentille

XLDnaute Nouveau
Merci pour vos retours, ravi de voir que le sujet vous intéresse :)
si tu nous disais ce que tu veux récupérer on irait plus vite ;)
Comme expliqué plus haut, trop succintement sûrement, je cherche à obtenir un taux de change en fonction d'une date donnée.
Concrètement, j'ai une liste d'une vingtaine de factures, contenant notamment une date de facturation.
J'aimerais récupérer, pour chacune d'entre elles, le taux de change EUR/USD correspondant à la date de chaque ligne, en colonne N.

ou tu a vu dans la page un tag element "Table" dans la page ?????????????
J'ai repris cette macro, et elle date visiblement un peu. Il semble en effet que la structure de la page ait changé depuis.

attention regarde le règlement dans les paramètres du site pour savoir si il autorise l’extraction par robots(vba ou autre )
Je compte faire une vingtaine de requêtes, une fois tous les deux mois. J'ose espérer qu'on ne va pas me traîner en justice pour ça...

bon si il développe une api c'est qu'il le veulent bien mais bon c'est juste pour savoir si au moins avant de faire ta demande tu avais vérifié

Effectivement, il existe une API, mais le free plan est limité à 30 jours/1000 requêtes. Les plans payants ne sont pas adaptés : sans vouloir faire la pince, pour ce que j'ai à faire, à 400$ le mois, je vais aller voir ailleurs 😅

Bref, tous ces points montrent que je suis sur une mauvais piste avec ce script.
C'est pas bien grave, mais je vais donc devoir trouver un autre solution.

Pourquoi tu n'utilises pas l'import de données depuis Web ?
Car je ne sais pas faire. Mais je suis pas fermé !

En fait, j'ai cherché une solution macro VBA car j'en utilise déjà pour réaliser d'autres opérations sur le même fichier. J'aimais bien l'idée de tout avoir dans une macro - ça m'évitait de multiplier les dépendances pour réaliser mes différentes opérations. Mais j'avoue que je ne suis pas du tout au fait des solutions qui s'offrent à moi pour récupérer et exploiter des données externes. Reste que je serais ravi d'apprendre à le faire !

sinon il y a aussi KUTOOLS pour excel à installer
Je ne connaissais pas KUTOOLS, mais je vais regarder ça, merci ;)

Tant que c'est gratuit (vu le volume...) et que j'accède à des taux de change réalistes, avec de l'historique, jour, ça me convient.

Il semble que ce service fasse le job : Il y a une API, gratuite pour un nombre de requêtes restreint, et un historique des taux.

Je vais regarder KUTOOLS, et si je peux exploiter exchangerateapi via l'import de données web.
 

patricktoulon

XLDnaute Barbatruc
re
je n'ai pas dis que ça n'etait pas possible
mais ta requête doit être faite différemment et pas sur l'url de la page mais celui que va chercher quand tu selectionne un item de la list
donc en ce qui concerne USD/EUR

un truc vite fait a améliorer
debrouille toi pour splitter le text et récupérer ta donnée
voilà comment cela doit être fait
VB:
' patricktoulon
Function GetOandaFX(From, tocurrency, dat) As String
Dim oHttp As Object
Dim sURL As String
dat1 = Format(dat, "yyyy-m-d")
dat2 = Format(dat + 1, "yyyy-m-d")
' Create an XMLHTTP object
Set oHttp = CreateObject("MSXML2.XMLHTTP")
     
URL = "https://www.oanda.com/fx-for-business/historical-rates/api/data/update/?&source=OANDA&adjustment=0&base_currency=USD&start_date=" & dat1 & "&end_date=" & dat2 & "&period=daily&price=bid&view=graph&quote_currency_0=" & tocurrency & "&quote_currency_1=&quote_currency_2=&quote_currency_3=&quote_currency_4=&quote_currency_5=&quote_currency_6=&quote_currency_7=&quote_currency_8=&quote_currency_9="
Debug.Print URL
oHttp.Open "get", URL, False
oHttp.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
oHttp.setRequestHeader "Referer", "https://www.oanda.com/lang/fr/fx-for-business/historical-rates?date=" & dat & "date_fmt=us&exch=" & tocurrency & "&sel_list=" & From & "&value=1&format=HTML&redirected=1"
oHttp.setRequestHeader "Accept-Language", "fr-FR"
oHttp.setRequestHeader "Accept-Encoding", "gzip, deflate"
oHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
oHttp.setRequestHeader "Host", "www.oanda.com"
oHttp.setRequestHeader "DNT", "1"
oHttp.setRequestHeader "Connection", "Keep - Alive"
oHttp.setRequestHeader "Cache-Control", "no-cache"
oHttp.send
GetOandaFX = oHttp.responsetext
Set oHttp = Nothing

End Function

Sub GetChangeRates()

Dim fromCurrency As String
Dim tocurrency As String
Dim dateBill

' Variables fixées, pour simplifier le test
dateBill = CDate("06/07/2021")
fromCurrency = "USD"
tocurrency = "EUR"
 MsgBox GetOandaFX(fromCurrency, tocurrency, dateBill)
'te reste plus qu'a splitter le text  pour récupérer la donnée que tu veux

End Sub
c'est pas compliqué 🤣 🤣 🤣
demo7.gif
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 330
Membres
102 862
dernier inscrit
Emma35400