Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1956to1960
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Vorzeichen ändern in einer PowerQuery Abfrage

Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 08:38:31
EasyD
Hallo liebes Forum

Ich wusele mich gerade in PowerQuery rein und habe daher nur ein "Halbwissen", und selbst das ist eigentlich noch geprahlt.
Folgende Abfrage habe ich mir daher mit ChatGPT zusammen gebastelt, bin aber leider nicht ganz zum Ziel gekommen.

Luschi hat mit bei der gleichen Abfrage schon mit einem anderen Problem (Sortierung der Spalten) geholfen - falls du liest Luschi - Vielen Dank nochmal!

Vorab - eine Beispieldatei kann ich leider nicht hochladen, da das Entfremden der vertraulichen Daten echt zu aufwändig wäre.
Vielleicht vermag mir aber jemand auch nur bei Sichtung des Codes meinen Fehler zu zeigen.

Kurzbeschreibung:
ich füge 12 Abfragen in eine große Abfrage zusammen
Ein paar Spalten hinzufügen
Spalten neu sortieren
Datentypen ab inkl. 4. Spalte ändern, damit ich ausschließlich Dezimal-Werte habe (=Bedingung für eine funktionierende Änderung der Vorzeichen, im Original-Datensatz sind die Zahlen-Werte teilweise Text) - die Anzahl der Spalten ab der vierten Spalte ist variabel!
Ein Filterkriterium in Spalte 2 definieren (=Liste von Begriffen, Spalte "Position"), um in den so gefilterten Zeilen eine Vorzeichenänderung durchzuführen. Die Vorzeichen sollen in den Zeilen geändert werden, in denen das Filterkriterium NICHT in Spalte 2 steht.

Und jetzt kommts - im letzten Schritt "GeänderteSpalten" erhalte ich einen Fehler:

Expression.Error: Ein Wert vom Typ "Function" kann nicht in den Typ "List" konvertiert werden.
Details:
Value=[Function]
Type=[Type]

Da habe ich leider keinen Schimmer, was damit gemeint ist und wo genau ich ein Problem in dem Code habe.

Der komplette Code:

let
Quelle = Table.Combine({#"01R", #"02R", #"03R", #"04R", #"05R", #"06R", #"07R", #"08R", #"09R", #"10R", #"11R", #"12R"}),
GeänderterTyp = Table.TransformColumnTypes(Quelle, {{"Konto", type text}, {"Bezeichnung", type text}, {"Datum", type date}, {"Position", type text}}),

// Hinzugefügte Spalte "KontoBezeichnung" direkt nach "Datum" und "Position" einfügen
HinzugefügteSpalte = Table.AddColumn(GeänderterTyp, "KontoBezeichnung", each [Konto] & " " & [Bezeichnung], type text),

// Reihenfolge der Spalten anpassen
SpaltenNamen = Table.ColumnNames(HinzugefügteSpalte),
ErsteZweiSpalten = List.FirstN(SpaltenNamen, 2),
LetzteSpalte = List.LastN(SpaltenNamen, 1),
RestlicheSpalten1 = List.RemoveItems(SpaltenNamen, ErsteZweiSpalten),
RestlicheSpalten = List.RemoveItems(RestlicheSpalten1, LetzteSpalte),
NeueReihenfolge = ErsteZweiSpalten & {"KontoBezeichnung"} & RestlicheSpalten,
ReihenfolgeAngepasst = Table.ReorderColumns(HinzugefügteSpalte, NeueReihenfolge),
EntfernteSpalten = Table.RemoveColumns(ReihenfolgeAngepasst, {"Konto", "Bezeichnung", "Gesamt"}),

// Ändere den Datentyp der restlichen Spalten ab der vierten Spalte in Dezimalzahlen
SpaltenAbVierter = List.Skip(Table.ColumnNames(EntfernteSpalten), 3), // Überspringe die ersten 3 Spalten
GeänderteDatentypen = Table.TransformColumnTypes(EntfernteSpalten, List.Transform(SpaltenAbVierter, each {_, type number})),

// Definieren Sie Ihre Suchbegriffe und die zugehörigen Vorzeichen
Filterkriterium = {"Erlöse", "Umsatzerlöse", "Erlöse USt-frei", "Provisionserlöse", "Gewährte Skonti, Boni und Rabatte", "Sonstige Erlöse", "Eigenverbrauch", "Summe der Erlöse", "Gesamtleistung", "Rohgewinn", "Zwischensaldo", "Sonstige Erträge", "A.o. Erträge", "Erlöse aus Anlagenverkauf (Buchgewinn)", "Erträge aus Beteiligungen", "Grundstückserträge", "Zinsen und ähnliche Erträge", "Sonstige betriebliche Erträge", "Summe der sonstigen Erträge"},

// Vorzeichenänderung in den ausgewählten Spalten basierend auf den Filterkriterien
GeänderteSpalten = Table.TransformColumns(GeänderteDatentypen, each if List.Contains(SpaltenAbVierter, [Position]) and not List.Contains(Filterkriterium, [Position]) then -_ else _)
in
GeänderteSpalten

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 11:10:10
Yal
Hallo Easy,

die Funktion "TransformColumns", wie der "s" am Ende deutet, kann auf mehrere Spalten wirken. Es wird stets zuerst der Name der Spalte, dann die Wirkung ("each ..."). Sind mehrere Spalten ausgeführt, müssen diesen in folgenden Form aufgelistet werden
Table.TransformColumns ( #"Schritt davor", {{Spalte1, each ...},{Spalte2, each ...}}
Bei nur einer Spalte kann man die {{}} weglassen. Ich würde sie aber als "Gewohnheit des Richtigen" immer mitführen.

In deinem Fall fällt nur der Spaltenname:
Table.TransformColumns(GeänderteDatentypen, {{SpalteName, each if List.Contains(SpaltenAbVierter, [Position]) and not List.Contains(Filterkriterium, [Position]) then -_ else _}})

VG
Yal

Anzeige
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 11:31:43
EasyD
Hallo Yal,

danke für's rein schauen!

Ich glaube, jetzt fällt mir auf die Füsse, dass ich keine Datei hoch laden kann um Dir zu zeigen wie das Ding aussieht.

Verstehe ich Dich richtig - ich soll die Spalte nennen, in der ich die Vorzeichen ändern will?

Das wird nicht funktionieren, denn die Datenabfrage händelt eine variable Anzahl an Spalten!
Heute sind es 20 Spalten die geändert werden sollen, morgen bei der nächsten Abfrage sind es 21 usw.
Ich kann auch nicht festlegen, wie die Spalten bezeichnet sind - denn die Spaltenüberschrift stammt jeweils einer der 12 aus der ursprünglichen Abfragen - und die können morgen ganz andere sein als heute. Entsprechend kann ich die Spaltenüberschriften in TransformColumns auch nicht auflisten.

nur die ersten 4 Spalten sind fix, geändert werden soll die Vorzeichen in ALLEN Spalten die danach kommen und nur in Zeilen, in denen der Wert in Spalte 2 (Position) nicht den Filterkriterien entspricht.
Anzeige
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 11:33:47
EasyD
PS:
Der Schritt "SpaltenAbVierter" enthält als Listenform alle zu ändernden Spalten - das funktinoiert!
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 12:19:33
EasyD
PPS:
Erkenntnis - Ist das Problem, dass "GeänderteSpalten" ALLE Spalten ändern will? Also auch die Spalten 1 bis 4? Das soll natürlich nicht sein aber ich wüsste auch nicht, wie ich das verhindern könnte....
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 15:10:35
EasyD
Nochmal PPS - ich taste mich nach vorne:

Ausgehend von deinem Vorschlag habe ich nun das Table.TransformCloumns mal geändert wie folgt - nur um zu sehen was passiert:

= Table.TransformColumns(GeänderteDatentypen, {100390, each if List.Contains(SpaltenAbVierter, [Position]) and not List.Contains(Filterkriterium, [Position]) then -_ else _})

100390 ist eine der vielen Überschriften/Spaltenbezeichnungen derjenigen Spalten, in denen ich die Vorzeichenänderung machen will.
(alle anderen Spaltenüberschriften haben ebenfalls Nummern - ich weiß nicht ob das Relevant ist)

Das Ergebnis hierbei:

Expression.Error: Der Wert "100390" kann nicht in den Typ "List" konvertiert werden.
Details:
Value=100390
Type=[Type]

Ist die Ursache des Problems, dass die Überschriftenzeilen ebenfalls in die Vorzeichenänderung einbezogen werden?
Das wäre zwar natürlich Unfug, aber ich würde das Problem trotzdem nicht verstehen, denn auch die Überschriften sind Zahlenwerte (bei denen ein geändertes Vorzeichen zwar wenig hilfreich wäre, aber ich könnte das ignorieren).

Hilft diese Erkenntnis weiter?
Anzeige
AW: Vorzeichen ändern in einer PowerQuery Abfrage
20.12.2023 18:29:58
Luschi
Hallo EasyD,

bei klappt das so:
let

Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
SpaltenNamen.1 = Table.ColumnNames(Quelle),
SpaltenNamen.2=List.RemoveLastN(List.RemoveFirstN(SpaltenNamen.1, 1),1),

SpaltenNegativ = List.Accumulate(
SpaltenNamen.2,
Quelle,
(st, cur) =>
Table.TransformColumns(st, {{cur, each -_}}))
in
SpaltenNegativ
Gruß von Luschi
aus klein-Paris

PS: eigentlich traurig, das der Helfer sich eine eigene Demodatei erstellen muß, um den M-Code zu testen. Das Erstellen dieser Datei hat nicht mal 5 Minuten Zeit gekostet - aber zum Standard sollte das nicht werden!

Anzeige
AW: zu den angegebenen 5 Minuten hinzu kommt aber noch, ...
21.12.2023 07:57:18
neopa C
Hallo Luschi,

... die Zeit, die man zum Lesen und Verstehen der eingestellten Beiträge insbesondere der Problemstellung benötigt. Da würde zumindest ich mehr als 10 Minuten benötigen und das ohne sicher zu sein es auch richtig interpretiert zu haben. Deshalb die Bitte an Dich, stelle doch mal Deine Demodatei hier noch ein.

Gruß Werner
.. , - ...
AW: Vorzeichen ändern in einer PowerQuery Abfrage
21.12.2023 09:20:23
EasyD
Hallo Luschi,

danke!

Ich habe im Moment noch nicht verstanden, wie ich das in meine bestehende Abfrage rein basteln kann.
Ich werde mich allerdings frühestens heute abend mal damit befassen können und mal rumtesten...

Trotzdem schon mal vielen Dank, ich bin für jedwede Hilfe dankbar!
Und natürlich hat neopa C auch recht - Der Leser muss verstehen was das Problem ist und auch alles richtig interpretieren.
Ich kann daher natürlich nachvollziehen, dass Ihr hier immer gerne eine Bsp-Datei zum Problem haben wollt. Wenn ich das - ohne mich 2 Tage mit der Entfremdung der Daten zu beschäftigen - hinbekommen würde, dann würde ich natürlich auch die Bsp-Datei mit schicken.

Ich gehe nur aus dem einen Grund so wie hier vor - ihr seid schließlich die Fachleute und wer, wenn nicht Ihr könnt beim Lesen des Codes erkennen wo ich Mist gebaut habe.
Wenn sich dann anschließend niemand damit befassen kann/will, dann muss ich natürlich auch damit leben, schließlich macht Ihr alle das "für Umme".
Anzeige
AW: hierzu ...
21.12.2023 13:55:42
neopa C
Hallo EasyD,

... Luschi ist ein langjähriger VBA-Profi und mittlerweile auch erfahrener M-Code-Programmierer.
Ich kann seinen eingestellten M-Code ohne eine Beispieldateigenau so wenig lesen wie Deinen, weil ich PQ im wesentlichen nur interaktiv nutze.

Aber wenn ich Dein Anliegen richtig interpretiere, könnte ich Deine nachgefragte Zielstellung auch mit PQ rein interaktiv lösen. Dies ist dann zwar nicht so effizient wie es Luschi mit seinem M-Code realisiert, aber dafür einfach nachzuvollziehen und auch zu erklären:
In PQ markiere die erste zu modifizierende Spalte, dann aktiviere im PQ-Menü [Transformieren] die Funktion [Standard] und darunter dann die Funktion "Multiplizieren". Gib dann da als Wert: -1 ein und betätige [ok]. So erhältst Du für sämtliche vorhandene Zahlenwerte (und nur solche sollten vorhanden sein) in der entsprechenden Spalte deren Negation.

Die vorbeschriebene Definition wiederholst Du für die anderen Spalten, wo es notwendig ist. Das sind dadurch zwar einige PQ-Schritte mehr und ist (wichtig!) nicht dynamisch (d.h. berücksichtigt nicht automatisch geänderte Spaltennamen und oder zusätzliche Spalten in denen auch negiert werden soll) aber es erfüllt zunächst den Zweck und kann auch leicht an evtl. neue Änderungen angepasst werden.

Wenn Du aber Änderungen bzgl. der zu modifizierenden Spalten sowie der Spaltennamen effektiv berücksichtigen mußt, dann nutze den M-Code von Luschi .

Gruß Werner
.. , - ...
Anzeige
AW: Vorzeichen ändern in einer PowerQuery Abfrage
21.12.2023 09:21:21
EasyD
Hallo luschi - da weiß ich wieder nicht, wie das Forum funktioniert - ich habe offensichtlich neopa C geantwortet...
AW: "geantwortet" hast Du auf Luschis letzten Beitrag owT
21.12.2023 13:57:12
neopa C
Gruß Werner
.. , - ...

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige