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

Vergleich Zeichenkettenfolgen

Vergleich Zeichenkettenfolgen
05.04.2013 13:27:33
Joerschi
Hallo liebes forum,
ich möchte via Formel auslesen lassen, wie oft direkt hintereinander (also ununterbrochen) die gleichen Werte aus einer Ausgangs-Zeichenkette (je Zelle ein Zeichen) in einer Ziel-Zeichenkette vorkommen.
Zwei Beispiele (farbige Markierungen zur grafischen Verdeutlichung):
Userbild
Im Beispiel 2 in die Kleinste Abfolge = 1, weil es in den direkt nebenstehenden Zeichen keine Übereinstimmung gibt.
Theoretisch kann das Ergebnis jedoch auch = 0 sein, wenn kein Zeichen der Ausgangsreihe mit der Vergleichsreihe übereinstimmt.
Beispieldatei: https://www.herber.de/bbs/user/84735.xls
Kennt jemand einen Formelansatz oder Idee für die farbig markierten Zellen der Spalten AD + AE?
Vielen Dank im Voraus
Joerschi

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

Betreff
Datum
Anwender
Anzeige
Du hast aber auch immer ..
05.04.2013 13:50:13
JACKD
Problemstellungen =)

AW: Du hast aber auch immer ..
05.04.2013 13:54:17
Joerschi
:-))
Ich weiß, versuche sie auch immer so gut als möglich zu umschreiben mit Grafik etc.
Das hier denke ich ist aber (hoffentlich?) eines der einfacheren Sachen

AW: Du hast aber auch immer ..
05.04.2013 13:56:54
JACKD
Die Problemstellung ist klar,
mir fällt dazu aber spontan keine Formelkonstellation ein, ich würd es versuchen mit einem Makro zu "erschiessen" =)
Aber das hat nix zu bedeuten. Da gibt es hier bei weitem patentere Leute =)
Grüße

Längste übereinstimmende Serie (VBA)
05.04.2013 18:50:39
Erich
Hi Jörg,
das mit der größten Serie habe ich hoffentlich richtig verstanden.
Bei der kleinsten Serie kommt m. E. immer 0 oder 1 raus - das ist also wohl eher uninteressant.
Hier mein Ansatz für die größte Serie. Die beiden zu vergleichenden Bereiche müssen dabei nicht gleich groß
und nicht gleich "geformt" sein. Ein Beispiel:
 ABCDEFGH
2Beispiel 3 b     
3  c     
4  c bbbc
5  a accc
6  c acca
7  c     
8  c     
9  a     
10  b   6 
11  a     

Formeln der Tabelle
ZelleFormel
G10=MaxSerie(C2:C11;E4:H6)

Für deine beiden Beispiele würde man in AE4 schreiben: =MaxSerie(B4:N4;P4:AB4), dann auf AE5 kopieren.
Und hier der Code der Funktion:

Option Explicit
Function MaxSerie(rngT As Range, rngV As Range)
Dim lngT As Long, lngV As Long
Dim mm As Long, tt As Long, vv As Long, ii As Long
lngT = rngT.Cells.Count
lngV = rngV.Cells.Count
For mm = Application.Min(lngT, lngV) To 1 Step -1
For tt = 1 To lngT - mm + 1
For vv = 1 To lngV - mm + 1
For ii = 0 To mm - 1
If rngT(tt + ii)  rngV(vv + ii) Then Exit For
Next ii
If ii = mm Then MaxSerie = mm: Exit Function
Next vv
Next tt
Next mm
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Allen ein schönes Wochenende!

Anzeige
AW: Längste übereinstimmende Serie (VBA)
05.04.2013 19:22:21
Joerschi
Hi Erich,
Herzlichen Dank - funktioniert perfekt.
Das Minimum ist jedoch nicht sooo wichtig (kann aber auch größer als 0 oder 1 sein - siehe Beispiel 1 oben).
Ich dachte zuerst als Lösungsweg daran, dass man gleiche Zeichen mit 1 und ungleiche Zeichen mit 0 in einer Hilfszeile bestimmt. Dummerweise hätte sich dann das Problem nur verschoben, weil man immer noch klären muss, wie man nur aufeinanderfolgende Einser ohne Unterbrechung bestimmt/zählt.
danke nochmal und Beste Grüße
Jörg

Doch noch ein Bug...
05.04.2013 20:04:30
Joerschi
Hi Erich,
irgendwo hat sich doch noch ein Bug eingeschlichen :-(.
Das werden die Maximumwerte falsch gezählt.
Siehe hier:
Userbild
Beispieldatei: https://www.herber.de/bbs/user/84750.xls
Ist der fehler im Code?
Beste Grüße
Joerschi

Anzeige
It's not a bug, it's a feature...
06.04.2013 02:06:22
Erich
Hi Jörg,
vermutlich habe ich die Aufgabe doch nicht richtig verstanden.
Die Funktion rechnet schon irgendwie richtig, nur eben nicht das, was du möchtest. :-(
Sie erkennt in den Beispielen die grün bezeichneten Bereiche als längste Serien:
 BCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAE
312345678910111213 12345678910111213 Fkt?
62112020000210 0000101000000 43
70010010101121 0100000000100 52
80101000021111 0110211220222 42

Formeln der Tabelle
ZelleFormel
AD6=MaxSerie(B6:N6;P6:AB6)
AD7=MaxSerie(B7:N7;P7:AB7)
AD8=MaxSerie(B8:N8;P8:AB8)

Nun hab ich's kapiert: Es geht dir nicht nur um die längste/kürzeste Serie von Übereinstimmungen.
Die Serien müssen sich auch an genau denselben Positionen befinden.
Ist es dann das hier?
 ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAE
3Position12345678910111213 12345678910111213 MaxMin
4Beispiel 1ababccacccaaa abbcbcacccacc 62
5Beispiel 2ababbbabcbaba bcaccbccababa 41
6Beispiel 32112020000210 0000101000000 31
7Beispiel 40010010101121 0100000000100 21
8Beispiel 50101000021111 0110211220222 21

Formeln der Tabelle
ZelleFormel
AD4=MaxSerie(B4:N4;P4:AB4)
AE4=MinSerie(B4:N4;P4:AB4)

Und hier die Codes:

Option Explicit
Function MaxSerie(rngT As Range, rngV As Range)
Dim lngT As Long, mm As Long, tt As Long, ii As Long
lngT = rngT.Cells.Count
If lngT = rngV.Cells.Count Then
For mm = lngT To 1 Step -1
For tt = 1 To lngT - mm + 1
For ii = 0 To mm - 1
If rngT(tt + ii)  rngV(tt + ii) Then Exit For
Next ii
If ii = mm Then MaxSerie = mm: Exit Function
Next tt
Next mm
Else
MaxSerie = xlErrNA
End If
End Function
Function MinSerie(rngT As Range, rngV As Range)
Dim lngT As Long, mm As Long, tt As Long, ii As Long
Dim arT(), ee As Long
Const varW = "#äö"
lngT = rngT.Cells.Count
If lngT = rngV.Cells.Count Then
ReDim arT(1 To lngT)
For tt = 1 To lngT
arT(tt) = rngT(tt)
Next tt
For mm = lngT To 1 Step -1
For tt = 1 To lngT - mm + 1
For ii = 0 To mm - 1
If arT(tt + ii) = varW Or _
arT(tt + ii)  rngV(tt + ii) Then Exit For
Next ii
If ii = mm Then
ee = mm
For ii = 0 To mm - 1
arT(tt + ii) = varW
Next ii
End If
Next tt
Next mm
MinSerie = ee
Else
MinSerie = xlErrNA
End If
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
passt super :-) Herzlichen Dank!
06.04.2013 10:09:11
Joerschi
Hi Erich,
genau - die Function passt super, besten Dank. Auf so eine Lösung wäre ich nicht gekommen (und Formellösung wollte mir absolut nicht einfallen).
Das mit der richtigen Position hast Du gut erkannt (deswegen immer meine grafischen Beispiele - genau für solche Fälle). Wahrscheinlich bin ich schon so drin, dass man das Offensichtliche (für sich selbst) dann irgendwie schon versehentlich auslässt.
Nochmals Danke für Deine Hilfe
Liebe Grüße
Jörg

Danke für deine Rückmeldung, und ...
06.04.2013 11:38:55
Erich
Hi Jörg,
... noch zwei einfachere und schnellere Funktionen (mit weniger Schleifen):

Function MaxSerie(rngT As Range, rngV As Range)
Dim lngT As Long, ee As Long, mm As Long, pp As Long
lngT = rngT.Cells.Count
If lngT = rngV.Cells.Count Then
For pp = 1 To lngT
If rngT(pp) = rngV(pp) Then
ee = ee + 1
Else
ee = 0
End If
If mm  0 And mm > ee Then mm = ee
ee = 0
End If
Next pp
If ee > 0 And mm > ee Then mm = ee
If mm 
Ich hoffe, dass ich keine neuen Fehler eingebaut habe...
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Falls es dich interessiert, ...
06.04.2013 14:55:21
Luc:-?
…Joerschi,
habe ich noch eine überarbeitete Mappe eingestellt, die auch das aktuelle Problem nebst EvalN-Version 1.3 enthält.
Hat zwar etwas gedauert, aber mit benannten Fmln unter Einbeziehung von EvalN ist's schließlich gelungen → also ohne speziell darauf ausgerichtete UDF!
Gruß + schöWE, Luc :-?

AW: Falls es dich interessiert, ...
06.04.2013 15:30:34
Joerschi
hi Luc :-?
auch Dir danke für die Lösung.
Ist wirklich super wie einem hier mit verschiedensten Ansätzen geholfen wird :-)
Liebe Grüße
Jörg

Anzeige
Ich kann nur hoffen, ...
06.04.2013 18:54:01
Luc:-?
…Joerschi,
dass das vorläufig das letzte Problem dieser Art war, sonst wird meine UDF zur BedingtFormat-Auswertung ab Xl12ff nie fertig! ;-)
Gruß Luc :-?

Doch noch was, ...
06.04.2013 20:46:13
Luc:-?
…Joerschi;
durch die Vereinigung beider Probleme in einer Mappe habe ich noch ein Problem festgestellt, was zur Version 1.4 von EvalN und einer Änderung beim 1.Problem geführt hat. Aber sieh selbst!
Luc :-?

Vergleich Zeichenketten - ohne VBA
07.04.2013 10:34:00
Erich
Hi Jörg,
in AD4:AD9 ist die VBA-Läung (wie gehabt), in den Zeilen 12:17 die Formellösung.
Sie braucht Hilfszellen (P12:AB17). Die Zellen O12:O17 und AC12:AC17 sollten leer sein.
 BCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAE
312345678910111213 12345678910111213 MaxMin
4ababccacccaaa abbcbcacccacc 62
5ababbbabcbaba bcaccbccababa 41
60000000000000 1111111111111 00
70000000000000 0000000000000 1313
80011110000000 1111111110011 42
90101000021111 0110211220222 21
10                              
11              12345678910111213 MaxMin
12              1200012345600 62
13              0010010001234 41
14              0000000000000 00
15              12345678910111213 1313
16              0012340001200 42
17              1200000010000 21

Formeln der Tabelle
ZelleFormel
AD4=MaxSerie(B4:N4;P4:AB4)
AE4=MinSerie(B4:N4;P4:AB4)
P12=(B4=P4)*(1+O12)
AB12=(N4=AB4)*(1+AA12)
AD12=MAX(P12:AB12)
AE12{=MIN(WENN(P12:AB12>Q12:AC12;P12:AB12;ZÄHLENWENN(P12:AB12;">0")))}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Vergleich Zeichenketten - ohne VBA
07.04.2013 16:47:58
Joerschi
Danke Erich :-)
Warum nur habe ich das Gefühl, dass Du Dir das Ding als Hobby-Matheaufgabe selbst gestaltet hast :-)
Aber sehr clevere Formellösung durch die Umstellung (Einbindung) der aufeinander folgenden, aufsteigenden Zahlen in den Hilfszeilen.
LG, Jörg

Mir war klar, dass es eine solche Lösung ...
07.04.2013 16:57:36
Luc:-?
…gibt, Erich,
aber ich habe diesen Weg bewusst nicht verfolgt, weil dann stets Hilfszellen vonnöten gewesen wären. Leider stieß die Matrixlösung irgendwo an Grenzen, die ich in meiner Lösung mit gestufter Auswertung per EvalN überwinden konnte, obwohl es möglicherweise auch eine Standardmöglichkeit dafür geben mag (genau wie in J.s 1.Problem).
Was mich aber mehr interessieren würde, ist, ob du eine Erklärung dafür hast, warum das Auswerten der Caller.Formula (in EvalN ) zu Ergebnisinstabilität führt, wenn EvalN (in gleicher Mappe) auch in benannten Fmln benutzt wird (vgl 1.BspMappe, Tab1, von mir bzw 2.Mappe, Tab1, entsprd rückgeändert).
Übrigens, deine UDFs wären noch nützlicher, wenn die Art des Ergebnisses gewählt wdn könnte. Und zwar ggf Min/Max, aber vor allem Vglsfolgen oder Zählung, wobei bei letzterer Min/Max auch extern (in GesamtFml) bestimmt wdn könnte.
Gruß + schöSo, Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige