Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

aus per Formel berechneter Tabelle PQ Abfrage machen

Forumthread: aus per Formel berechneter Tabelle PQ Abfrage machen

aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 13:40:57
Christian
Hallo,

ist es möglich, die Formeln im Blatt Ergebnis durch eine PQ Abfrage zu ersetzen, die auf den Blättern Liste, Filme und Leute beruht?
Zur Info, das Blatt Ergebnis hat deshalb nur 299 Zeilen, weil ich alle Zeilen gelöscht habe, in denen die Formel in Spalte C "" ausgibt, sowie alle Zeilen in denen die Formel in Spalte G eine Zahl größer 30 ausgibt.

Wäre super, wenn es da eine Lösung gäbe.

Danke
Christian

https://www.herber.de/bbs/user/173732.zip

in der Zip datei befinden sich auch noch die csv Dateien die als Datenquelle für die Filme und Schauspieler dienen.
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 14:14:06
daniel
Hi
vielleicht erübrigt sich die PQ mit diesem Formelwerk.
die Formeln müssen nur in Zeile 1 von ERGEBNIS geschrieben werden und passen sich dann automatisch an die Datenmenge von LISTE, FILME, LEUTE an (die kannst du über die Importfunktion einlesen).
ab Zeile 2 muss die Tabelle leer sein

A1: =FILTER(Liste!A:A;Liste!A:A>"")
B1: =VERGLEICH(A1#;Filme!B:B;0)
C1: =WENN(ISTZAHL($B1#);INDEX(Filme!C:C;$B1#);"")
D1: =WENN(ISTZAHL($B1#);INDEX(Filme!D:D;$B1#);"")
E1: =FILTER(Liste!B:B;Liste!A:A>"")
F1: =VERGLEICH(E1#;Leute!B:B;0)
G1: =WENN(ISTZAHL($F1#);INDEX(Leute!C:C;$F1#);"")
H1: =WENN(ISTZAHL($F1#);INDEX(Leute!D:D;$F1#);"")
I1: =RANG(H1#;H$1:H1#;0)
J1: =DATEDIF(H1#;D1#;"Y")
K1: =DATEDIF(H1#;D1#;"YD")
L1: =D1#-H1#
M1: ="MRS "&TEXT(L1#;"00000")&" "&WECHSELN(C1#;":";"")&" ("&TEXT(D1#;"TT.MM.JJJJ")&") - "&G1#&" ("&TEXT(H1#;"TT.MM.JJJJ")&") "&J1#&"-"&K1#

die Spalten B und F habe ich hinzugefügt. Da wird die Zeilennummer der Fundstelle ermittelt, da du aus einer Tabelle mehrere Spalten liest (also die selbe Zeile verwendest) muss Excel weniger suchen.

zur Erklärung:
die Funktion FILTER kann mehrere Ergbnisse ausgeben, das regelt deine Excelversion automatisch und schreibt die Ergebnisse in die Zellen darunter
wenn du jetzt Formeln hast, die sich auf diese Werte beziehen sollen und sich auch der Datenmenge automatisch anpassen sollen, dann hängst du an den Zellbezug den # an.

Gruß Daniel
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 16:46:32
Yal
Hallo Christian,

es durchaus möglich und auch nicht sonderlich kompliziert.

- Füge deine Liste im Blatt "Liste" einen Überschrift mit "Film" und "Leute",
- wandle diese Liste in einer Tabelle (Menü "Einfügen"), und benenne sie in "tblListe" um
- übertrage die Tabelle in Power Query (Menü "Daten", "Aus Tabelle/Bereich"),
- mache daraus 2 Verweise, erster wird "tblListe_Index", zweiter "Ergebnis" benannt (nicht zwingend, aber für diese Anleitung relevant)

im "tblListe_Index"
- die Spalte "Leute" entfernen
- die Filme-Duplikat entfernen
- mache einen Join mit der Tabelle "Filme1"
- lass die passende Spalten raus: "Original Title" und "Release Date"
- filtere alle "Release Date" = null
- sortiere nach Release Date,
- Füge einen Index von 1 auf

M-Code sieht so aus:
let

Quelle = tblListe,
#"Gruppierte Zeilen" = Table.Group(Quelle, {"Film"}, {}),
#"Zusammengeführte Abfragen" = Table.NestedJoin(#"Gruppierte Zeilen", {"Film"}, Filme1, {"Const"}, "Filme1", JoinKind.LeftOuter),
#"Erweiterte Filme1" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Filme1", {"Original Title", "Release Date"}, {"Original Title", "Release Date"}),
#"Sortierte Zeilen" = Table.Sort(#"Erweiterte Filme1",{{"Release Date", Order.Ascending}}),
#"Gefilterte Zeilen" = Table.SelectRows(#"Sortierte Zeilen", each ([Release Date] > null)),
#"Hinzugefügter Index" = Table.AddIndexColumn(#"Gefilterte Zeilen", "Index", 1, 1, Int64.Type)
in
#"Hinzugefügter Index"


Im "Ergebnis"
- mache einen Join mit der Tabelle "tblListe_index"
- lasse Spalten "Original Title", "Release Date" und "Index" raus (ohne Präfix)
- filtere die Filme ohne Release Date raus
- mache einen Join mit der Tabelle Leute1, lass die Namen und Birth Date raus,
- rechne den Brutto-Jahresunterschied: Date.Year([Release Date]) - Date.Year([Birth Date])
- rechne den Brutto Tagesunterschied: Number.From([Release Date])-Number.From(Date.AddYears([Birth Date],[JahreDelta_brutto]))
- errechne den Netto-Jahresunterschied: if [RestTage_brutto] 0 then [JahreDelta_brutto] - 1 else [JahreDelta_brutto])
- und die Netto-Tagesunterschied: Number.From([Release Date])-Number.From(Date.AddYears([Birth Date],[JahreDelta]))
- bilde die Zeichenkette mit Rücksicht auf die Datentypen: "MRS " & Text.PadStart (Text.From([TageDelta]), 5, "0") & " " & [Original Title] & " (" & Date.ToText([Release Date]) & ") - " & [Name] & " (" & Date.ToText([Birth Date]) & ") " & Text.From([JahreDelta]) & "-" & Text.From([RestTage]))
- notiere in der richtige Reihenfole die Splaten zu behalten und "andere Spalten entfernen"
- Sortiere nach Release Date

Der M-Code sieht so aus:
let

Quelle = tblListe,
#"Zusammengeführte Abfragen" = Table.NestedJoin(Quelle, {"Film"}, tblListe_index, {"Film"}, "tblListe_index", JoinKind.LeftOuter),
#"Erweiterte tblListe_index" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "tblListe_index", {"Original Title", "Release Date", "Index"}, {"Original Title", "Release Date", "Index"}),
#"Gefilterte Zeilen" = Table.SelectRows(#"Erweiterte tblListe_index", each ([Release Date] > null)),
#"Zusammengeführte Abfragen1" = Table.NestedJoin(#"Gefilterte Zeilen", {"Leute"}, Leute1, {"Const"}, "Leute1", JoinKind.LeftOuter),
#"Erweiterte Leute1" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen1", "Leute1", {"Name", "Birth Date"}, {"Name", "Birth Date"}),
#"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Erweiterte Leute1", "TageDelta", each Number.From([Release Date])-Number.From([Birth Date])),
#"Hinzugefügte benutzerdefinierte Spalte1" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte", "JahreDelta_brutto", each Date.Year([Release Date])-Date.Year([Birth Date])),
#"Hinzugefügte benutzerdefinierte Spalte2" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte1", "RestTage_brutto", each Number.From([Release Date])-Number.From(Date.AddYears([Birth Date],[JahreDelta_brutto]))),
#"Hinzugefügte benutzerdefinierte Spalte3" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte2", "JahreDelta", each if [RestTage_brutto] 0 then [JahreDelta_brutto] - 1 else [JahreDelta_brutto]),
#"Hinzugefügte benutzerdefinierte Spalte4" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte3", "RestTage", each Number.From([Release Date])-Number.From(Date.AddYears([Birth Date],[JahreDelta]))),
#"Hinzugefügte benutzerdefinierte Spalte5" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte4", "MRS", each "MRS " & Text.PadStart (Text.From([TageDelta]), 5, "0") & " " & [Original Title] & " (" & Date.ToText([Release Date]) & ") - " & [Name] & " (" & Date.ToText([Birth Date]) & ") " & Text.From([JahreDelta]) & "-" & Text.From([RestTage])),
#"Andere entfernte Spalten" = Table.SelectColumns(#"Hinzugefügte benutzerdefinierte Spalte5",{"Film", "Original Title", "Release Date", "Leute", "Name", "Birth Date", "Index", "JahreDelta", "RestTage", "TageDelta", "MRS"}),
#"Sortierte Zeilen" = Table.Sort(#"Andere entfernte Spalten",{{"Release Date", Order.Ascending}})
in
#"Sortierte Zeilen"


Ob besser als eine Formellösung muss jeder für sich entscheiden. Ich mag die Stringenz von PQ, weil es zu einer Logik der gut organisierten Daten zwingt.
Das keine Formel in Arbeitsblatt vorhanden ist, vermeidet Flüchtigkeitsfehler.
Auch die Quellen "Filme1.csv" und "Leute1.csv" müssen nicht in Excel geladen werden. Die Datei wird leichter.

VG
Yal
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 17:55:54
Christian
Hallo Yal,

erstmal danke für deine Mühe.
Irgendwas scheint mit den Berechnungen der Differenzen nicht so ganz zu stimmen, z.b. im Fall vom Film Hair und der Schauspielerin Beverly d'Angelo sagen die Datedif Formeln einen Unterschied von 27 Jahren und 240 Tagen, deinen Berechnungen zufolge sind es 27 Jahre und 239 Tage, wobei ich jetzt keine Ahnung habe, welche der beiden Versionen stimmt.

Aber das zweite, was ist mit meiner Rang Formel passiert?

Ansonsten sieht das schonmal sehr gut aus

Danke
Christian

PS: Ich brauche die beiden Listen in der Datei zum Zwecke der Nachverfolgung von Änderungen an den CSV Dateien. Aber danke für den Hinweis
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 18:09:26
Yal
Hallo Christian,

Gegenfrage: wie wichtig ist es, dass die Wahrheit 239 statt 240 (oder umgekehrt) ist?
Ich gehe davon aus, dass wenn 2 Datum am gleichen Tage vorkommen würden, meine Berechnung 0 ergeben wurde, aber Datedif 1. Also +1 auf die PQ-Formel und gut ist.

Ich habe den "Rang" falsch verstanden. Es handelt sich nur um die Reihenfolge der Geburt der Aktoren/Regissoren/... ("Leute"). Wenn Du dich ausseinander setzt, wie diese Berechnung für Release Date gemacht wurde, kannst Du es für Leute umstellen: Joinen, um die Leute zu behalten, die in der Liste vorkommen, nach Geburtsdatum sortieren und Index herausgeben.

Die Unterschied zwischen den Inhalte von 2 Dateien würde ich auch mit Power Query errechnen lassen (outer join), anstatt 2 elendlose Liste mit dem Auge zu vergleichen...

VG
Yal
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 18:40:33
Christian
Hallo Yal,

du hast schon recht, so extrem wichtig ist das mit einem Tag mehr oder weniger ist.
Woran das ganze aber steht und fällt ist das mit der RANG Formel, diese Spalte brauche ich auch später noch für andere Zwecke. Wenn sich das nicht umsetzen lässt muss ich wohl oder übel bei meiner Formellösung bleiben.

Naja um ehrlich zu sein, ich kann deine Erklärung hierzu nicht nachvollziehen.

Gruß
Christian
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 19:07:46
Yal
Hallo Christian,

das Problem ist, dass wenn Du nicht verstehst, was ich beschrieben habe, dann hast Du ein Werkzeug, der zwar funktioniert, aber nicht beherrscht. Irgendwann wird irgendwas anders sein, und nichts funktioniert mehr. Entweder deine Kompetenz wächst genauso schnell wie die Werkzeuge, die Du einsetzt, oder Du hast ein Risiko.

Ich verstehe immer noch nicht wie/was der Rang bringen soll: die Reihenfolge der Geburtsdatum der Mitwirkenden entlang der Reihenfolge der Erscheinungsdatum der Filme (?). Keine Ahnung, was Du anschliessend damit machst, aber das Konstrukt scheint mir extrem unstabil.

Anbei eine Lösung, bei dem der "Rang" nur auf das Geburtsdatum der "Leute" basiert. Nehme die Gelegenheit, die Verarbeitung ins Detail anzuschauen.
https://www.herber.de/bbs/user/173743.xlsx

VG
Yal
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 21:25:27
Christian
Hallo Yal,

ich denke da hast du eine Sache falsch verstanden. Ich hatte nicht nachvollziehen können, wie die beschriebenen Schritte zu meiner gewünschten Lösung führen sollen, nicht wie ich sie umsetzen muss.

Die Indexspalte in der Datei ist ja im Prinzip nichts anderes als die Leute nach Alter sortiert.

Gut du wirst das jetzt sicher nicht mehr nachvollziehen können als vorher, das Ziel ist mit ungefähr gleich vielen Filmen aus jeder Epoche weiterzuarbeiten. Wenn ich jetzt pauschal sage, ich will mit allen weiterarbeiten, die bei Veröffentlichung jünger als ich sag jetzt einfach mal 30 Jahre waren, wirst du schnell merken, dass die meisten Filme dann aus den 80ern und 2000ern stammen (wenn die Liste mal fertig ist). Ich versuche das auf dem Weg etwas unabhängiger von einer festen Altersgrenze zu machen.

Gruß
Christian
Anzeige
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
23.11.2024 10:52:32
Luschi
Hallo Yal,

- bevor ich unvollständige Datumsangaben in Textspalten vervollständige
- wird diese Spalte bei mir getrimmt, also eventuelle Leerzeichen entfernt
- einfach nur zur Sicherheit, daß zwischen den Kommata sich nicht doch das 1 oder andere Leerzeichen geschummelt hat
  "Spalte trimmen" = Table.TransformColumns(#"Entfernte Spalten", {"Release Date", Text.Trim}),
- in der Abfrage 'Filme1' definiert Du für 13 Spalten den passenden Dateityp
- um im nächsten Schritt genau diese Spalten zu löschen
- hier würde ich die Reihenfolgen umdrehen und nicht nach 'Schema F' handeln

Gruß von Luschi
aus klein-Paris

Anzeige
aber wenn das zu kompliziert wird...
20.11.2024 21:28:03
Christian
das Hauptziel der Abfrage ist ja Rechenzeit zu sparen, wenn die Liste mal größer ist, das kann ich ja theoretisch auch erreichen, indem ich die Formeln auf Knopfdruck per VBA berechnen lasse, wenn es auf dem PQ Weg zu kompliziert wird, nehme ich diesen Weg (und werde dann erstmal einen Selbstversuch starten).
Anzeige
AW: aber wenn das zu kompliziert wird...
21.11.2024 10:34:33
Yal
Guten morgen,

"Die Indexspalte in der Datei ist ja im Prinzip nichts anderes als die Leute nach Alter sortiert." -> so habe ich es letztendlich interpretiert und implementiert. Die Zahlen werden fortlaufend nur auf die involvierten "Leuten" gelegt. Lücke sollte es nicht geben.

Im Grund genommen möchtest Du für jeden Epoche die Filme in Gruppen unterteilen, je nach Alter der Mitwirkenden.

Was Performance angeht, gehe ich davon aus, dass Du mit PQ ein guten Ergebnis bekommen wird.
Solltest Du weitere Verarbeitung haben wollen, könnte ich empfehlen die erste, einmalige Verarbeitung von der Abfrage zu trennen: Menü "Tabellenentwurf", "Verknüpfung aufheben". Dann kannst Du die Aufgabetabelle als Quelle verwenden.
Bei einer PQ-Abfrage, die sich auf einer PQ-Abfrage bezieht, besteht das Risiko, dass jedesmal die gesamte Verarbeitungskette aktualisiert. Soviel Kaffee kann an nicht trinken.

VG
Yal
Anzeige
AW: aber wenn das zu kompliziert wird...
21.11.2024 15:50:44
daniel
die meiste Rechenzeit sparst du, wenn du die beiden Listen "Filme" und "Leute" nach dem ID-Wert aufsteigend sortierst und dann den XVerweis mit binärere Suche verwendest. Damit sollten die Formeln schnell genug sein, auch wenn man mit der Gesamttabelle arbeitet (Filtern, sortieren usw)
AW: aus per Formel berechneter Tabelle PQ Abfrage machen
20.11.2024 14:26:33
Christian
Hallo Daniel,

werde ich heute nachmittag gerne testen, auf jeden Fall schonmal vielen Dank. (Hab gleich nen Arzttermin).

Aber ich frage mich im Moment, was bringt mir deine Version für einen Vorteil gegenüber meiner. Meine Version funktioniert ja.
Ich hatte mit der PQ Lösung ein bestimmtes Ziel verfolgt, die Tabelle wird in Zukunft noch stark wachsen, ich hatte befürchtet, dass es irgendwann bei jedem Piep den ich ändere (am Blatt Liste), mehrere Sekunden dauert, bis alle Formeln neu berechnet sind.
Bei einer PQ Lösung dachte ich, ich kann am Blatt Liste soviel rumwerkeln wie ich will, das Blatt Ergebnis wird nur einmal aktualisiert, wenn ich fertig bin und auf aktualisieren klicke.

Vorteile könnte mir deine Version also m.E. (korrigier mich bitte wenn ich falsch liege) nur dann bringen, wenn deine Formeln sich schneller berechnen lassen.

Gruß und schonmal danke
Christian
Anzeige
Testergebnis
20.11.2024 14:40:58
Christian
Hallo Daniel,

wenn ich die mit deinen Formeln erstellte Tabelle sortieren will, meint Excel Teile einer Matrix könnten nicht geändert werden...
Ob deine Rang Formel passt konnte ich nicht beurteilen, da diese nur richtig berechnet wird, wenn die entsprechende Sortierreihenfolge gegeben ist.

Ansonsten scheinen deine Formeln zu funktionieren.

Gruß
Christian

Anzeige
AW: Testergebnis
20.11.2024 15:21:09
daniel
Hi
wenn Verarbeitungsgeschwindigkeit dein Problem ist, solltest du die Tabellen Filme und Leute nach dem Const-Wert aufsteigend sortieren, damit du die Binäre Suche verwenden kannst. Damit sollte es ratzt fatz gehen.
Das Sortieren kannst du auch automatisch per Formel machen.

wenn du auch die Ergebnisliste sortieren willst, dann solltest du diese ohne Matrix-Formel machen. Dazu würde ich sie dann auch direkt an die Ausgangsliste anhängen.

schau dir mal das Beispiel an.
https://www.herber.de/bbs/user/173737.xlsm

Wenn du unbedingt PQ haben willst, solltest du vielleicht nochmal neu fragen.

Gruß Daniel
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18