Jede Anleitung zur Währungsumrechnung in Power BI gehört zu einem von zwei Lagern. Das DAX-Lager zeigt Ihnen ein elegantes Measure und setzt stillschweigend voraus, dass eine ExchangeRate-Tabelle bereits in Ihrem Modell existiert. Das API-Lager zeigt Ihnen ein Power-Query-Snippet, das in Power BI Desktop hervorragend funktioniert und in dem Moment scheitert, in dem Sie veröffentlichen — weil die geplante Aktualisierung es ablehnt.
Dieser Leitfaden deckt beide Hälften ab, und zwar in dieser Reihenfolge: wie Sie Live-Wechselkurse aus einer REST-API so in Power BI holen, dass die Veröffentlichung im Power BI-Dienst überlebt wird, wie Sie diese Kurse modellieren, damit Ihre Zahlen belastbar sind, und wie Sie Beträge entweder zur Importzeit oder zur Abfragezeit umrechnen — je nachdem, was Ihr Bericht tatsächlich braucht.
Alle Power-Query- und DAX-Beispiele unten wurden gegen die dokumentierten Antwortstrukturen der Finexly API geschrieben.
Klären Sie zuerst, welches Umrechnungsproblem Sie haben
„Währungsumrechnung in Power BI" bezeichnet drei verschiedene technische Probleme unter einem Namen, und das falsche zu wählen ist der teuerste Fehler in diesem ganzen Artikel.
- Viele Quellwährungen, eine Berichtswährung. Ihre Umsatztabelle enthält Zeilen in EUR, GBP und JPY, und der CFO will eine einzige USD-Zahl. Rechnen Sie zur Importzeit um. Der Kurs ist eine Eigenschaft der Transaktion, nicht des Berichts.
- Eine Quellwährung, viele Berichtswährungen. Alles liegt in USD vor, und Nutzer wählen die Anzeigewährung über einen Datenschnitt. Rechnen Sie zur Abfragezeit in DAX um. Jede Währung vorzuberechnen ist unpraktisch.
- Viele Quellwährungen, viele Berichtswährungen. Normalisieren Sie beim Import auf eine einzige Pivotwährung und legen Sie dann Fall 2 darüber. Versuchen Sie nicht, das in einem Schritt zu lösen.
Die Faustregel, die erfahrene Modellierer wiederholen und die eine Wiederholung wert ist: Rechnen Sie so früh um, wie Sie es sich erlauben können. Jede Umrechnung, die Sie in die Abfragezeit schieben, kostet Sie bei jedem Visual, jeder Filteränderung, jedem Klick auf einen Datenschnitt.
Live-Kurse richtig in Power Query holen
Beginnen Sie mit der Kurstabelle. Der effizienteste Aufruf ist eine Multi-Paar-Abfrage: Sie erhalten alle relevanten Währungen in einer Anfrage statt einer Anfrage pro Währung.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/convert?q=USD_EUR,USD_GBP,USD_JPY"{
"USD_EUR": { "rate": 0.9215 },
"USD_GBP": { "rate": 0.7892 }
}Hier das Äquivalent als Power-Query-M-Abfrage. Erstellen Sie eine leere Abfrage (Start → Neue Quelle → Leere Abfrage → Erweiterter Editor) und fügen Sie ein:
let
ApiKey = "YOUR_API_KEY",
Pairs = "USD_EUR,USD_GBP,USD_JPY,USD_CAD,USD_AUD,USD_CHF",
Source = Json.Document(
Web.Contents(
"https://api.finexly.com",
[
RelativePath = "v1/convert",
Query = [ q = Pairs ],
Headers = [ #"Authorization" = "Bearer " & ApiKey ]
]
)
),
ToTable = Record.ToTable(Source),
Expanded = Table.ExpandRecordColumn(ToTable, "Value", {"rate"}, {"Rate"}),
Split = Table.SplitColumn(
Expanded, "Name",
Splitter.SplitTextByDelimiter("_", QuoteStyle.None),
{"BaseCurrency", "Currency"}
),
Typed = Table.TransformColumnTypes(
Split,
{{"BaseCurrency", type text}, {"Currency", type text}, {"Rate", type number}}
),
Stamped = Table.AddColumn(Typed, "RetrievedAt", each DateTimeZone.UtcNow(), type datetimezone)
in
StampedNennen Sie sie FxRates. Sie erhalten eine vierspaltige Tabelle — BaseCurrency, Currency, Rate, RetrievedAt — die sofort in Beziehungen und Measures nutzbar ist.
Der Web.Contents-Fehler, der die geplante Aktualisierung zerstört
Beachten Sie, was die obige Abfrage nicht tut: Sie verkettet die Parameter nie in die URL-Zeichenfolge. Das ist der mit Abstand häufigste Grund dafür, dass ein Bericht zur Währungsumrechnung auf dem Desktop läuft und in der Cloud stirbt.
Wenn Sie stattdessen dies schreiben:
// Do NOT do this
Source = Json.Document(
Web.Contents("https://api.finexly.com/v1/convert?q=" & Pairs)
)… aktualisiert Power BI Desktop das klaglos, und der Power BI-Dienst verweigert es mit „Dieses Dataset enthält eine dynamische Datenquelle. Die Aktualisierung wird nicht unterstützt." Der Dienst muss zur Analysezeit eine statische Basis-URL auflösen können, um ihr Anmeldeinformationen zuzuordnen. Die variablen Teile über RelativePath und Query zu übergeben, liefert genau das: Die Basis bleibt https://api.finexly.com, und alles Dynamische lebt in den Optionen.
Dasselbe gilt für jede Abfrage, die eine URL aus einem Parameter, einem Datum oder einem Wert aus einer anderen Tabelle baut. Wenn Sie nur eine Sache aus diesem Artikel mitnehmen, nehmen Sie RelativePath mit.
Den API-Schlüssel handhaben, ohne ihn fest zu verdrahten
ApiKey = "YOUR_API_KEY" im Code ist für einen Fünf-Minuten-Test in Ordnung und für alles Geteilte falsch. Der M-Code eines semantischen Modells ist für jeden mit Build-Berechtigung sichtbar.
Zwei praktikable Optionen:
- Ein Power-Query-Parameter (Start → Parameter verwalten), referenziert als
ApiKey = KeyParam. Er wird weiterhin mit dem Modell gespeichert, ist aber zentralisiert, leicht zu rotieren, und Sie können ihn je Umgebung über Bereitstellungspipelines überschreiben. - Der Anmeldeinformationstyp Web-API. Gehen Sie im Power BI-Dienst zu Einstellungen des semantischen Modells → Datenquellen-Anmeldeinformationen → Anmeldeinformationen bearbeiten und wählen Sie Web-API, wo Sie den Schlüssel hinterlegen. Der Dienst injiziert dann den
Authorization-Header selbst, und Sie entfernen die OptionHeadersvollständig aus Ihrem M. So bleibt das Geheimnis außerhalb der Modelldefinition.
Was auch immer Sie wählen: Verwenden Sie einen Schlüssel, der nur für Reporting gilt, und rotieren Sie ihn, wenn jemand das Team verlässt. Landet der Schlüssel in der URL-Querystring statt in einem Header, kann er in Zugriffsprotokollen von Proxys und Servern auftauchen — die Finexly-Dokumentation weist darauf hin, und das gilt für jeden Anbieter.
Bauen Sie eine Währungsdimension, nicht nur eine Kursliste
Eine Kurstabelle allein liefert Zahlen. Sie liefert keine korrekten Bezeichnungen, keine korrekten Nachkommastellen und keinen sinnvoll sortierten Datenschnitt. Holen Sie die Währungsliste als eigene Dimension:
let
ApiKey = "YOUR_API_KEY",
Source = Json.Document(
Web.Contents(
"https://api.finexly.com",
[
RelativePath = "v1/currencies",
Headers = [ #"Authorization" = "Bearer " & ApiKey ]
]
)
),
ToTable = Table.FromList(Source, Splitter.SplitByNothing(), {"Currency"}),
Typed = Table.TransformColumnTypes(ToTable, {{"Currency", type text}})
in
TypedErgänzen Sie dann die beiden Spalten, die Power BI nicht für Sie ableiten kann:
MinorUnits— die Anzahl der Nachkommastellen, die die Währung tatsächlich verwendet. JPY hat 0, KWD hat 3, die meisten haben 2. Eine Yen-Summe mit zwei Nachkommastellen zu formatieren, ist in einem Finanzbericht ein sichtbarer Korrektheitsfehler, und Runden im falschen Schritt verstärkt ihn. Der Leitfaden zur Währungsrundung zeigt, wo der Fehler entsteht.FormatString— z. B."\€#,0.00","\¥#,0". Sie brauchen das später für dynamische Formatzeichenfolgen.
Beide folgen dem Standard ISO 4217, nicht irgendetwas, das Power BI nativ kennt; die ISO-4217-Referenz enthält die vollständige Tabelle. Markieren Sie diese Tabelle als Dimension, verknüpfen Sie sie 1:n mit FxRates[Currency] und verwenden Sie sie — nicht die Kurstabelle — als Quelle Ihres Datenschnitts.
Weg A: Umrechnen zur Importzeit (schnell, langweilig, korrekt)
Für Szenario 1 — viele Währungen rein, eine raus — erledigen Sie die Arbeit in Power Query und lassen das Modell eine einzige saubere Zahl speichern.
- Laden Sie Ihre Transaktionsabfrage in Power Query.
- Start → Abfragen zusammenführen,
Transactions[Currency]mitFxRates[Currency]verbinden (Left Outer). - Erweitern Sie die zusammengeführte Spalte und behalten Sie
Rate. - Spalte hinzufügen → Benutzerdefinierte Spalte:
= if [Currency] = "USD" then [Amount]
else if [Rate] = null then null
else [Amount] / [Rate]Beachten Sie den null-Zweig. Ein Left-Outer-Join gegen eine Kurstabelle, in der eine Währung fehlt, erzeugt null, und null erzeugt in der Power-Query-Arithmetik stillschweigend wieder null statt eines Fehlers — daraus wird ein Leerwert im Visual und eine Summe, die unauffällig zu niedrig ist. Machen Sie die Lücke explizit, damit Sie danach filtern und sie sehen können.
Beachten Sie auch die Division. USD_EUR = 0.9215 bedeutet, ein USD kauft 0,9215 EUR — einen EUR-Betrag in USD umzurechnen dividiert also. Einen USD-Betrag in EUR umzurechnen multipliziert. Das zu vertauschen ist der zweithäufigste Fehler in Multiwährungsberichten und bei Kursen nahe 1,0 fast unsichtbar: Ein Fehler von 3 % in einer EUR/USD-Zahl sieht aus wie eine Rundungsdifferenz, bis jemand abstimmt.
Weg B: Umrechnen zur Abfragezeit mit DAX
Für Szenario 2 — eine gespeicherte Währung, eine vom Nutzer gewählte Anzeigewährung — muss die Umrechnung in einem Measure passieren.
Die naive Variante macht ein LOOKUPVALUE pro Zeile und wird ab einigen Hunderttausend Zeilen langsam. Erst aggregieren, dann einmal umrechnen:
Sales (Reporting Currency) =
VAR SelectedCurrency = SELECTEDVALUE ( Currency[Currency], "USD" )
VAR Rate =
CALCULATE (
SELECTEDVALUE ( FxRates[Rate] ),
FxRates[Currency] = SelectedCurrency
)
VAR Result =
IF (
SelectedCurrency = "USD",
[Sales Amount],
[Sales Amount] * Rate
)
RETURN
IF ( ISBLANK ( Rate ) && SelectedCurrency <> "USD", BLANK (), Result )Zwei Details, die mehr zählen, als sie aussehen:
SELECTEDVALUEmit Standardwert. Ohne den Rückfall auf"USD"liefert das Measure einen Leerwert, sobald keine Währung ausgewählt ist — und genau in diesem Zustand öffnet sich Ihr Bericht.- Die explizite Leerwert-Absicherung. Hat eine Währung keinen Kurs, geben Sie bewusst einen Leerwert zurück, statt
[Sales Amount] * BLANK()eine Null liefern zu lassen. Eine Null in einer Umsatzkachel ist eine Lüge; ein Leerwert ist eine sichtbare Lücke.
Wenn der Kurs im Zeitverlauf variiert
Das Measure oben verwendet einen einzigen aktuellen Kurs für das gesamte Dataset. Das ist richtig für „was wäre der Umsatz des Vorjahres heute wert" und falsch für fast alles andere. Wenn Ihre Kurstabelle eine Zeile pro Währung und Tag hat, gruppieren Sie vor der Umrechnung nach Datum:
Sales (Historical Rates) =
SUMX (
VALUES ( 'Date'[Date] ),
VAR DayRate =
CALCULATE (
SELECTEDVALUE ( FxRates[Rate] ),
FxRates[Currency] = SELECTEDVALUE ( Currency[Currency], "USD" )
)
RETURN
[Sales Amount] * DayRate
)Über VALUES('Date'[Date]) statt über die Faktentabelle zu iterieren hält den Iterator klein — Tage, nicht Transaktionen.
Dynamische Formatzeichenfolgen
Eine umgerechnete Zahl mit fest verdrahtetem $-Präfix ist schlimmer als gar kein Symbol. Setzen Sie in Power BI das Format des Measures auf Dynamisch und liefern Sie einen Ausdruck:
SELECTEDVALUE ( Currency[FormatString], "#,0.00" )Jetzt zeigt die Kachel mit ¥ auch ¥, mit null Nachkommastellen, ohne ein zweites Measure. Früher brauchte das Berechnungsgruppen in Analysis Services; dynamische Formatzeichenfolgen für Measures haben es in Power BI selbst gebracht.
Welchen Kurs sollten Sie eigentlich verwenden?
Das ist die Frage, die ein Dashboard von einem Bericht trennt, den die Finanzabteilung abzeichnet — und keine API kann sie für Sie beantworten.
- Kassakurs des Transaktionstags — zum Erfassen einzelner Transaktionen. Höchste Genauigkeit, größte Kurstabelle.
- Monats- oder Periodendurchschnitt — der Standard für Posten der Gewinn- und Verlustrechnung, sowohl nach IAS 21 als auch nach ASC 830. Er glättet Schwankungen innerhalb des Monats und wird in den meisten Konsolidierungen tatsächlich verwendet.
- Stichtagskurs zum Periodenende — für Bilanzposten: Kasse, Forderungen, Verbindlichkeiten.
- Budget- oder Planungskurs — ein über das Jahr konstant gehaltener Kurs, damit die Abweichungsanalyse die operative Leistung von der Währungsbewegung trennt.
Ein ernsthaftes Modell braucht oft zwei oder drei davon nebeneinander, als getrennte Spalten derselben Kurstabelle (SpotRate, AverageRate, ClosingRate) statt als getrennte Tabellen. Wenn Ihr Bericht etwas speist, das in einer Erklärung landet, behandelt der Leitfaden zu Wechselkursen und Steuerberichterstattung, welche Quelle und welchen Zeitstempel Sie verteidigen können müssen, und der Leitfaden zu historischen Wechselkursen behandelt das Abrufen datierter statt aktueller Kurse.
Die Wochenendlücke, die Summen stillschweigend zerstört
Devisenmärkte schließen. Eine tägliche Kurstabelle aus einer Live-API hat keinen Samstag, keinen Sonntag und keinen 25. Dezember. Verbinden Sie eine auf Samstag datierte Transaktion mit dieser Tabelle, erhalten Sie null, null wird zum Leerwert, und der Leerwert wird zu einer Summe, die genau um den Wochenendumsatz zu niedrig ist.
Beheben Sie das in der Kurstabelle, nicht im Measure. Erzeugen Sie eine vollständige Datumsliste und füllen Sie nach unten:
let
Dates = List.Dates(#date(2026,1,1), Duration.Days(Date.From(DateTime.LocalNow()) - #date(2026,1,1)) + 1, #duration(1,0,0,0)),
DateTable = Table.FromList(Dates, Splitter.SplitByNothing(), {"Date"}),
Typed = Table.TransformColumnTypes(DateTable, {{"Date", type date}}),
Joined = Table.NestedJoin(Typed, {"Date"}, RateHistory, {"Date"}, "r", JoinKind.LeftOuter),
Expanded = Table.ExpandTableColumn(Joined, "r", {"Currency", "Rate"}),
Filled = Table.FillDown(Expanded, {"Currency", "Rate"})
in
FilledTable.FillDown trägt den Freitagskurs über das Wochenende — das ist die übliche Behandlung und, wichtiger noch, eine erklärte statt einer zufälligen. Sortieren Sie vor dem Füllen nach Währung und Datum, sonst tragen Sie den Kurs der falschen Währung über die Lücke.
Wenn Ihr Tarif keine historischen Endpunkte enthält, können Sie die Historie stattdessen nach vorne aufbauen: Hängen Sie bei jeder Aktualisierung die heutigen Kurse an eine gespeicherte Tabelle an — ein Dataflow oder eine Fabric-Lakehouse-Tabelle eignen sich gut — und nach einem Quartal haben Sie eine echte Zeitreihe. Sie ist nicht rückwirkend, kostet aber einen API-Aufruf pro Tag.
Aktualisierungsplanung und die Kontingent-Rechnung
Power BI Pro erlaubt 8 geplante Aktualisierungen pro Tag für ein semantisches Modell; Premium- und Fabric-Kapazitäten erlauben 48. Das ist die Zahl, die Ihr API-Kontingent abdecken muss, und die Rechnung fällt freundlicher aus, als die meisten annehmen.
Die obige Kurstabelle bedeutet zwei Aufrufe je Aktualisierung: einen an /v1/currencies, einen an /v1/convert. Also:
| Aktualisierungstakt | Aktualisierungen/Monat | API-Aufrufe/Monat | Finexly-Tarif |
|---|---|---|---|
| 8/Tag (Pro-Maximum) | ~240 | ~480 | Kostenlos (1.000/Monat) |
| 48/Tag (Fabric, alle 30 Min.) | ~1.440 | ~2.880 | Starter |
| 48/Tag + stündliche Dataflow-Historie | ~2.160 | ~4.320 | Growth |
Die Grenze von 10 pro Minute ist die kritische. Wenn Sie eine Abfrage bauen, die /v1/rate innerhalb eines Table.AddColumn einmal pro Währung aufruft, bedeuten zwanzig Währungen zwanzig Aufrufe in wenigen Sekunden und eine Serie von 429-Antworten mitten in der Aktualisierung. Genau dafür existiert der Multi-Paar-Aufruf /v1/convert. Bündeln und cachen: Der Leitfaden zu Caching und Fehlerbehandlung beschreibt Retry-mit-Backoff-Muster, die genauso für eine geplante Aktualisierung gelten.
Gateways, Excel und Fabric
Ein paar Umgebungshinweise, die je einen Nachmittag sparen:
- Kein Gateway nötig. Eine Cloud-REST-API ist keine lokale Quelle, Sie brauchen dafür also kein lokales Datengateway. Schlägt die Aktualisierung fehl und jemand schlägt vor, eines zu installieren, ist das fast immer der Fehler mit der dynamischen Datenquelle in Verkleidung.
- Excel nutzt dieselbe Engine. Power Query in Excel akzeptiert exakt das obige M. Wenn Ihr Publikum in Arbeitsmappen statt in Dashboards lebt, behandelt der Leitfaden zu Live-Wechselkursen in Excel
WEBSERVICE,LAMBDAund die Versionsmatrix; es gibt auch ein Pendant für Google Sheets. - Fabric Dataflow Gen2 ist der bessere Ort für die Kurstabelle, sobald mehr als ein Bericht sie braucht. Landen Sie die Kurse einmal, lassen Sie alle semantischen Modelle dieselbe Tabelle lesen, und Ihr API-Verbrauch skaliert nicht mehr mit der Anzahl der Berichte.
- Prüfen Sie gegen eine bekannte Zahl, bevor Sie veröffentlichen. Holen Sie ein Paar aus dem Währungsrechner und vergleichen Sie es mit dem, was Ihr Modell für dasselbe Paar zum selben Zeitpunkt zeigt. Weichen sie ab, haben Sie ein Richtungs- oder Rundungsproblem — und das finden Sie lieber jetzt als in einer Vorstandssitzung.
Häufige Fragen
Kann Power BI Währungen ohne API umrechnen? Ja, wenn Sie die Kurse selbst liefern: eine handgepflegte Tabelle, ein Export aus dem Finanzsystem oder eine Datenbanksicht. Power BI hat keine eingebaute Kursquelle. Eine API zählt dann, wenn Sie Kurse brauchen, die sich aktualisieren, ohne dass jemand daran denken muss.
Warum aktualisiert sich mein Umrechnungsbericht in Power BI Desktop, scheitert aber im Dienst?
Fast immer wegen des Fehlers zur dynamischen Datenquelle. Ihr Web.Contents-Aufruf baut die URL durch Zeichenfolgenverkettung. Verschieben Sie die variablen Teile in die Optionen RelativePath und Query, damit die Basis-URL statisch ist, veröffentlichen Sie erneut und geben Sie die Anmeldeinformationen neu ein.
Sollte ich in Power Query oder in DAX umrechnen? Power Query, wenn der Bericht eine einzige Berichtswährung hat — schneller und einfacher. DAX, wenn Nutzer die Währung zur Laufzeit wählen. Brauchen Sie beides, normalisieren Sie in Power Query auf eine Pivotwährung und setzen Sie das DAX-Measure darauf.
Wie viele API-Anfragen verbraucht eine Power-BI-Aktualisierung?
Zwei pro Aktualisierung, wenn Sie alle Paare in einem einzigen /v1/convert-Aufruf bündeln. Beim Pro-Maximum von 8 Aktualisierungen täglich sind das rund 480 Anfragen im Monat — innerhalb eines kostenlosen Tarifs. Teuer wird es erst, wenn Sie die API einmal pro Währung oder einmal pro Zeile aufrufen.
Wie behandle ich Wochenenden und Feiertage in einer täglichen Kurstabelle? Erzeugen Sie eine durchgehende Datumstabelle, verbinden Sie die Kurse per Left Join, sortieren Sie nach Währung und Datum und füllen Sie nach unten. Der Freitagskurs trägt über das Wochenende. Entscheidend ist, dass die Behandlung bewusst und dokumentiert ist und nicht Zeilen stillschweigend verschwinden.
Welchen Wechselkurs sollte ich für die Finanzberichterstattung verwenden? Periodendurchschnittskurse für Posten der Gewinn- und Verlustrechnung, Stichtagskurse für Bilanzposten — sowohl nach IAS 21 als auch nach ASC 830. Speichern Sie sie als getrennte Spalten einer Kurstabelle, damit ein Bericht ohne Modelländerung zwischen ihnen wechseln kann.
Bereit, Live-Kurse hinter Ihre Dashboards zu legen? Holen Sie sich Ihren kostenlosen Finexly-API-Schlüssel — ohne Kreditkarte. Starten Sie mit 1.000 Anfragen pro Monat, genug, um einen Power BI Pro-Arbeitsbereich mit maximaler Rate zu aktualisieren, und wechseln Sie den Tarif, wenn Sie historische Daten oder einen schnelleren Takt brauchen. Falls Sie noch Anbieter vergleichen, stellt die Vergleichsseite die Optionen nebeneinander.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →