Clever-Excel-Forum

Normale Version: Verkettung aus Kombinationen mehrere Listen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo an alle, :)
ich soll eine Liste erstellen die eine Verkettung aller Kombinationen der Werte von Liste1, Liste2 und Liste3 sein soll.
Beispiel:


Code:
Liste1  Liste2  Liste3  Ergebnis
x1      a       1       x1>a>1
x2      b       2       x1>a>2
       c       3       x1>a>3
               4       x1>a>4
                       x1>b>1
                       x1>b>2
                       x1>b>3
                       x1>b>4
                       x1>c>1
                       x1>c>2
                       x1>c>3
                       x1>c>4
                       x2>a>1
                       x2>a>2
                       x2>a>3
                       x2>a>4
                       x2>b>1
                       x2>b>2
                       x2>b>3
                       x2>b>4
                       x2>c>1
                       x2>c>2
                       x2>c>3
                       x2>c>4


Meine methode wäre die Verkettungsformel immer abändern. Ist aber viel Arbeit und wenn sich die Anzahl der Werte von Liste1-3 abändert ist alles neu zu machen.
Könnte mir jemand helfen?
MfG,
Philipp
Hallo Philipp,

um wieviel Einträge handelt es sich maximal?

Ich würde eine VBA-Lösung empfehlen (insbesondere bei tausenden von Einträgen).
In der Analge aber erst einmal ein Formelbeispiel:
Und einmal mit Makro:
Hallo

anbei eine Beispieldatei mit zwei Makro Lösungen.  Zum auflisten der verknüpften Werte oder zum Formeln einfügen.
Die Spalten 1-3 können in der Const Anweisung manuell geaendert werden, ebenso die Ergebnis Spalte, bei mir "I" gewaehlt.

mfg  Gast 123
Hallo Philipp,

in der Anlage eine kleine Korrektur, wenn die benannte Liste vollständig gefüllt ist.

@ Gast
du solltest mehr im Speicher arbeiten. Das erhöht ein wenig den Schreibaufwand, verkürzt aber die Laufzeiten erheblich.


Bei 24*24*24 Einträgen benötigt dein Programm weit mehr als eine Minute und meins weniger als 0,1 Sekunden.
Hi,

und mit Formeln geht das so ganz einfach:

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABCDEF
1x1a1234
2x2b2x1>a>1  
3 c3x1>a>2  
4  4x1>a>3  
5   x1>a>4  
6   x1>b>1  
7   x1>b>2  
8   x1>b>3  
9   x1>b>4  
10   x1>c>1  
11   x1>c>2  
12   x1>c>3  
13   x1>c>4  
14   x2>a>1  
15   x2>a>2  
16   x2>a>3  
17   x2>a>4  
18   x2>b>1  
19   x2>b>2  
20   x2>b>3  
21   x2>b>4  
22   x2>c>1  
23   x2>c>2  
24   x2>c>3  
25   x2>c>4  

ZelleFormel
D1=ANZAHL2(A:A)
E1=ANZAHL2(B:B)
F1=ANZAHL2(C:C)
D2=INDEX(A:A;KÜRZEN((ZEILE(A1)-1)/$E$1/$F$1;)+1)&">"&INDEX(B:B;REST(KÜRZEN((ZEILE(A1)-1)/$F$1;);E$1)+1)&">"&INDEX(C:C;REST(ZEILE(A1)-1;$F$1)+1)
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg
Hallo Ego

ich muss bewğndernswert vor dir den Hut abziehen wie schnell dein Programm arbeitet. Bin beeindruckt.
Mein einfaches Volksschüler Wissen reicht leider nicht aus deinen Code logisch nachvollziehen zu können!
Mich stört auch nicht das freimütig zuzugeben. Ich weiss das mein Programmier Wissen begrenzt ist.

Als altem Praktiker fiel mir auf das bei dir alle drei Listen gleich lang sind!  Darum war ich aber neugierig was passiert wenn dein Programm mit den Original Werten wie in meinem Beispiel arbeiten muss.  Irgenwas stimmt zum Schluss nicht?? Unsinnige Daten!  Ich kann aber nicht nachvollziehen woran das liegt.

Letztendlich muss der :Frager selbst entscheiden welche Lösung er nimmt.  Aber es hat Spass gemacht mit an einer Lösung zu tüfteln.

mfg  Gast 123
Hi,

das Makro von Ego ist sehr unflexibel, da es nur auf gleichlange Listen ausgelegt ist.

Bei dem Makro von Gast123 ist die Variablendeklaration schlecht, da mit einer Ausnahme alle als Variant deklariert sind. Das ginge aber kürzer so:

Code:
Sub Liste_mitFormel_verketten()
Dim lzA As Long
Dim lzB As Long
Dim lzC As Long
Dim A As Long
Dim B As Long
Dim C As Long
Dim Z As Long
lzA = Application.WorksheetFunction.CountA(Columns(1))
lzB = Application.WorksheetFunction.CountA(Columns(2))
lzC = Application.WorksheetFunction.CountA(Columns(3))
Z = 0
For A = 2 To lzA
   For B = 2 To lzB
      For C = 2 To lzC
         Cells(Z + 2, 5) = Cells(A, 1) & ">" & Cells(B, 2) & ">" & Cells(C, 3)
         Z = Z + 1
      Next
   Next
Next
End Sub
Hallo,
zu
Zitat: Irgenwas stimmt zum Schluss nicht?? Unsinnige Daten!  Ich kann aber nicht nachvollziehen woran das liegt
und
Zitat: Irgenwas stimmt zum Schluss nicht?? Unsinnige Daten!  Ich kann aber nicht nachvollziehen woran das liegt

Leider ist mir bei der Korrektur des ersten Fehlers ein zweiter unterlaufen, ich habe häufig eine Leerzelle mit ausgewertet. In der Anlage die Korrektur.


@Gast
zu
Zitat:ich muss bewundernswert vor dir den Hut abziehen wie schnell dein Programm arbeitet. Bin beeindruckt.
Mein einfaches Volksschüler Wissen reicht leider nicht aus deinen Code logisch nachvollziehen zu können!
Ich hoffe, dass meine Bemerkung nicht zu lehrmeisterlich angekommen ist.
Im Prinzip sind doch alle Lösungen gleich, eine dreifach geschachtelte Schleife.
Ich wollte dich nur auf eine Technik hinweisen, die ich auch erst in diesem Forum (von Attila und Fennek) gelernt habe:

Bei grossen Datenlisten
1) die Eingangslisten in einem Befehl aus dem Datenblatt in ein Variant-Array übernehmen,
2) die Verarbeitung im Speicher in Arrays durchzuführen und
3) das Ausgangsarray in einem Befehl ins Datenblatt schreiben.
Eine Zeitersparnis >99% ist doch Grund genug diese Technik zu nutzen.
Hallo zusammen

@ Ego  dur hast Recht mit der Verarbeitungsgeschwindigkeit, das ist ein klarer Pluspunkt!  Mit Arrays habe ich bisher fast nie gearbeitet, da kenne ich mich nicht aus.  Damit zu arbeiten muss ich mir erst noch angewöhnen.  (Der Mensch ist ein Gewohnteitstier !)

@ Edgar  stimmt, meine Variablen waren als Variant deklariert.  Die Frage schlecht ist relativ??  Bei einem heutigen RAM  gleich welcher Grösse spielt es sicher keine Rolle ob eine Variable mit 2, 4, 8 oder 16 Byt deklariert wird. Das sehe ich gelassen, denn die Funktion ist auf jeden Fall gegeben. Manchmal nehme ich absichtlich Variant, wenn ich z.B. nicht genau weiss ob ich es mit Test, Zahl, Datum oder Bool Wert zu tun habe?  Da gibt es bei Variant keinen Laufzeifehler!

mfg  Gast 123
Seiten: 1 2