Blog over (financieel) bewust leven

Label: api

Valutakoersen automatisch bijwerken (2)

Vorig jaar juni schreef ik hoe ik in mijn beleggingsspreadsheet automatisch de valutakoersen bijwerk met behulp van een API. Dat werkt al ruim een jaar probleemloos. Maar afgelopen weekend kreeg ik een foutmelding toen ik mijn wekelijkse beleggingsrapportage verwerkte. Er was iets veranderd in de API.

Inmiddels moet je een abonnement nemen om de API te kunnen gebruiken. Voor kleine gebruikers zoals ik is dat gelukkig gratis. Ik heb me dus als gebruiker geregistreerd, want de functie is erg handig. Maar er zijn ook wijzigingen in de manier waarop je de API moet aanroepen. Daar moest ik dus mijn macro voor aanpassen.

Mijn functie heet GetExchangeRate. Als variabelen krijgt die mee een datum en een valuta-code. Daarmee haalt deze functie bij de API de valutakoers op van de gevraagde valuta op de gevraagde datum (in heden of verleden, uiteraard), tegen de standaard-valuta die ik in mijn spreadsheet heb ingesteld (in mijn geval de Euro). Onderstaand vind je de actuele code van deze macro:

Function GetExchangeRate(Datum As Date, toCurr As String) As Double

    Dim TempDate As String
    Dim qurl As String
    Dim TempOutcome As String
    Dim fromCurr As String
    
    TempDate = CStr(Format(Datum, "yyyy-MM-DD"))
    fromCurr = "EUR"
    qurl = "http://data.fixer.io/" & TempDate & "&access_key=jouweigenkey&base=" & fromCurr & "&symbols=" & toCurr
    
    TempOutcome = Left(Right(Application.WorksheetFunction.WebService(qurl), 10), 8)
    
    If Left(TempOutcome, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 7) & "0"
    End If
    
    If Mid(TempOutcome, 2, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 6) & "00"
    End If
    
    If Mid(TempOutcome, 3, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 5) & "000"
    End If
    
    If Mid(TempOutcome, 4, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 4) & "0000"
    End If
    
    If Mid(TempOutcome, 5, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 3) & "00000"
    End If
    
    If Mid(TempOutcome, 6, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 2) & "000000"
    End If
    
    If Mid(TempOutcome, 7, 1) = ":" Then
        TempOutcome = Right(TempOutcome, 1) & "0000000"
    End If
    
    GetExchangeRate = CDbl(TempOutcome / 1000000)
    
End Function

De bovenstaande wijzigingen zijn nog niet doorgevoerd in de versie die je op mijn Downloads-pagina kunt downloaden!

Heb jij wel eens te maken met aanpassingen in jouw spreadsheets?

Valutakoersen automatisch bijwerken

Update: In juni 2018 is de API aangepast. En mijn macro dus ook. De nieuwe versie vind je in dit bericht.

Geldnerd is eigenlijk heel lui. Maar werkt soms ook heel hard om die luiheid naar nieuwe hoogten te doen stijgen. Zo ook afgelopen week. Jullie kennen mijn voorliefde voor spreadsheets. Alles automatisch, met één druk op de knop. En daar ga ik steeds een stukje verder in.

Bij de eerste versie van mijn beleggingsspreadsheet moest ik elke transactie handmatig invoeren. Inmiddels experimenteer ik met een versie waarin ik gewoon de geldtransacties en beleggingstransacties importeer. Die kan ik downloaden bij mijn broker. De macro’s zijn nog niet 100% perfect, maar de meeste problemen zijn nu wel opgelost.

Daar zat nog wel één handmatig dingetje bij waar ik mij aan stoorde. Niet alle fondsen waar ik in handel zijn genoteerd in Euro’s. Er zijn er ook die in Amerikaanse dollars genoteerd zijn. Of nog in andere valuta. En omdat ik mijn beleggingen in Euro’s bijhoud, moest ik dan bij iedere transactie de actuele wisselkoers invullen. En die moest ik opzoeken. Gewoon, handmatig. Op een website zoals deze.

Tsja, en dat kan natuurlijk niet. Dat moet handiger. Automatisch. Het heeft me een uurtje of vier gekost, maar het is gelukt. Ik heb gezocht naar een website die via een API benaderbaar is. Een API is een Application Programmable Interface, oftewel een soort ‘stekkerdoos’ op een website die je door een ander programma (bijvoorbeeld mijn spreadsheet) kunt laten benaderen. Die zijn er verschillende. Maar ik zocht (uiteraard) naar een gratis en liefst open-source variant. Ik vond deze, fixer.io. Die verstrekt de gegevens in JSON format (JavaScript Object Notation), een relatief eenvoudige methode voor gegevensuitwisseling.

Dat is handig. Als je bijvoorbeeld de code

http://api.fixer.io/2017-05-12?symbols=USD

naar de website stuurt, krijg je de volgende respons:

{"base":"EUR","date":"2017-05-12","rates":{"USD":1.0876}}

In gewone mensentaal: op vrijdag 12 mei 2017 was de wisselkoers van € 1,00 in Amerikaanse dollars USD 1,0876. Ik heb eerst nog geprobeerd om die respons keurig in te lezen als JavaScript, maar dat werd me al gauw te ingewikkeld. Ik wil daar ook geen extra tooltjes of zo voor installeren, het moet gewoon werken in ‘standaard’ Excel. Dus heb ik besloten om het antwoord van de API gewoon als String in te lezen, en de koers eruit te ‘knippen’. In onderstaande code doe ik dat voor de duidelijkheid nog even in drie stappen, maar je kunt het ook in één stap doen.

Function GetExchangeRate(Datum As Date, toCurr As String) As Double

Dim TempDate As String
Dim qurl As String
Dim TempString As String
Dim TempString2 As String
Dim TempString3 As String

TempDate = CStr(Format(Datum, "yyyy-MM-DD"))
qurl = "http://api.fixer.io/" & TempDate & "?symbols=" & toCurr

TempString = Application.WorksheetFunction.WebService(qurl)
TempString2 = Right(TempString, 8)
TempString3 = Left(TempString2, 6)

GetExchangeRate = CDbl(TempString3 / 10000)

End Function

En dat werkt. Nu hoef ik niet meer handmatig naar valutakoersen te zoeken. Voor de “toCurr” kun je elke valuta gebruiken die Fixer accepteert. Mijn nerdhart is weer blij, ook al weet ik zelf ook wel dat ik uren heb besteed aan iets wat mij nog geen minuut per transactie kostte…

Heb jij nog mooie functies in elkaar geknutseld?

© 2020 Geldnerd.nl

Theme by Anders NorenUp ↑