Aktuelle Währungskurse in Access
Herunterladen des aktuellen USD-Kurses (incl. der Kurse seit 1999, wenn nötig) von der Seite www.bundesbank.de und Speichern in einer Tabelle.
Unter der URL
http://www.bundesbank.de/cae/servlet/StatisticDownload?tsId=BBEX3.D.USD.EUR.BB.AC.000&its_csvFormat=de&its_fileFormat=csv&mode=its
kann eine CSV-Datei mit Dollarkursen bis einschließlich des vorherigen Tages heruntergeladen werden (Stand 1.1. 2017)
Mit dem folgenden Code kann dies automatisiert mit VBA gemacht werden, wobei die Kurse in einer Tabelle gespeichrt werden.
Voraussetzungen:
- Einmalig muss die obige URL aufgerufen werden und die Datei unter einem Pfad gespeichert werden, unter dem sie dann auch im folgenden bestehen bleiben muss.
Für den folgenden Beispielcode wird der Pfad „d:\temp\usd.csv“ angenommen.
Diese Datei muss dann als verknüpfte Tabelle (Name hier im Beispiel „USD“) im Access gespeichert werden.
Dazu unter Externe Daten -> Textdatei die CSV-Datei auswählen und mit der Opton „Erstellen Sie eine Verknüpfung …“ und OK die Datei verknüpfen.
Im folgenden Dialog „Mit Trennzeichen…“ wählen, dann „Weiter“, im nächsten Dialog auf „Weiter“, Feld1 mit „KursDatum“ benennen und „Kurzer Text“ einstellen, Feld2 mit „Kurs“ benennen und „Single“ einstellen und bei Feld3 „Feld nicht importieren“ anhaken. Dann
Das Ergebnis sollte nach dem Öffnen so aussehen:
- Tabelle tblKurs
Tabelle, in der die Kurse gespeichert werden - Abfrage qryKurs
SELECT CDate([Usd].[KursDatum]) AS KursDatum, Usd.Kurs FROM Usd WHERE (((IsNumeric([kurs]))=True) AND ((Left([KursDatum],4))>=Year(Date())-1));
Diese Abfrage als qryKurs speichern.
Das Kriterium „>=Year(Date())-1
“ sorgt dafür, dass nur Kurse ab Beginn des Vorjahrs gespeichert werden.
Bei Bedarf also dieses Kriterium ändern oder weglasen, falls längere/kürzere Zeiträume benötigt werden.
Der Code lautet:
Option Compare Database Option Explicit Private Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" _ (ByVal pCaller As Long, _ ByVal szURL As String, _ ByVal szFileName As String, _ ByVal dwReserved As Long, _ ByVal lpfnCB As Long) As Long Private Const ERROR_SUCCESS As Long = 0 Private Const BINDF_GETNEWESTVERSION As Long = &H10 Public Function DownloadFile(strSourceUrl As String, strLocalFile As String) As Boolean DownloadFile = URLDownloadToFile(0&, _ strSourceUrl, _ strLocalFile, _ BINDF_GETNEWESTVERSION, _ 0&) = ERROR_SUCCESS End Function Function UpdateDollarkurs() As Boolean ' Herunterladen der USD-Kurse von www.bundesbank.de in ein CSV-File und import in die Tabelle tblUSD ' Tabelle scheint immer Daten bis einschließlich zum letzten Werktag zu enthalten ' - return: true, wenn erfolgreich On Error GoTo ErrHandle Dim strURL As String Dim strLocalFile As String strURL = "http://www.bundesbank.de/cae/servlet/StatisticDownload?tsId=BBEX3.D.USD.EUR.BB.AC.000&its_csvFormat=de&its_fileFormat=csv&mode=its" strLocalFile = "d:\Temp\usd.csv" If Not DownloadFile(strURL, strLocalFile) Then MsgBox "Fehler beim Herunterladen der USD-Kurse" Exit Function End If CurrentDb.Execute "Insert Into tblUSD select * from qryUsd" ' fügt wegen Schlüsselverletzung nur die neuen daten ein UpdateDollarkurs = True ExitHere: Exit Function ErrHandle: Select Case Err Case Else MsgBox "Fehler beim Verarbeiten der USD-Kurse" End Select GoTo ExitHere End Function
Erläuterung:
Die Funktion DownloadFile(...)
greift auf die API-Funktion URLDownloadToFile
zu. Die CSV-Datei unter der übergebenen URL wird heruntergeladen und unter dem angegebenen Pfad gespeichert. Dies muss der gleiche Pfad sein, auf den die Verknüpfung der Tabelle „USD“ weist.
Der Execute-Befehl trägt die neu hinzugekommen Kurse in die Tabelle tblKurs ein.
Die Verwendung ist also so gedacht, dass immer dann, wenn neue Kurse benötigt werden, die Funktion ausgeführt wird.
CurrentDb.Execute
hat hier den Vorteil (anders als CurrentProject.Execute
), dass der Befehl ausgeführt wird, auch wenn Schlüsselverletzungen vorliegen:
In tblKurs haben wir das Datumsfeld als Schlüssel definiert. Der Insert-Befehl versucht ja jedes Mal auch für die älteren Datumswerte Daten einzufügen. CurrentProject.Execute
würde mit einem Fehler abbrechen. CurrentDb.Execute
wird ohne Fehler ausgeführt, wobei nur die Datensätze zu „neuen Tagen“ in die Tabelle tblKurs eingefügt werden.
Fortsetzung (coming soon):
In den heruntergeladenen Daten fehlen die Wochenenden und Feiertage (der Kurs wird mit 0 in der Tabelle gespeichert).
In einem weiteren Schritt können diese Tage mit dem jeweils letzten aktuellen Kurs gefüllt werden. Denn häufig wird die Verwendung der Tabelle so sein, dass das Datum mit dem Datum einer anderen Tabelle „gejoined“ wird, z.B. das Einkaufsdatum in einer Bestelltabelle, so dass tatsächlich das Datum in der Kurstabelle lückenlos sein sollte.