Anzeige
Archiv - Navigation
1900to1904
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

PQ: doppelte Werte definiert ersetzen...

PQ: doppelte Werte definiert ersetzen...
17.10.2022 08:07:33
neopa
Hallo PQ_Profis,
... um vorhandene doppelte Werte in einer Spalte durch "" zu ersetzen, benötige ich interaktiv momentan zuviele (9 zusätzliche) Schritte, welches ja (bei größeren Datenmengen) sicher auch mehr Zeit benötigt.
Meine Zielvorstellung nachfolgend aufgezeigt an einem Beispiel (jeweils der erste der doppelte Werte muss im Original stehen bleiben):
Arbeitsblatt mit dem Namen 'Tabelle1'
 ABCDEFG
1IST - Datenliste ZIEL - Datenliste
2NameE-MailSonst NameE-MailSonst
3Name_01E-Mail_05Sonst_01 Name_01E-Mail_05Sonst_01
4Name_02E-Mail_02Sonst_02 Name_02E-Mail_02Sonst_02
5Name_03E-Mail_03Sonst_03 Name_03E-Mail_03Sonst_03
6Name_03E-Mail_03Sonst_03 Name_03doppeltSonst_03
7Name_04 Sonst_04 Name_04 Sonst_04
8Name_05E-Mail_01Sonst_04 Name_05E-Mail_01Sonst_04
9Name_06E-Mail_02Sonst_05 Name_06doppeltSonst_05
10Name_08E-Mail_04Sonst_06 Name_08E-Mail_04Sonst_06
11       
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.02] MS Excel 2010
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Mein M-Code für das Beispiel sieht momentan wie folgt aus:

let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}, {"E-Mail ", type text}, {"Sonst", type text}}),
#"Sortierte Zeilen" = Table.Sort(#"Geänderter Typ",{{"E-Mail ", Order.Ascending}, {"Name", Order.Ascending}}),
#"Hinzugefügter Index" = Table.AddIndexColumn(#"Sortierte Zeilen", "Index", 0, 1, Int64.Type),
#"Hinzugefügter Index1" = Table.AddIndexColumn(#"Hinzugefügter Index", "Index.1", 1, 1, Int64.Type),
#"Zusammengeführte Abfragen" = Table.NestedJoin(#"Hinzugefügter Index1", {"Index"}, #"Hinzugefügter Index1", {"Index.1"}, "Hinzugefügter Index1", JoinKind.LeftOuter),
#"Erweiterte Hinzugefügter Index1" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Hinzugefügter Index1", {"E-Mail "}, {"E-Mail .1"}),
#"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Erweiterte Hinzugefügter Index1", "neu", each if [#"E-Mail "] =[#"E-Mail .1"] and [#"E-Mail "]  null then "doppelt" else [#"E-Mail "]),
#"Entfernte Spalten" = Table.RemoveColumns(#"Hinzugefügte benutzerdefinierte Spalte",{"E-Mail ", "Index", "Index.1", "E-Mail .1"}),
#"Umbenannte Spalten" = Table.RenameColumns(#"Entfernte Spalten",{{"neu", "E-Mail"}}),
#"Neu angeordnete Spalten" = Table.ReorderColumns(#"Umbenannte Spalten",{"Name", "E-Mail", "Sonst"}),
#"Sortierte Zeilen1" = Table.Sort(#"Neu angeordnete Spalten",{{"Name", Order.Ascending}})
in
#"Sortierte Zeilen1"
Wie kann man das effektiver definieren?
Gruß Werner
.. , - ...

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
dynamische Formel, vermutlich noch kürzbar
17.10.2022 09:37:58
lupo1
F3:
=WAHL({1.2.3};
B3:B10;
LET(x;C3:C10;
y;SORTIEREN(HSTAPELN(WENN(x="";"";x);ZEILE(x)));
z;SORTIEREN(HSTAPELN(y;INDEX(y;SEQUENZ(ZEILEN(x)-1;;2))=INDEX(y;SEQUENZ(ZEILEN(x)-1;;1)));{1.3});
WENN(INDEX(WENNFEHLER(1/(1/SORTIEREN(HSTAPELN(SORTIEREN(WEGLASSEN(z;;-1);{1.2});INDEX(z;;3));2));"");;3)=1;"doppelt";WENN(x="";"";x)));
D3:D10)

y sortiert C3:C10 mit Gedächtnis der Zeile
z vergleicht die sortierten C3:C10 auf Doppler (WAHR)
WENN sortiert ohne diesen Vergleich die Zeilenpositionen unterhalb des sortierten C3:C10 zurück, und mit diesem Vergleich dann nach Zeilenpositionen in die Ausgangsposition zurück
... geht möglicherweise noch einen Schritt kürzer
Keine Antwort auf eine PQ-Frage, da nur XL2021/365/Web.
Zugegeben lässt sich PQ hier besser lesen, aber man kann auch den LET-Teil noch lesbarer machen.
Anzeige
AW: Danke, aber ich habe XL2016 und will PQ owT
17.10.2022 10:20:34
neopa
Gruß Werner
.. , - ...
Was Du möglicherweise verbessern kannst
17.10.2022 10:54:07
lupo1
Verwende gleich beim Erst-Sort die Zeilennummern als zusätzliche Spalten ("Gedächtnissort").
Anleitung der Datenmanipulation (egal PQ oder dyn)
17.10.2022 11:14:01
lupo1
=WAHL({1.2.3};B3:B10;LET(x;C3:C10;u;SEQUENZ(ZEILEN(x)-1);
y;SORTIEREN(HSTAPELN(x;ZEILE(x));{1.2};{1.-1});
z;HSTAPELN(y;INDEX(y;u+1)=INDEX(y;u));
WENN(WENNFEHLER(1/(1/INDEX(SORTIEREN(z;2);;3));"")=1;"doppelt";x));D3:D10)
bedeutet
Nimm C3:C10, klebe deren Zeilen dran
Sortiere C3:10 auf-, Zeilen ab-steigend.
Klebe den E-Mail-Vergleich an ("C4:C10=C3:C9"). Ein Feld fehlt, ergibt Fehler #NV
Sortiere nun diese 3 Spalten nach Zeilen (Gedächtnis-Sort) zurück
Neue Einspaltenausgabe: Bei 3.Spalte = WAHR verwende "doppelt, sonst C3:C10
Sollte in PQ genauso laufen
Anzeige
Hier befand sich noch die gekürzte dynFormel
17.10.2022 16:45:05
lupo1
... kann man aber zum Glück (jetzt unerläutert) noch sehen.
AW: thread weiter offen owT
17.10.2022 12:02:10
neopa
Gruß Werner
.. , - ...
AW: thread weiter offen owT
17.10.2022 14:35:15
Luschi
Hallo Werner,
hier mal mein Lösungsversuch, auch wenn damit die Anzahl der PQ-Schritte nicht wesentlich gesenkt werden konnte - aber ich bastle noch weiter dran.
https://www.herber.de/bbs/user/155714.xlsx
AW: Deine PQ-Lösung ...
17.10.2022 16:42:49
neopa
Hallo Luschi,
... benötigt zwar die gleich Anzahl an Schritten wie meine, könnte aber evtl. performanter sein. Das kann ich momentan noch nicht beurteilen. Ich danke Dir auf jeden Fall schon mal für diese Alternative.
Gruß Werner
.. , - ...
Anzeige
Mein erster PQ-Versuch
17.10.2022 15:58:56
lupo1

let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Start0" = Table.TransformColumnTypes(Quelle,{{"Name", type text}, {"E-Mail", type text}, {"Sonst", type text}}),
#"Index0" = Table.AddIndexColumn(#"Start0", "Index", 0, 1, Int64.Type),
#"Sort1" = Table.Sort(#"Index0",{{"E-Mail", Order.Ascending}, {"Index", Order.Ascending}}),
#"Index1" = Table.AddIndexColumn(#"Sort1", "Index.1", 0, 1, Int64.Type),
#"EMail" = Table.AddColumn(#"Index1", "EMail", each if #"Index1" [#"E-Mail"] {[#"Index.1"] - 1} = #"Index1" [#"E-Mail"] {[#"Index.1"]-0} then [#"E-Mail"] & " doppelt" else [#"E-Mail"]),
#"Sort2" = Table.Sort(EMail,{{"Index", Order.Ascending}}),
#"Del1" = Table.RemoveColumns(#"Sort2",{"E-Mail", "Index", "Index.1"}),
#"Order1" = Table.ReorderColumns(#"Del1",{"Name", "EMail", "Sonst"})
in
#"Order1"

Anzeige
AW: vielleicht findest Du ja nun auch ...
17.10.2022 16:44:07
neopa
Hallo lupo,
... an PQ etwas Gefallen.
Dein Lösungsvorschlag ähnelt übrigens meinem. Wenn Du das vorgegebene Ziel-Ergebnis zu 100% realisierst, kommst Du auf die gleiche Anzahl an Schritten wie Luschi und ich.
Vielleicht gibt es ja noch andere Alternativen.
Gruß Werner
.. , - ...
Ich habe mich halt an ...
17.10.2022 16:50:48
lupo1
... meiner 2. LET-Formel orientiert, die ja auch nicht weiter abzukürzen ist.
PQ und LET sind nicht nur vom Statement ähnlich, sondern auch vom fortschreitenden Code. Daher war mir der Inhalt, den ich erreichen wollte, von vornherein klar. Nur die Syntax von PQ ist halt ziemlich clumsy.
Anzeige
AW: M-Code ist aber interaktiv erstellbar owT
17.10.2022 17:32:26
neopa
Gruß Werner
.. , - ...
Ja, ist er, und "sinnvoller" als der VBA-Rekorder
17.10.2022 18:05:10
lupo1
... ich finde die PQ-Existenz gut, die PQ-Sprache ein wenig clumsy und persönlich brauchte ich PQ halt noch nicht.
AW: vielen Dank an WS-53 ...
18.10.2022 10:38:49
neopa
Hallo,
... die Lösung von WS-53 finde ich prima. Danke.
Ich verstehe die vorgenommen Realisierung auch vollständig, habe nur noch ein Problem sie selbst allein umzusetzen. Da muss ich noch dran arbeiten.
Gruß Werner
.. , - ...

Anzeige
Ich reiche den Dank weiter. :-)
18.10.2022 13:02:01
lupo1

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige