Clever-Excel-Forum

Normale Version: PowerQuery: Tabellenzeilen selektieren, Auswahlkriterium ist Liste
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Ihr Wissenden,

stehe gerade auf'm Schlauch, bräuchte mal ne fixe Idee:
  • ich habe eine Tabelle, in der in der Spalte "Name" die Namen von Unterverzeichnissen eines Ordners stehen
  • diese Verzeichnisnamen enthalten u.a. eine Jahreszahl
  • außerdem habe ich eine Liste mit Jahreszahlen (als Zahlen)
nun möchte ich aus der Tabelle alle Zeilen selektieren, die im Namen des Unterverzeichnisses eine der Zahlen in der Liste enthalten.

Welche Struktur ist dafür um geeignetsten?

Ich kann natürlich jede der Zeilen der Tabelle mit 'or' fix auf jedes der Elemente der Liste prüfen - aber damit fixiere ich die Anzahl zu prüfender Zahlen.

Welche geschickte Konstruktion ermöglicht mir hier, bei variabler Anzahl an Zahlen in meiner Selektionsliste trotzdem alle Zeilen meiner Tabelle auszuwählen, die in der 'Name'-Spalte eine der Zahlen enthalten?

Zur Visualisierung ein Beispiel einer Tabelle mit Verzeichnissen:
[attachment=47428]
Und hier ein Beispiel einer Liste mit Jahreszahlen:
[attachment=47429]
Im Beispiel möchte ich in der Tabelle alle Zeilen auswählen, die entweder die Zahl '2023', die Zahl '2022' oder die Zahl '2021' enthalten.

Gruß und Dank,
RaiSta
Hi Raista,

mal ein Beispiel...
ich gehe davon aus, dass Du die Jahreszahlen aus der Spalte Name vergleichen willst. In meinem Bsp. ist es die Spalte b... :)

Somit als erstes, eine neue Spalte mit der extrahierten Jahreszahl aus Name (im Bsp.  JahreszahlAusSpalte_b)
dann eine Tabelle aus der Liste der Jahreszahlen ( Jahresliste)
dann die beiden kombinieren ( #"Zusammengeführte Abfragen" )
und aus der extrahierten Spalte die Nullen rausfiltern...

Optische Aufräumarbeiten überlasse ich jetzt Dir...  Sleepy


let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
    //Tabelle aus Liste mit 3 Jahreszahlen erstellen
    Jahresliste = Table.FromList(  {"2020","2021","2022"}),
    JahreszahlAusSpalte_b = Table.AddColumn(Quelle, "NurJahreszahl", each Text.End([b],4)),
    #"Zusammengeführte Abfragen" = Table.NestedJoin(JahreszahlAusSpalte_b, {"NurJahreszahl"}, Jahresliste, {"Column1"}, "JahreszahlAusSpalte_b", JoinKind.LeftOuter),
    #"Erweiterte JahreszahlAusSpalte_b" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "JahreszahlAusSpalte_b", {"Column1"}, {"JahreszahlAusSpalte_b.Column1"}),
    #"Gefilterte Zeilen" = Table.SelectRows(#"Erweiterte JahreszahlAusSpalte_b", each ([JahreszahlAusSpalte_b.Column1] <> null))
in
    #"Gefilterte Zeilen"
(09.03.2023, 20:17)Ralf A schrieb: [ -> ]ich gehe davon aus, dass Du die Jahreszahlen aus der Spalte Name vergleichen willst. In meinem Bsp. ist es die Spalte b... :)

Somit als erstes, eine neue Spalte mit der extrahierten Jahreszahl aus Name (im Bsp.  JahreszahlAusSpalte_b)

Hallo Ralf,

danke für Deinen Lösungsvorschlag. Daran merke ich, dass ich mein Thema nicht vollständig beschrieben hatte...

Das Problem ist, dass ich nicht fix davon ausgehen kann, dass in den Namen der Unterverzeichnisse als Letztes immer die Jahreszahl steht - da könnte auch mal 2022-a oder 2022_01 oder 2022|Q2 oder ... oder ... stehen (dem Ideenreichtum der Verzeichnis-Erzeuger sind keine Grenzen gesetzt....).

Daher wollte ich explizit nur abprüfen, ob eine der Zahlen aus der Zahlenliste in der Spalte Name der Tabelle enthalten ist. Da sehe ich erst mal keine direkte Chance für einen Join...?

Gruß und Dank,
RaiSta
Hi

zwei Varianten.

Gruß Elex
(10.03.2023, 08:17)RaiSta schrieb: [ -> ]Das Problem ist, dass ich nicht fix davon ausgehen kann, dass in den Namen der Unterverzeichnisse als Letztes immer die Jahreszahl steht - da könnte auch mal 2022-a oder 2022_01 oder 2022|Q2 oder ... oder ... stehen (dem Ideenreichtum der Verzeichnis-Erzeuger sind keine Grenzen gesetzt....).

...sorry... ich bin davon ausgegangen, dass das Problem die Liste wäre...

@Elex,

wie geil ist das denn? Damit meinte ich die Funktionslösung.  28
(10.03.2023, 10:49)Ralf A schrieb: [ -> ]@Elex,

wie geil ist das denn? Damit meinte ich die Funktionslösung.  28

Dem kann ich mich nur anschließen. Diese Lösungen sind genau das, was ich mir erhofft hatte. Jetzt muss ich's nur noch verstehen...

Also die Variante 1 kann ich gut nachvollziehen. Aber - Funktion V1 ist für mich dann doch noch ein bisschen ein Rätsel – da muss ich jetzt erst mal noch 'ne Weile 'dran kauen.

Richtig geile Geschichte zum Wochenende - jetzt gibt's noch was für die grauen Zellen, damit die nicht einrosten!

Vielen Dank, @Elex,
hier bringst Du mich weiter!


Ein erstes Teilergebnis ist eine Reduktion der Funktionszeile:
Mit der Tabelle Deines Beispiels "tblData" sowie des Filters "tblFilter":
[attachment=47452]   –   [attachment=47453]
Code:
let
    Source = Excel.CurrentWorkbook(){[Name="tblData"]}[Content],
    nurGültige = Table.SelectRows(Source,
        (x) => List.MatchesAny(tblFilter[Filter], each Text.Contains(x[Name], _))
        )
       
in
    nurGültige

Liefert das selbe Ergebnis ohne noch die Kapselung im "if ... then ... else".

... ich pirsche mich an – an's Verstehen...

RaiSta
Hallo

Nach den Funktionensbeschreibungen hatte ich eigentlich erwartet dass es auch so reicht. Geht aber nicht.
Table.SelectRows(Quelle, List.MatchesAny(tblFilter[Filter], each Text.Contains([Name], _)))