Aktueller USD-Kurs

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:
  1. 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:
  2. Tabelle tblKurs

    Tabelle, in der die Kurse gespeichert werden
  3. 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.

Aktueller USD-Kurs
Markiert in:            

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.