• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

KNMI-Uurgegevens ophalen via HTTP "POST"-request en importeren in Excel-werkblad

Status
Niet open voor verdere reacties.

lyric1

Nieuwe gebruiker
Lid geworden
9 jun 2022
Berichten
1
Hallo,

Het KNMI stelt via haar website datasets van het Nederlandse klimaat beschikbaar.
Deze datasets bestaan uit metingen van verschillende weerstations in Nederland, het betreft zaken zoals: droge-bol temperatuur, dauwpunttemperatuur, relatieve vochtigheid etc.
De betreffende metingen worden per dag en per uur beschikbaar gesteld, in periodes van maximaal 10 jaar. Dergelijke dataset bestaat uit maximaal 87.600 rijen en 25 kolommen.
De huidige periode (2021 tot en met het heden, eindjaar 2030) bestaat uit ongeveer 12.500 rijen (8760 van 2021 plus de uren van 2022 tot nu toe).

Wat ik graag zou willen realiseren is de mogelijkheid om één specifiek klimaatjaar uit de grotere datasets te halen. Bijvoorbeeld klimaatjaar 2013 uit dataset 2011 - 2020.
Tot dusver heb ik een aantal methoden geprobeerd: eerst via een 'COUNTER'-kolom die van 1 tot en met 8760 telt, met daarnaast een kolom met datums en uren waarvan deze overeenkomen met die van de dataset.
Met een IF-statement controleert Excel of de betreffende datum binnen 1 en 8760 valt, waarna deze de gewenste waarde uit de bron kolommen (T, TD en U) kopieert.

Bovenstaande geeft echter niet de mogelijkheid om één specifiek jaar uit een grotere dataset te halen. Hiervoor heb ik een soortgelijke constructie gemaakt, maar dan met verticaal zoeken.
Echter lijkt het erop dat deze methode niet geschikt is voor een dergelijk grote dataset. Verticaal zoeken komt in 3 kolommen voor, maximaal 87.600 rijen, al bij het compleet maken van de eerste kolom wordt Excel onbruikbaar en onstabiel.

Nu zie ik op deze pagina: KNMI - Data ophalen vanuit een script dat men via een HTTP "POST"-request specifieke data via een URL van het KNMI kan opvragen.
Inputparameters zijn bv.: weerstation, periode, gewenste variabelen etc.

Bovenstaande lijkt een stuk efficiënter, aangezien alleen de gewenste data wordt opgehaald. Daarnaast zou de data direct naar de juiste kolom geschreven kunnen worden, waardoor de data dus ook niet dubbel voorkomt.

Ik ben een leek wanneer het aankomt op VBA en de bijbehorende syntax, via DrGoogle ben ik op het volgende uitgekomen:

1.PNG

Bovenstaande code geeft het volgende:

8Dj9i 6cuGyasAAAAASUVORK5CYII=

2.PNG

In de basis werkt het ophalen van de gegevens naar de VBA Debugger, echter wil ik deze gegevens natuurlijk graag in een Excel-werkblad importeren. Hier laat mijn kennis van VBA en bijbehorende syntax in de steek.

Grofweg heb ik het volgende in gedachte: als de kolommen tijdens het ophalen gesplitst kunnen worden, en er voor elke kolom een variabele aangemaakt wordt (zoals hierboven 'replyTXT'), zouden deze waarden naar een specifieke kolom (Range) geschreven kunnen worden. Voor de inputparameters in de rij 'objHTTP.Send' kunnen ook variabelen aangemaakt worden, deze kunnen gekoppeld worden aan een gebruikersinput in een van de Excel-werkbladen.

Zo worden alleen de gewenste gegevens opgehaald en tevens direct naar de juiste kolommen geschreven.

Heeft hier iemand toevallig ervaring met bovenstaande?

Alle tips, tricks en feedback is welkom!

Bij voorbaat dank,

Gegroet
 
Plaats het Excel document dat je al hebt met de VBA code hier eens.
 
Probeer deze eens te runnen. Output wordt in kolom A t/m F gezet

Code:
Sub jec()
 Dim ar, sp, it, strResp
 Dim i As Long, j As Long, y As Long, x As Long
 
 With CreateObject("msxml2.serverxmlhttp")
   .Open "POST", "https://www.daggegevens.knmi.nl/klimatologie/uurgegevens"
   .setrequestheader "Content-Type", "application/x-www-form-urlencoded"
   .send ("stns=380&start=20210101&end=20211231&vars=T:TD:U")
   strResp = .responsetext
 End With
  
 sp = Split(strResp, ",")
 ReDim ar(UBound(sp), 5)
 For i = 2 To UBound(sp)
    For Each it In Split(Application.Trim(sp(i)), " ")
        y = j \ 6
        x = j Mod 6
        ar(y, x) = it
        j = j + 1
    Next
 Next
  
 Sheets(1).Cells(1, 1).Resize(y + 1, 6) = Application.Index(ar, Evaluate("row(1:" & y + 1 & ")"), Array(6, 1, 2, 3, 4, 5))
End Sub
 
Je kan de dataset ook rechtstreeks inlezen met Power Query en dan filters en datatransformatie erop los laten... Geen vba nodig.
 

Bijlagen

  • vb_lyric1 (AC).xlsx
    285,7 KB · Weergaven: 46
Ik zou ook voor de optie van Alex gaan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan