In diesem Beitrag möchte ich meinen Power Query M Code teilen, den ich benutze, um exportierte Transaktionsdatensätze (im CSV-Format) in das Format für Blockpit (Manuelle Integration) zu konvertieren. Falls der M-Code für andere Dienste benötigt wird, kann ich diesen bei Gelegenheit erstellen. Dafür benötige ich jedoch eine Beispieldatei (CSV) bestenfalls mit gültigen und ungültigen Transaktionen.
Hier möchte ich ersteinmal Schritt für Schritt erklären, wie der M Code in Excel genutzt werden kann.
Hinweis: Der M Code ist immer mit einem Tabellenblatt verknüpft. Bei Aktualisierung der Abfragen werden die Daten auf diesem Blatt automatisch überschrieben, sofern die zugrunde liegende(n) CSV-Datei(en) noch verfügbar sind. Wenn zusätzliche Informationen (z. B. Labels) nach dem Import hinzugefügt wurden, sollte vorher eine Kopie auf einem separaten Tabellenblatt erstellt werden, um diese Daten zu erhalten.
Weitere Informationen zum M-Code findest du hier:
Anleitung zur Nutzung des M-Codes
1. Power Query Editor starten
- Öffnen des Query-Editor über Datei → Daten abrufen → Query-Editor starten, .
2. Neue Abfrage erstellen
- Rechtsklick im Abfragebereich → Neue Abfrage → Datei → Text/CSV.
- Wähle die gewünschte CSV-Datei aus dem sich öffnenden Dialogfeld aus.
3. M Code einfügen
- Öffne den erweiterten Editor über Start → Abfrage → Erweiterter Editor (die Abfrage muss ausgewählt sein).
- Ersetze den bestehenden Code durch den bereitgestellten M Code per Copy & Paste.
- Bestätige die Änderungen mit Fertig.
4. Dateipfad der CSV-Datei neu setzen
Da der Dateipfad durch das Ersetzen des M Codes gelöscht wurde, muss er erneut gesetzt werden.
- Wähle im Bereich Angewandte Schritte auf der rechten Seite den Schritt Quelle aus und klicke auf das Zahnrad-Symbol.
- Im Dialogfeld klicke auf Durchsuchen und wähle den Pfad zur CSV-Datei aus.
- Schließe das Dialogfeld mit OK.
5. Daten in Excel laden
Lade die Daten endgültig in Excel, indem du auf Schließen & Laden klickst.
6. Dropdown-Menü fixen
Power Query unterstützt leider nicht das Setzten von Excel spezifischen Formatierungen, wie die Datenvalidierung (Dropdown-Menüs). Daher müssen diese manuell gesetzt werden:
- Öffne das Beispielsheet von Blockpit (Sheet1).
- Wähle eine Zelle in der Spalte Label, die bereits ein Dropdown-Menü enthält.
- Kopiere die Zelle mit STRG + C (oder Rechtsklick → Kopieren).
- Füge die kopierte Zelle in der ersten Zelle unter „Label“ in deiner Tabelle mit STRG + V ein.
- Falls die Vorauswahl stört, lösche sie mit der Entf-Taste.
- Ziehe die markierte Zelle am rechten unteren Punkt bis zum Ende der Tabelle herunter, um das Dropdown-Menü auf alle relevanten Zellen anzuwenden.
Jetzt sollte es möglich sein, für jede Zelle in der Spalte Label einen Wert aus dem Dropdown-Menü auszuwählen.
7. (Optional) Farbgestaltung anpassen
- Du kannst die Farbgebung deiner Tabelle nach Belieben anpassen.
Bei zukünftigen Importen bleiben die Validierungsfelder (Dropdown-Menüs) und Excel-spezifischen Formatierungen erhalten. Die Schritte 6 und 7 müssen daher nicht wiederholt werden.
M-Code für Ledger:
let
Quelle = Csv.Document(File.Contents(„“),[Delimiter=„,“, Columns=12, Encoding=1252, QuoteStyle=QuoteStyle.None]),
PromoteHeaders = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true]),
TransformColumnTypes = Table.TransformColumnTypes(PromoteHeaders,{{„Operation Date“, type datetimezone}, {„Operation Amount“, type number}, {„Operation Fees“, type number}}, „en-US“),
RemoveColumns = Table.RemoveColumns(TransformColumnTypes,{„Countervalue Ticker“, „Countervalue at Operation Date“, „Countervalue at CSV Export“, „Account xpub“, „Account Name“}),
SelectRows = Table.SelectRows(RemoveColumns, each ([Status] = „Confirmed“)),
#„Add Outgoing Asset“ = Table.AddColumn(SelectRows, „Outgoing Asset“, each if [Operation Type] = „OUT“ then
[Currency Ticker]
else
„“),
#„Add Outgoing Amount“ = Table.AddColumn(#„Add Outgoing Asset“, „Outgoing Amount“, each if [Operation Type] = „OUT“ then
[Operation Amount]
else
„“),
#„Add Incoming Asset“ = Table.AddColumn(#„Add Outgoing Amount“, „Incoming Asset“, each if [Operation Type] = „IN“ then
[Currency Ticker]
else
„“),
#„Add Incoming Amount“ = Table.AddColumn(#„Add Incoming Asset“, „Incoming Amount“, each if [Operation Type] = „IN“ then
[Operation Amount]
else
„“),
#„Add Integration Name“ = Table.AddColumn(#„Add Incoming Amount“, „Integration Name“, each „Ledger“),
#„Add Comment“ = Table.AddColumn(#„Add Integration Name“, "Comment ", each „“),
#„Add Label“ = Table.AddColumn(#„Add Comment“, „Label“, each „“),
RemoveColumns2 = Table.RemoveColumns(#„Add Label“,{„Status“, „Operation Type“, „Operation Amount“}),
Reorder = Table.ReorderColumns(RemoveColumns2,{„Operation Date“, „Integration Name“,„Label“, „Outgoing Asset“, „Outgoing Amount“, „Incoming Asset“, „Incoming Amount“,„Currency Ticker“,„Operation Fees“,"Comment ",„Operation Hash“}),
#„Rename Fee Asset“ = Table.RenameColumns(Reorder,{{„Currency Ticker“, „Fee Asset“}})
in
#„Rename Fee Asset“
M-Code für changelly (changelly.com) :
let
Quelle = Csv.Document(File.Contents(„“),[Delimiter=„,“, Columns=12, Encoding=1252, QuoteStyle=QuoteStyle.None]),
PromoteHeaders = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true]),
TransformColumnTypes = Table.TransformColumnTypes(PromoteHeaders,{{„Date“, type datetimezone}, {„Exchange amount“, type number}, {„Exchange rate“, type number}, {„Total fee“, type number}, {„Amount received“, type number}}, „en-US“),
TextUpper = Table.TransformColumns(TransformColumnTypes,{{„Currency to“, Text.Upper, type text}, {„Currency from“, Text.Upper, type text}}),
SelectRows = Table.SelectRows(TextUpper, each ([Status] = „finished“)),
#„Add Outgoing Asset“ = Table.AddColumn(SelectRows, „Outgoing Asset“, each [Currency from]),
#„Add Outgoing Amount“ = Table.AddColumn(#„Add Outgoing Asset“, „Outgoing Amount“, each [Exchange amount] ),
#„Add Incoming Asset“ = Table.AddColumn(#„Add Outgoing Amount“, „Incoming Asset“, each [Currency to]),
#„Add Incoming Amount“ = Table.AddColumn(#„Add Incoming Asset“, „Incoming Amount“, each [Amount received]),
#„Add Fee Asset“ = Table.AddColumn(#„Add Incoming Amount“, „Fee Asset“, each [Currency to]),
#„Rename Fee Amount“ = Table.RenameColumns(#„Add Fee Asset“,{{„Total fee“, „Fee Amount“}}),
#„Add Integration Name“ = Table.AddColumn(#„Rename Fee Amount“, „Integration Name“, each „Changelly“),
#„Add Comment“ = Table.AddColumn(#„Add Integration Name“, "Comment ", each „“),
#„Add Label“ = Table.AddColumn(#„Add Comment“, „Label“, each „“),
RemoveColumns = Table.RemoveColumns(#„Add Label“,{„Currency from“, „Currency to“, „Status“, „Exchange amount“, „Exchange rate“, „Amount received“, „“, „_1“, „_2“}),
Reorder = Table.ReorderColumns(RemoveColumns,{„Date“, „Integration Name“,„Label“, „Outgoing Asset“, „Outgoing Amount“, „Incoming Asset“, „Incoming Amount“,„Fee Asset“,„Fee Amount“,"Comment ",„Receiver“})
in
Reorder
M-Code für Monero Wallet:
let
Quelle = Csv.Document(File.Contents(„“),[Delimiter=„,“, Columns=12, Encoding=1252, QuoteStyle=QuoteStyle.None]),
PromoteHeaders = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true]),
TransformColumnTypes = Table.TransformColumnTypes(PromoteHeaders,{{„date“, type datetimezone}, {„blockHeight“, type number}, {„epoch“, type number}, {„amount“, type number}, {„fee“, type number}}, „en-US“),
SelectRows = Table.SelectRows(TransformColumnTypes, each ([blockHeight] > 0)),
#„Add Outgoing Asset“ = Table.AddColumn(SelectRows, „Outgoing Asset“,each if [direction] = „out“ then
„XMR“
else
„“),
#„Add Outgoing Amount“ = Table.AddColumn(#„Add Outgoing Asset“, „Outgoing Amount“,each if [direction] = „out“ then
[amount]
else
„“),
#„Add Incoming Asset“ = Table.AddColumn(#„Add Outgoing Amount“, „Incoming Asset“,each if [direction] = „in“ then
„XMR“
else
„“),
#„Add Incoming Amount“ = Table.AddColumn(#„Add Incoming Asset“, „Incoming Amount“,each if [direction] = „in“ then
[amount]
else
„“),
#„Add Fee Asset“ = Table.AddColumn(#„Add Incoming Amount“,„Fee Asset“, each „XMR“),
#„Rename Fee Amount“ = Table.RenameColumns(#„Add Fee Asset“,{{„fee“, „Fee Amount“}}),
#„Rename Date“ = Table.RenameColumns(#„Rename Fee Amount“,{{„date“, „Date (UTC)“}}),
#„Add Integration Name“ = Table.AddColumn(#„Rename Date“, „Integration Name“, each „Monero Wallet“),
#„Rename Comment“ = Table.RenameColumns(#„Add Integration Name“,{{„description“, „Comment“}}),
#„Add Label“ = Table.AddColumn(#„Rename Comment“, „Label“, each „“),
RemoveColumns = Table.RemoveColumns(#„Add Label“,{„blockHeight“, „epoch“, „direction“, „amount“, „atomicAmount“, „label“, „subaddrAccount“, „paymentId“}),
Reorder = Table.ReorderColumns(RemoveColumns,{„Date (UTC)“, „Integration Name“,„Label“, „Outgoing Asset“, „Outgoing Amount“, „Incoming Asset“, „Incoming Amount“,„Fee Asset“,„Fee Amount“,„Comment“,„txid“})
in
Reorder
Hallo,
vielen Dank zunächst für das Bereitstellen der Informationen!
Wärst du in der Lage, einen M-Code für die großen Exchanges zu erstellen, insbesondere für Binance? Der Grund ist, dass der API-Import dort leider auf 720 Tage begrenzt ist.
Hast du eventuell selbst eine CSV-Datei von Binance, oder soll ich dir eine zur Verfügung stellen?
Vielen Dank im Voraus!
Ein Excel-Fuchs, herzlich willkommen hier. Bis zu welcher Version von Excel sollte das funktionieren? Nicht, dass ich es schon probiert hätte, sondern als Grundinfo