Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1488to1492
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

Zelleninhalt (differenziert) vergleichen?

Zelleninhalt (differenziert) vergleichen?
16.04.2016 18:01:01
daSilva
Hallo zusammen,
gibt es eine Möglichkeit den Inhalt von mehreren Zellen (die mehrere Inhalte haben)
auf Gemeinsamkeiten zu vergleichen?
Beispiel1:
Z1 (A; B; C)
Z2 (A)
Z3 (A; B)
Ergebnis: A
Beispiel2:
Z1 (A; B; C; D)
Z2 (A; C)
Z3 (A; B; C)
Ergebnis: A; B
Ich hoffe ihr versteht was ich damit meine.
mfg.

36
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zelleninhalt (differenziert) vergleichen?
16.04.2016 18:04:56
daSilva
sry Korrektur:
Beispiel2:
Ergebnis: A;C natürlich.

Ja, die gibt es, ...
17.04.2016 04:36:55
Luc:-?
…daSilva,
auch wenn du tatsächlich gemeinsame TeilTexte aller jeweils eine VglsGruppe bildenden Zellen herausfinden willst. Da nur du weißt, wie groß die Gruppen wdn können, scheint es mir nach reiflicher Überlegung angeraten, dir eine iterative Lösung zu emp­fehlen. Denn es muss ja Folgendes zuvor/dabei erledigt wdn, wenn man rationell arbeiten und ganz ohne Hilfszellen (und evtl auch VBA) auskommen will:
1. Alle TextTeilTrenner in den Zellen eines Blocks sollten angeglichen wdn.
2. Bei längeren Blöcken ist es sinnvoll, die Anzahl der TeilTexte pro Zelle festzustellen und zuerst die Zellen mit der kleinsten Anzahl untereinander zu vgln.
3. Was dabei an TeilTexten übrig bleibt, muss dann noch mit allen anderen TeilTexten pro Zelle vgln wdn, um das Endergebnis festzustellen.
Man kann nun mit Text-in-Spalten und der Angabe aller möglichen Trennzeichen und Festlegung ihrer Kombinierbarkeit arbeiten und/oder Formeln benutzen, die das ggf auch am Original vgln können.
Nun sind die beiden Bspp nicht komplex genug, um alle vorstellbaren Möglichkeiten abzudecken, aber ich habe versucht, beim folgenden Vorschlag sicher zu gehen:
Das Ergebnis wird iterativ in einer Hilfsspalte gebildet. Dabei wird der 1.Wert (hier in A2 bzw B2) einfach nur übernommen: I2[:J2]:=A2
Die Fmln in den folgenden Zeilen vgln dann die TeilTexte aus A/B mit dem jeweils letzten VglsErgebnis in I/J:
I3[:J3]: {=VJoin(WENN(ISTZAHL(SUCHEN(SplitVx(A3;{";".","." "});I2));SplitVx(A3;{";".","." "});"");;-1)}
I4[:J4]: {=VJoin(WENN(ISTZAHL(SUCHEN(SplitVx(A4;{";".","." "});I3));SplitVx(A4;{";".","." "});"");;-1)}
Wenn weitere Trennzeichen auftreten können, müssen sie in den {MatrixKonstanten} ergänzt wdn. Wird ein anderes Verbin­dungsZeichen für die ErgebnisTeilTexte gewünscht (hier Default=LeerZeichen), muss es als Text in das vorletzte (leere) Argument von SplitVx gesetzt wdn.
SplitVx und VJoin sind VBA-basierte sog UDFs, die im hiesigen Archiv vorhanden sind (beide in letztpublizierter Version nur in hoch­geladenen BspDateien; RECHERCHE benutzen!). Ihre Pgmm müssen in ein allgemeines Modul des VBA-Projekts der Datei kopiert wdn (die BspDateien zeigen das)!
Anmerk: Es gibt zwar noch eine andere analoge (und kürzere) Möglichkeit, aber deren UDFs sind nicht alle im Archiv vorhanden, ebensowenig wie die aktuelle VSplit-Version 1.3, mit der das durch eine einzige Fml pro Block erledigt wdn könnte.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: nachgehakt ...
17.04.2016 13:19:09
...
Hallo Luc,
... als ich gestern diesen thread las, hatte ich auch sofort an Deine UDFs gedacht.
Dein Verweis auf die RECHERCHE "schreckt" mE so manch potentielle Interessenten evtl. ab, weil man sich da leicht "verlieren" kann. Du hattest schon mal auf einen ähnlichen Hinweis von mir hin, Links auf den aktuellste öffentliche Version Deiner UDFs mit eingestellt, wo Interessenten schneller zum Ziel gelangen. Warum hast Du das nicht beibehalten? Das kostet Dich weder Aufwand noch Mühe, spart beides aber den Interessenten ein.
Gruß Werner
.. , - ...
oT. den thread mit NoNet hab ich bereits überflogen. Aber zu diesen wie zu den thread von Alesandro bzw. Deinen dortigen Ausführungen muss ich mir noch etwas Zeit nehmen. Jetzt aber geh ich erst mal wieder offline.

Anzeige
Aha, na dann mal sehn, ... ;-)
17.04.2016 13:57:23
Luc:-?
Werner;
übrigens habe ich inzwischen schon so oft Links im Archiv gesetzt, dass die RECHERCHE, deren Benutzung ohnehin auch von HWH in den Forums-FAQ als einer der 1.Schritte zur ProblemLösung angeraten wird, kein Problem sein sollte.
Bei Interesse sende ich dir nach Abschluss der Überarbeitung ohnehin die neuen L4/5 zu, darin ist dann auch die neue VSplit-Version 1.3 enthalten, die eine einzige Fml für das hier leider nicht aussagekräftig genug dargestellte Problem erlauben könnte:
A6[:B6]: {=VJoin(WENN(WENNFEHLER(VSplit(A2:A4;{"; ";", ";" "};;;1)=MTRANS(VSplit(A2:A4;{"; ";", ";" "};;;1));FALSCH);VSplit(A2:A4;{"; ";", ";" "};;;1);"");"; ";-1)}
…oder …
A7[:B7]: {=VJoin(WENN(WENNFEHLER(VSplit(A2:A4;"`; ´`, ´` ´";;;1)=MTRANS(VSplit(A2:A4;"`; ´`, ´` ´";;;1));FALSCH);VSplit(A2:A4;"`; ´`, ´` ´";;;1);"");", ";-1)}
Übrigens, daSilva,
dein Bsp1 hatte ich in A2:A4, Bsp2 in B2:B4 notiert. Es wäre natürlich auch möglich, statt SplitVx VSplit (Version 1.1) zu verwenden, dann kann aber nur 1 TrennZeichen angegeben wdn, muss also pro Fml ausgetauscht oder in einer weiteren Hilfsspalte, auf die die UDF dann zugreift, separat notiert wdn. Das wäre in dem Fall wichtig, dass ein TrennZeichen des einen Textes in einem anderen keines sein darf, was aus deinen Bspp nicht hervorgeht. Dann müsste auch Text-in-Spalten zeilenweise immer neu eingestellt oder per VBA durchgeführt wdn. Da ist (m)eine iterative UDF-Fml-Lösung (ggf mit Hilfsspalte für das jeweilige TrennZeichen) sicher günstiger.
Außerdem könnte man die TrennZeichen auch vereinheitlichen, wofür sich die UDF MaskOn (2005, NeuPosting 2014!) eignen könnte, wenn außer den TrennZeichen (auch in Kombi mit LeerZeichen) keine weiteren Sonder- und SatzZeichen, die erhalten bleiben müssen, in den Texten auftreten.
Gruß, Luc :-?

Anzeige
AW: nun gemeint war meinerseits ...
17.04.2016 20:55:17
...
Hallo Luc,
... potentielle andere Interessenten nicht nur evtl. z.B. daSilva und mich sondern eben auch Andere, die vielleicht selten das Forum nutzen.
Gruß Werner
.. , - ...

Und nun noch 1 iteratives VSplit-Bsp, denn ...
18.04.2016 03:17:37
Luc:-?
…ich fürchte, die SplitVx-Variante ist weniger günstig, weil zu komplex (Einbeziehung anderer UDFs und deshalb hier ggf Teile gesperrt, sowie nicht auf dem letzten Stand → Version 2.0 ist allerdings ganz neu, weil die 1-Fml-Variante bei diesen Bspp keine Rechteck-Matrix erzeugen kann und deshalb in der Vorversion eine komplizierte Fml verlangte):
 ABCDEFG
1Gruppe1IteratLösg1Formeln1    
2A; B; CA; B; C⇒A2    
3AA{=VJoin(WENN(ISTZAHL(SUCHEN(VSplit(A3;", ");B2));VSplit(A3;", ");"");;-1)}
4A BA{=VJoin(WENN(ISTZAHL(SUCHEN(VSplit(A4);B3));VSplit(A4);"");;-1)}
5Gruppe2IteratLösg2Formeln2    
6A; B; C; DA; B; C; D⇒A6    
7A, CA C{=VJoin(WENN(ISTZAHL(SUCHEN(VSplit(A7;", ");B6));VSplit(A7;", ");"");;-1)}
8A B CA C{=VJoin(WENN(ISTZAHL(SUCHEN(VSplit(A8);B7));VSplit(A8);"");;-1)}

Hier wird in fast jeder Fml das TrennZeichen gewechselt. Man kann die natürlich auch separat ermitteln und in eine weitere Hilfsspalte schreiben.
Beide UDFs sind bspw hier zu finden.
Morrn, Luc :-?

Anzeige
AW: hatte wohl eine zu unrealist. Vorstellung, ...
18.04.2016 19:20:53
...
Hallo Luc,
... und zwar die, das man mit Vsplit eine in Gänze auswertbare Matrix für die Datenwerte des gesamten Bereich A2:A## bilden könnte. Diese hätte ich der von mir angedachten Auswertungsfunktion ZÄHLENWENN() ja gar nicht übergeben können, weil ZÄHLENWENN() im ersten Argument nur Bereichsangaben unterstützt.
Dein "iterativer Lösungsansatz" erscheint mir doch etwas zu aufwendig.
Da kommt wohl doch nur eine VBA-Lösung, wie z.B. die von Daniel eingestellte in Frage. Das Aufsplitten der Daten mit der Excelstandardfunktionalität dürfte der Fragesteller wohl nur dann angestrebt haben, wenn es eher eine einmalige Angelegenheit ist.
Gruß Werner
.. , - ...

Anzeige
So unrealistisch war deine Vorstellung nicht, ...
18.04.2016 20:58:06
Luc:-?
…Werner;
dafür, dass das geht, habe ich die beiden anderen Fmln gezeigt, nur eben nicht mit der im Archiv enthal­tenen VSplit-Version 1.1. Dafür benötigt man Version 1.3 und deren Pgm ist 3× so lang, um ver­schiedene Trenn­zeichen verwenden und letztendlich auch eine Rechteck­Matrix erzeugen zu können. Die BspTexte haben nämlich unter­schied­liche Anzahlen von Text­Teilen. Eine daraus ent­stehende nicht-recht­eckige (irreguläre) Matrix (engl j/ragged array) könnte weder auf Zell­Bereiche abge­bildet noch in weiter­füh­renden Fktt als Argument benutzt wdn. Schon gar nicht in Fktt, die als Argument nur einen ZellBereich erwarten. SplitVx kann das zwar auch, ist aber aus o.g. Gründen ungünstiger (abge­sehen mal davon, dass nur die neue Version 2.0 eine irreguläre Matrix zu einer hier benötigten regulären machen kann). Tja, und dann wäre immer noch zu klären, ob mit einem gleichen Trenn­zeichen­Feld für alle Zellen gearbeitet wdn kann oder besser mit einem uU pro Zelle jeweils anderen Einzel­Trenn­zeichen gearbeitet wdn muss.
Gruß, Luc :-?
PS: Hast du noch einen Kommentar zur Sache INDEX in dualer MxFml?

Anzeige
AW: zu Deinem oT ...
19.04.2016 09:37:09
...
Hallo Luc,
... sorry, den anderen thread hatte ich dann doch aus dem Auge verloren. Vielleicht Morgen dann.
Gruß Werner
.. , - ...

Allerdings hast du recht und es muss noch ...
19.04.2016 02:30:50
Luc:-?
…gezählt wdn, Werner;
insofern war mein FmlAnsatz für nur 1 Fml falsch (beide Varianten). Mit den neuen Möglichkeiten von VSplit und dem Einsatz von HÄUFIGKEIT für PositionsNrn ergibt sich allerdings eine ellenlange Fml. Da wäre dann Daniels sehr spezielle, aber sonst recht ordentliche UDF ggf günstiger, aber das hängt davon ab, ob alle Trenn­Zeichen unique sind und nicht in manchen Texten womöglich nicht diese Funktion haben. In der folgd Abb zeige ich das mal im Vgl mit Daniels UDF-Lösung:
Userbild
Meine in der Abb nur angedeuteten Fmln lauten wie folgt …
Spalte B - Zeile 2(/6 analog):
{=PickOn(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;{"; ";", ";" "};;;1);MTRANS(A2:A4))); VSplit(A2:A4;{"; ";", ";" "};
;;1);"");;-2));VSplit(VJoin(1/(HÄUFIGKEIT(VERGLEICH(VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;{"; ";", ";" "};
;;1);MTRANS(A2:A4)));VSplit(A2:A4;{"; ";", ";" "};;;1);"");;-2)));VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;
{"; ";", ";" "};;;1);MTRANS(A2:A4)));VSplit(A2:A4;{"; ";", ";" "};;;1);"");;-2)));0);ZEILE(A1:A9)) =ZEILEN(A2:A4))*ZEILE(A1:A9);
;-2);;1))}
Spalte B - Zeile 10:
{=PickOn(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A10:A13;{", ";" ";"; ";" "};;;1);MTRANS(A10:A13))); VSplit(A10:A13;
{", ";" ";"; ";" "};;;1);"");;-2)); VSplit(VJoin(1/(HÄUFIGKEIT(VERGLEICH(VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(
A10:A13;{", ";" ";"; ";" "};;;1);MTRANS(A10:A13)));VSplit(A10:A13;{", ";" ";"; ";" "};;;1);"");;-2)));VSplit(GLÄTTEN(VJoin(WENN(
ISTZAHL(FINDEN(VSplit(A10:A13;{", ";" ";"; ";" "};;;1);MTRANS(A10:A13)));VSplit(A10:A13;{", ";" ";"; ";" "};;;1);"");;-2)));0);
ZEILE(A1:A9))=ZEILEN(A10:A13))*ZEILE(A1:A9);;-2);;1))}
Spalte C - Zeile 2(/6 analog):
{=PickOn(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;"`; ´`, ´` ´";;;1);MTRANS(A2:A4))); VSplit(A2:A4;"`; ´`, ´` ´";;;1);
"");;-2));VSplit(VJoin(1/(HÄUFIGKEIT(VERGLEICH(VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;"`; ´`, ´` ´";;;1);
MTRANS(A2:A4)));VSplit(A2:A4;"`; ´`, ´` ´";;;1);"");;-2)));VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A2:A4;"`; ´`, ´` ´";
;;1);MTRANS(A2:A4)));VSplit(A2:A4;"`; ´`, ´` ´";;;1);"");;-2)));0);ZEILE(A1:A9))=ZEILEN(A2:A4))*ZEILE(A1:A9);;-2);;1))}
Spalte C - Zeile 10:
{=PickOn(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A10:A13;"`; ´`, ´` ´";;;1);MTRANS(A10:A13))); VSplit(A10:A13;
"`; ´`, ´` ´";;;1);"");;-2));VSplit(VJoin(1/(HÄUFIGKEIT(VERGLEICH(VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(VSplit(A10:A13;
"`; ´`, ´` ´";;;1);MTRANS(A10:A13)));VSplit(A10:A13;"`; ´`, ´` ´";;;1);"");;-2)));VSplit(GLÄTTEN(VJoin(WENN(ISTZAHL(FINDEN(
VSplit(A10:A13;"`; ´`, ´` ´";;;1);MTRANS(A10:A13)));VSplit(A10:A13;"`; ´`, ´` ´";;;1);"");;-2)));0);ZEILE(A1:A9))=ZEILEN(
A10:A13))*ZEILE(A1:A9);;-2);;1))}
Möglicherweise könnte einer Fml-Freaks (ggf ja du ;-]), mit passenden Universal-UDFs ausgerüstet, noch eine kürzere Fml kreieren. Mit StandardFktt wird das aber kaum möglich sein.
Morrn, Luc :-?
PS: Würde ja gern wissen, warum manche Leute (wie hier daSilva) Fragen in die Welt setzen und sich dann augenscheinlich nicht mehr darum kümmern. Kein sozial-normatives Verhalten!

Anzeige
AW: da hast Du Recht, ...
19.04.2016 09:32:29
...
Hallo Luc,
... eine derartige Lösung wird wohl niemand wirklich anwenden wollen.
Zu Deinem PS. Leider setzt sich ein derartiges Verhalten scheinbar immer mehr durch. Um dies künftig in Foren einzudämmen bedarf es mE neuere zumindest aber angepasster Konzepte für Forumssoftware wie deren Betreibung und Nutzung. Doch wer verlässt sich gern ausgetretene Pfade? Zumal man dann nie weiß, ob diese dann auch zum Ziel führen.
Gruß Werner
.. , - ...

Ja, die gefällt mir auch nicht, aber immerhin ...
20.04.2016 01:08:19
Luc:-?
…geht's so, Werner;
ein HptProblem bei einer Zusammenfassung aller Texte einer Gruppe besteht ja in der unterschiedl Anzahl ihrer TeilTexte, was in nur einer Fml bedeutet, dass die Längen (ElementeAnzahl) der entstehenden Vektoren aneinander angeglichen wdn müssen, weil eine derart „ausgefranste“ (nicht-rechteckige) Matrix nicht auf ZellBereiche abgebildet und deshalb iaR auch nicht als Argument einer anderen Fkt verwendet wdn kann (in VBA ggf als ParamArray), was hier aber erforderlich ist.
Im folgenden Bsp wurden die aus dem Splitten resultierenden Vektoren aneinander angeglichen, so dass die automatische Xl-Kon­version solcher aus Einzel­Vektoren bestehenden Matrizen wirksam wdn kann:
 MNOPQRST
1Bspp1…3 - Split-Variante1Bspp1…3 - Split-Variante2
2ABC ABC 
3A   A   
4AB  AB  
5M2:O4: {=VSplit(A2:A4;{"; ";", ";" "};;;1)}Q2:S4: {=VSplit(A2:A4;{"; ".", "." "};;;1)}
6ABCDABCD
7AC  AC  
8ABC ABC 
9M6:P8: {=VSplit(A6:A8;{"; ";", ";" "};;;1)}Q6:T8: {=VSplit(A6:A8;{"; ".", "." "};;;1)}
10axaxxzuaaxaxxzua
11asxaxzuasxaxzu
12axa bxzu axabxzu
13zuaxa zuaxa 
14M10:P13: {=VSplit(A10:A13;{", ";" ";"; ";" "};;;1)}Q10:T13: {=VSplit(A10:A13;{"; ".", "." "};;;1)}
Die blauen Werte in Bsp3 zeigen die Abweichung zwischen beiden Varianten: In Var1 ist der Arg2- genauso ausge­richtet wie der Arg1-Vektor und muss deshalb auch gleich­viel Elemente haben, die jeweils einzeln auf das entsprd Element von Arg1 ange­wendet wdn; in Var2 ist das nicht der Fall, demzu­folge wdn alle Elemente des Arg2-Vektors auf jedes Element des Arg1-Vektors ange­wendet. In beiden Varianten wird das Arg1- auf dem jewei­ligen Arg2-Element getrennt. Wird eine andere, ggf auch dif­feren­zierte Behand­lung einzelner Trenn­Zeichen gewünscht, muss eine Trenn­Zeichen­Liste als Arg2 verwendet wdn. Das können dann auch unter­schied­liche Listen pro Arg1-Element sein, die in einem Arg1 gleich­gerich­teten Vektor zusam­men­gefasst wdn. In dieser Liste wdn die Trenn­Zeichen von bestimmten Markie­rungen einge­fasst, die die Art der Trennung bezeich­nen → `auf´, ´vor´, `nach` bzw ´vor und nach` dem Trenn­Zeichen bzw -Text. Arg3 ist wie bisher für die Umwand­lung nume­rischer Werte in echte Zahlen zustän­dig, während die neuen Arg4/5 die entstan­dene Ergebnis­Matrix nach­behan­deln — Arg5 → Normie­rung der Vektor­Längen auf gleiche (Maximal-)Länge (Rechteck­Matrix!), Arg4 → abschlie­ßende interne Transpo­nierung (mit MTRANS - nur inner­halb der Limits dieser XlFkt möglich, anderen­falls extern UDF Reflect o.Ä. verwenden!). Bei Anwendung der UDF in Sub­Proze­duren* sollte dieses Feature genutzt wdn, weil man dann auf eine der 2 sonst erforder­lichen Transpo­nie­rungen (auf welche Art auch immer vorge­nommen) verzichten kann.
Die UDF kann übrigens auch unzusammen­hängende Zell­Bereiche in Arg1 verarbeiten, die dann zu einem Vektor zusammen­gefasst wdn. Auf diese Weise kann man auch 2dZell­Bereiche, in Einzel­Vektoren zerlegt, angeben, zB: (A1:A5;B1:B5;C1:C5)
* Eine Matrix aus gleichlangen Einzel­Vektoren wird als Ergebnis einer in einer Zell­Fml einge­setzten UDF von Xl automatisch in eine 2d­Matrix konvertiert; einer Sub­Proz steht das nicht zV!
Luc :-?
PS: Bei bekundetem Interesse lade ich den UDF-Code hoch oder poste ihn bzw sende ihn an (mir) bekannte eMail-Adressen (zum Testen!). Habe aber gerade eine Unregel­mäßigkeit entdeckt und muss deshalb noch mal ran.

Anzeige
AW: zu Deiner Variante 2 ...
20.04.2016 09:35:36
...
Hallo Luc,
... die ist wohl die, die ursprünglich vom Fragesteller bzgl. der Splittung angestrebt war. Dies hatte ich ja in meinem vorigen Beitrag auch schon angesprochen. Dies müsste mE zumindest gewährleiste sein. Momentan wäre die Zerlegung damit noch Zeilenweise notwendig? Aber selbst bei Bereitstellung einer Datenmatrix hat man mE noch keine wirklich gute Alternative für die von Daniel und Michael aufgezeigte VBA-Lösungen. Eine reine Formel-UDF-Lösung wäre (m)eine Zielstellung gewesen, die aber mE nach wie unrealistisch ist, weil die Auswertungsfunktion ZÄHLENWENN() dann nicht "mitspielen" würde.
Gruß Werner
.. , - ...

Anzeige
Ich weiß nicht, ob er Variante 2 angestrebt ...
20.04.2016 13:47:11
Luc:-?
…hätte, Werner,
er hat sich ja nicht dazu geäußert, ob die verschiedenen TrennZeichen nur zufällig sind oder den Grund haben, dass ein Trennzeichen des einen Textes in einem anderen kein TrennZeichen ist bzw sein darf.
Luc :-?

AW: eine reine Formel-UDF-Lösung...
20.04.2016 14:18:38
Daniel
... habe ich doch schon gezeigt, Werner.
Gruß Daniel

AW: das ist schon richtig, doch ich meinte ...
20.04.2016 14:24:37
...
Hallo Daniel,
... eine Formellösung basierend auf einer allgemeinen UDF von Luc.
Gruß Werner
.. , - ...

AW: das ist schon richtig, doch ich meinte ...
20.04.2016 14:54:59
Daniel
Hi
wenn du das so meinst, warum schreibst du dann das nicht so?
Gruß Daniel

AW: ich hatte Luc angeschrieben, nicht Dich owT
20.04.2016 15:00:52
...
Gruß Werner
.. , - ...

AW:was ändert das?
20.04.2016 15:12:55
Daniel
auch wenn du mit Luc direkt sprichst, solltst du die Sachen so beschreiben, wie du sie meinst.
vorallem, wenn du immer noch im öffentlichen Raum bist.
Gruß Daniel

AW: Du willst streiten, ich aber nicht! owT
20.04.2016 15:37:37
...
Gruß Werner
.. , - ...

...Das haben wir auch gewürdigt, ...
20.04.2016 18:18:01
Luc:-?
…Daniel,
warum dann also streiten?! Das Problem mit allen ZellFml-Fktt inkl UDFs liegt doch in ihrer Art begründet, die man ganz allgemein wie folgt kategorisieren kann → Fktt, die …
1. einen Wert in einen anderen umwandeln,
2. mehrere Werte zu einem verdichten,
3. einen Wert in mehrere aufteilen,
4. mehrere Werte zu mehreren anderen verarbeiten.
Neben diesem allgemeinen Quelle-Ergebnis-Zusammen­hang kommt es noch darauf an, in welcher Umgebung sie agieren können. Da wären einmal die Fktt, die …
- auf eine ganz bestimmte Umgebung ausgerichtet sind, also nur Werte eines bestimmten Typs oder einer bestimmten Herkunft ver­arbeiten können → dazu gehören nahezu alle neueren Xl-Fktt (ZÄHLENWENN & Co und auch deine hier gezeigte); sie sind eingangs­seitig idR solitär, können also keine Ergebnisse anderer Fktt direkt verarbeiten (nur indirekt über Hilfszellen);
- auch eingangsseitig mit anderen Fktt und auch ganzen Fmln kommunizieren können → echte Team Player also, wie die meisten der ältesten (ursprünglichen) Xl-Fktt.
Unter einer allgemeinen UDF (bzw auch Standard-Fkt) verstehen Werner und ich also eine, die im Rahmen ihrer Aufgabe alle mög­lichen Umgebungen akzeptiert und mit ihnen zurechtkommt, denn das ist ja dann auch das (Universal-)Werkzeug, das ein Fml-Kon­strukteur benötigt.
Eine spezielle UDF zu schreiben, mag mehr oder auch weniger leicht fallen, eine UDF aber so auszulegen, dass sie mit unter­schied­lichen Umgebungen zurecht­kommt, kann schon recht kompliziert wdn (hängt auch von ihrer Aufgabe ab, weshalb mitunter auch eine einschränkende Umgebungs­festlegung erforder­lich ist, was bei den ~WENNs-Fktt aber nicht not­wendig gewesen wäre).
Das, wofür ein Pgmmierer eine App oder hier eben eine VBA-Sub­Prozedur (ggf auch als FktsProz) schreiben könnte oder würde, versucht ein Fml-Nutzer aus vorhan­denen Bau­steinen, Xl-StandardFktt (und ggf auch noch UDFs), zusammen­zustellen, was ganz im Sinne der Xl-Schöpfer sein dürfte (und auch meinem ist). Dass das nicht immer (rationell) geht, ist eine ganz andere Frage.
Nebenbei, mit einer kleinen Verbesserung bzgl ihres 2.Arguments könntest du deine UDF leicht auf das Niveau spezieller Xl-Standard­Fktt heben, wobei natürlich, ergänzend zur o.g. Fkts­Kategori­sierung, noch eine qualifizierte Fehler­Ausgabe zur Anwender­Unter­stützung (Erleich­te­rung der Fehler­Suche) käme.
Gruß, Luc :-?
PS: Übrigens, wie öffentlich der Raum dieses Forums ist, liegt allein im Ermessen seines Betreibers… ;-)

Übrigens kann man das VSplit-Ergebnis ...
22.04.2016 14:21:42
Luc:-?
…auch mit der dir vorliegenden UDF RegAr normieren, Werner,
dann würde VSplit-Version 1.1 ausreichen, allerdings müsste dann in der PrinzipL-Datei noch eine Klassenmodul-Routine ergänzt wdn (für SplitVx hatte ich eine angelegt, weiß aber nicht mehr, ob du das schon in der Form hast).
Habe zZ nur wenig Zeit dafür, aber irgendwann bekommst du die überarbeitete Version. ;-)
Gruß, Luc :-?

...Das ich anbetracht des ZusatzBsps nun ...
19.04.2016 23:29:33
Luc:-?
…doch noch korrigieren muss:
 ABCDEFGHIJK
1BspGruppe1IteratLösg1Formeln1     ListTexte1ListText-Formeln1
2A; B; CA B C⇒WECHSELN(A2;"; ";" ")A|B|C⇒WECHSELN(A2;"; ";"|")
3AA⇒VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A3;", ")&" ";" "&B2&" "));VSplit(A3;", ");"");;-1)A⇒ISet(I2;WECHSELN(A3;", ";"|");"|")
4A BA{=VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A4)&" ";" "&B3&" "));VSplit(A4);"");;-1)}A⇒ISet(I3;WECHSELN(A4;" ";"|");"|")
5BspGruppe2IteratLösg2Formeln2     ListTexte2ListText-Formeln2
6A; B; C; DA B C D⇒WECHSELN(A6;"; ";" ")A|B|C|D⇒WECHSELN(A6;"; ";"|")
7A, CA C⇒VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A7;", ")&" ";" "&B6&" "));VSplit(A7;", ");"");;-1)A|C⇒ISet(I6;WECHSELN(A7;", ";"|");"|")
8A B CA C{=VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A8)&" ";" "&B7&" "));VSplit(A8);"");;-1)}A|C⇒ISet(I7;WECHSELN(A8;" ";"|");"|")
9BspGruppe3IteratLösg3Formeln3     ListTexte3ListText-Formeln3
10ax, axx, zu, aax axx zu a⇒WECHSELN(A10;", ";" ")ax|axx|zu|a⇒WECHSELN(A10;", ";"|")
11a sx ax zua ax zu{=VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A11)&" ";" "&B10&" "));VSplit(A11);"");;-1)}ax|zu|a⇒ISet(I10;WECHSELN(A11;" ";"|");"|")
12ax; a bx; zuax zu{=VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A12;"; ")&" ";" "&B11&" "));VSplit(A12;"; ");"");;-1)}ax|zu⇒ISet(I11;WECHSELN(A12;"; ";"|");"|")
13zu ax azu ax{=VJoin(WENN(ISTZAHL(SUCHEN(" "&VSplit(A13)&" ";" "&B12&" "));VSplit(A13);"");;-1)}ax|zu⇒ISet(I12;WECHSELN(A13;" ";"|");"|")
Das fktt auf jeden Fall mit den letzten, im Archiv vorhandenen Versionen der beiden UDFs (1.4 bzw 1.1).
Nachgestellt habe ich hier eine weitere, einfachere Möglichkeit einer iterativ-kumulativen Lösung mit meiner alten UDF ISet, die sog ListenTexte (TextMenge in einem Text) zueinander in Beziehung setzt, hier als SchnittMenge 2er solcher Texte. Die UDF ist in ein AddIn eingebunden und benutzt intern 2 weitere UDFs aus diesem, so dass sie nicht oW gepostet wdn kann (das ist bei den meisten meiner älteren UDFs so!).
Luc :-?

AW: hier setzt Du aber voraus, ...
20.04.2016 08:54:32
...
Hallo Luc,
... das in jeder Datenzeile ein gleiches Trennzeichen verwendet wurde. Denn anderenfalls müsste in A12 auch "a bx" noch getrennt werden und dann müsste ins Ergebnis auch noch a einfließen.
Gruß Werner
.. , - ...

Nee, nee, d.Fmln arbeiten schon m.verschiedenen …
20.04.2016 13:43:49
Luc:-?
…TrennZeichen (VSplit), Werner,
bloß im Ergebnis ist es immer nur eines, weshalb dann mit/auf LeerZeichen-Umrahmung gesucht wdn kann.
Luc :-?

AW: Zelleninhalt (differenziert) vergleichen?
16.04.2016 18:06:17
ransi
Hallo,
Steht das wirklich so in den Zellen ?
Mit ( und ; und Leerzeichen und ) ?
ransi

AW: Zelleninhalt (differenziert) vergleichen?
16.04.2016 18:38:23
daSilva
Nein die Klammern habe ich nur hier hinzugefügt. Wie ich einzelnen Werte (in diesem Fall die Buchstaben A B ..) voneinander getrennt sind ist auch variabel, d.h. es geht A;B;C ... A,B,C oder A B C etc.

AW: Zelleninhalt (differenziert) vergleichen?
17.04.2016 12:19:22
Daniel
Hi
wenn VBA eine Option ist, dann so:
1. schreibe folgenden Code in ein allgemeines Modul (Modul 1)

Function GemeinsameZellinhalte(Bereich As Range, TrennZeichen As String) As String
Dim dic As Object
Dim Ergebnis As String
Dim i
Dim TeilText
Dim txt As String
Dim Zelle As Range
Dim Anzahl As Long
Set dic = CreateObject("Scripting.dictionary")
For Each Zelle In Intersect(Bereich, Bereich.Worksheet.UsedRange)
txt = Zelle.Value
If txt  "" Then
Anzahl = Anzahl + 1
'--- Trennzeichen vereinheitlichen
For i = 1 To Len(TrennZeichen)
txt = Replace(txt, Mid(TrennZeichen, i, 1), "|")
Next
'--- Direkt auf einander folgende Trennzeichen zusammen fassen
Do Until InStr(txt, "||") = 0
txt = Replace(txt, "||", "|")
Loop
'--- Text aufteilen und Vorkommen der Teiltexte zählen
For Each TeilText In Split(txt, "|")
dic(TeilText) = dic(TeilText) + 1
Next
End If
Next
'--- Teiltexte ermitteln, die in jeder Zelle vorkommen
For Each TeilText In dic.keys
If dic(TeilText) = Anzahl Then
Ergebnis = Ergebnis & "; " & TeilText
End If
Next
'--- Ergebnis ausgeben
If Ergebnis = "" Then
GemeinsameZellinhalte = "# keine Gemeinsamkeiten"
Else
GemeinsameZellinhalte = Mid(Ergebnis, 3)
End If
End Function
2. Schreibe dann in eine Zelle die Formel:
=GemeinsameZellinhalte(A1:A3;" ,;")

der erste Parameter sind die Zellen, die du vergleichen willst, im zweiten Parameter musst du die verwendeten Trennzeichen angeben, es dürfen auch mehrere sein.
Voraussetzung für ein korrektes Ergebnis ist, dass ein Teiltext in einer Zelle nur einmal vorkommt.
ohne VBA könntest du so vorgehen:
1. teile den Text mit DATEN - DATENTOOLS - TEXT IN SPALTEN auf.
wenns verschiedene Trennzeichen gibt (Komma, Semikolon, Leerzeichen), dann kannst du die alle angeben.
2. das Ergebnis kannst du dir dann mit einer etwas komplexeren Matrix-Formel ausgeben lassen, diese schaust du dir am besten in der Beispieldatei an (Matrixformel bedeutet, dass du die Eingabe immer mit STRG+SHIFT+ENTER abschließen musst.
wenn des reicht, die gleichen Texte farblich zu markieren, dann kannst du auch in der mit TEXT IN SPALTEN erzeuten Tabelle die Werte, die in allen Zeilen vorkommen, mit der Bedingten Formatierung mit folgender Formel als Regel markieren:
(A1:C3 sein der Zellbereich, der die Einzelwerte enthält):
=ZählenWenn($A$1:$C$3;A1)=Zeilen($A$1:$C$3)
Beispieldatei mit den Lösungsmöglichkeiten:
https://www.herber.de/bbs/user/105020.xlsm
Gruß Daniel

AW: die Formelauswertung kann einfacher sein ...
18.04.2016 19:20:57
...
Hallo Daniel,
... wenn das Aufsplitten der Daten mit der Excelstandardfunktionalität eine Option sein sollte und die aufgesplitteten Zellwert in B2:ZZ99 stehen sollten, dann einfach:
=INDEX(2:2;1+VERGLEICH(ANZAHL2(B2:B99);INDEX(ZÄHLENWENN(B2:ZZ99;B2:ZZ2););))
(Als {}-Matrixformel noch kürzer so:
{=INDEX(2:2;1+VERGLEICH(ANZAHL2(B2:B99);ZÄHLENWENN(B2:ZZ99;B2:ZZ2);))}
Allerdings gilt für unsere beiden Formel, dass dann in den aufgesplitteten Datensätzen je Zeile keine Werte-Duplikate vorhanden sein dürfen.
Gruß Werner
.. , - ...

Mini-Erweiterung VBA
19.04.2016 07:26:59
Michael
Hi zusammen,
mit zwei minimalen Änderungen dürfen Werte innerhalb beliebiger Zellen auch mehrfach vorkommen:
Function GemeinsameZellinhalte2(Bereich As Range, TrennZeichen As String) As String
Dim dic As Object
Dim Ergebnis As String
Dim i
Dim TeilText
Dim txt As String, vgltxt As String
Dim Zelle As Range
Dim Anzahl As Long
Set dic = CreateObject("Scripting.dictionary")
For Each Zelle In Intersect(Bereich, Bereich.Worksheet.UsedRange)
txt = Zelle.Value
If txt  "" Then
Anzahl = Anzahl + 1
'--- Trennzeichen vereinheitlichen
For i = 1 To Len(TrennZeichen)
txt = Replace(txt, Mid(TrennZeichen, i, 1), "|")
Next
'--- Direkt auf einander folgende Trennzeichen zusammen fassen
Do Until InStr(txt, "||") = 0
txt = Replace(txt, "||", "|")
Loop
'--- Text aufteilen und Vorkommen der Teiltexte zählen
For Each TeilText In Split(txt, "|")
vgltxt = dic(TeilText)            ' ****
If InStr(vgltxt, Zelle.Address) = 0 Then _
dic(TeilText) = dic(TeilText) & Zelle.Address ' ****
Next
End If
Next
'--- Teiltexte ermitteln, die in jeder Zelle vorkommen
Anzahl = Anzahl * 2        ' ****
For Each TeilText In dic.keys
'    MsgBox UBound(Split(dic(TeilText), "$"))
If UBound(Split(dic(TeilText), "$")) = Anzahl Then ' ****
Ergebnis = Ergebnis & "; " & TeilText
End If
Next
'--- Ergebnis ausgeben
If Ergebnis = "" Then
GemeinsameZellinhalte2 = "# keine Gemeinsamkeiten"
Else
GemeinsameZellinhalte2 = Mid(Ergebnis, 3)
End If
End Function
@Daniel: kannst Du mir bitte verdeutlichen, wozu das Intersect gut ist? Oder so: wo wäre denn ein möglicher Fallstrick, wenn man den bereich "direkt" verwendet?
Schöne Grüße,
Michael

AW: Mini-Erweiterung VBA
19.04.2016 09:20:35
Daniel
Hi
Das Intersect mit der UsedRange erlaubt es, ganze Spalten oder Zeilen als Zellbereich in der Formel anzugeben , ohne dass es zu extrem langen Rechenzeiten kommt (vgl. ZählenWenn vs. SummenProdukt)
Ist hier wahrscheinlich eher unnötig, baue ich aber standardmäßig in meine UDFs ein.
Gruß Daniel

AW: Dein Ansatz ist mE notwendig ...
19.04.2016 09:37:04
...
Hallo Michael,
... denn bei einer derartigen Aufgabenstellung kann man Duplikate mE nicht von vorn herein ausschließen.
Ausgetestet hab ich Deine Lösung allerdings nicht und eine äquivalente Formellösung (nach vorheriger Aufsplittung in Hilfszellen) spare ich mir auch, denn da würde ich wohl zu viel unnötige Zeit investieren. Schönen Tag dann noch.
Gruß Werner
.. , - ...

AW: Dein Ansatz ist mE notwendig ...
19.04.2016 10:43:22
Daniel
Hi
Doppelte Vorkommen innerhalb einer Zelle würde ich eher so behandeln, dann wird jeder Wert pro Zelle nur einmal gezählt:

'--- Text aufteilen und Vorkommen der Teiltexte zählen
Set dicCheckDoppelt = CreateObject("Scripting.dictionary")
For Each TeilText In Split(txt, "|")
If Not dicCheckDoppelt.exists(TeilText) Then
dic(TeilText) = dic(TeilText) + 1
dicCheckDoppelt(TeilText) = 0
End If
Next
Gruß Daniel

AW: Dein Ansatz ist mE notwendig ...
19.04.2016 16:21:34
Michael
Hi,
@Daniel: aha! Klingt logisch, da wäre ich jetzt nicht draufgekommen, ich behalt's mal im Hinterkopf.
Deine Variante mit zwei Dics ist bei sehr vielen Daten womöglich schneller, ist es nicht?
@Werner: in dem Zusammenhang muß ich Dir gestehen, daß ich auch nicht JEDE Deiner Formellösungen teste...
Insgesamt finde ich aber schade, daß sich der Fragesteller an unserer angeregten Diskussion nicht mehr beteiligt: business as usual.
Gute Zeit und schöne Grüße,
Michael

Wir kommen ja auch ohne ihn zurecht! ;-) orT
19.04.2016 23:14:54
Luc:-?
Gruß, Luc :-?

AW: Dein Ansatz ist mE notwendig ...
20.04.2016 11:44:40
Daniel
Hi
obs schneller ist, müsste man testen.
ich finde es halt logischer, zu prüfen ob der Wert innerhalb der Zelle schon mal vorkam.
Gruß Daniel

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige