Antworten auf deine Fragen:
Neues Thema erstellen

Vergleichen von Zahlenkombinationen

Annihilator

Nicht mehr ganz neu hier

Zum Vergleichen zweier Reihen von Zahlenkombinationen habe ich mir ein kleines Makro geschrieben, daß auch richtig funktioniert.

Wenn allerdings die Reihe A aus 780000 Kombinationen und die Reihe B aus 560000 Kombinationen besteht, braucht mein Rechner bis zu 25 Minuten, um in Reihe C die Kombinationen direkt untereinander anzuzeigen, die sowohl in Reihe A als auch in Reihe B vorhanden sind. Eine Kombination besteht aus 5 Zahlen.

Gibt es nun in Excel eine Möglichkeit, das Ganze effizienter zu gestalten?
Ich benutze MS Excel in der Originalversion 2010. Das Programm läuft auf einem Standalone-PC, der nicht vernetzt ist und daher nicht upgedatet wird. Der Hinweis aus XVergleich hat sich daher erübrigt. Mit SVergleich wird zwar die Zeile gefunden, in der die identische Kombination steht, bringt mich in der Anzeige aber nicht weiter.

Danke fürs Lesen und Gedanken machen! Ich hoffe die Anfrage ist verständlich. Suchmaschinenrecherchen führten mich nicht zum Erfolg.

Gruß
A
 

Excel

gmtm

Noch nicht viel geschrieben

Hallo,
wie sieht Dein Makro denn genau aus ?
Schreibst Du die Zellenwerte mit "Cells(x,y).value = Wert" einzeln in Variabeln und vergleichst dann ?
Eine schnellere Methode zum Vergleich wäre es, die einzelnen Reihen jeweils in Arrays abzulegen und anschließend nur die beiden Arrays miteinander zu vergleichen.
Meiner Erfahrung nach bremst der Zugriff auf ein Tabellenblatt (Lesen oder Schreiben) immer die eigentliche Rechenleistung aus, auch wenn die Bildschirmaktualiserung mit "Application.ScreenUpdating = False" ausgeschaltet ist.

Vielleicht hilft der Hinweis auf die Arrays weiter ?
 

Annihilator

Nicht mehr ganz neu hier

Erst mal vielen herzlichen Dank für Deine Antwort!!!!

derzeitge Ausgangslage:

https://abload.de/img/calculate7ykdy.jpg

Makro:

Sub ident_prüfung()

Dim lz(5), kz(5) As Byte, fin1, fin2, i, j, x, check As Long

fin1 = Cells(Rows.Count, 1).End(xlUp).Row: fin2 = Cells(Rows.Count, 7).End(xlUp).Row
x = 1: check = 1

For i = 1 To fin1
For j = check To fin2
lz(1) = Cells(i, 1): lz(2) = Cells(i, 2): lz(3) = Cells(i, 3): lz(4) = Cells(i, 4): lz(5) = Cells(i, 5)
kz(1) = Cells(j, 7): kz(2) = Cells(j, 8): kz(3) = Cells(j, 9): kz(4) = Cells(j, 10): kz(5) = Cells(j, 11)

If lz(1) = kz(1) And lz(2) = kz(2) And lz(3) = kz(3) And lz(4) = kz(4) And lz(5) = kz(5) Then Let Cells(x, 13) = lz(1): Cells(x, 14) = lz(2): Cells(x, 15) = lz(3): Cells(x, 16) = lz(4): Cells(x, 17) = lz(5): x = x + 1: j = fin2: GoTo 1

If lz(1) < kz(1) Then Let check = j: j = fin2: GoTo 1
If lz(1) = kz(1) And lz(2) < kz(2) Then Let check = j: j = fin2: GoTo 1
If lz(1) = kz(1) And lz(2) = kz(2) And lz(3) < kz(3) Then Let check = j: j = fin2: GoTo 1
If lz(1) = kz(1) And lz(2) = kz(2) And lz(3) = kz(3) And lz(4) < kz(4) Then Let check = j: j = fin2: GoTo 1
If lz(1) = kz(1) And lz(2) = kz(2) And lz(3) = kz(3) And lz(4) = kz(4) And lz(5) < kz(5) Then Let check = j: j = fin2
1: Next j
Next i

End Sub

Das mit den Arrays werde ich mir zu Gemüte führen. Aber allein der Tip mit Application.ScreenUpdating = False ist ja der Hammer. Das wußte ich noch gar nicht. Danke!

Gruß
A
 

gmtm

Noch nicht viel geschrieben

Hallo,
freut mich, wenn die Tipps helfen.
Du nutzt bereits Arrays für die Variabeln lz und kz. Allerdings vergleichst Du die Werte jeweils nur zeilenweise, was den Ablauf verlangsamt.
Versuche doch mal, die gesamte Blöcke A und B in den Array zu schreiben, in dem Du neben der Spaltenanzahl auch die Zeilenanzahl bei der Definition des Arrays angibst:
Dim lz(fin1, 5) as integer
Dim kz(fin2, 5) as integer

fin1 und fin2 müssen dafür natürlich schon bekannt sein (daher das
"fin1 = Cells(Rows.Count, 1).End(xlUp).Row: fin2 = Cells(Rows.Count, 7).End(xlUp).Row"
evtl. in einem separaten Makro / Prozedur vorab laufen lassen). Alternativ kannst Du auch feste Werte für fin1 und fin2 setzen.

Dann füllst Du die beiden Arrays mit
For i = 1 To fin1
lz(i,1) = Cells(i, 1): lz(i,2) = Cells(i, 2): lz(i,3) = Cells(i, 3): lz(i,4) = Cells(i, 4): lz(i,5) = Cells(i, 5)
Next i

For j = 1 To fin2
kz(j,1) = Cells(j, 7): kz(j,2) = Cells(j, 8): kz(j,3) = Cells(j, 9): kz(j,4) = Cells(j, 10): kz(j,5) = Cells(j, 11)
Next j

Den Abgleich machst Du dann in einer neuen Schleife und greifst nur noch auf die in den Arrays gespeicherten Werte zurück
For i = 1 To fin1
For j = check To fin2
If lz(i,1) = kz(j,1) And lz(i,2) = kz(j,2) und so weiter...

Das sollte den Ablauf schon deutlich beschleunigen. Wenn Du dann noch einen dritten Array anlegst, in dem die Ergebnisse gespeichert werden bevor sie ausgegeben (also im Tabellenblatt eingetragen werden) werden, müsste es recht flott laufen.

Wichtig: wenn Du "Application.ScreenUpdating = False" zu Beginn einer Prozedur verwendest, denk daran, am Ende die Ausgabe wieder anzuschalten ("Application.ScreenUpdating = True") ;-)


Viel Erfolg und viele Grüße !
 

Annihilator

Nicht mehr ganz neu hier

Hallo gmtm,

bin krankheitsbedingt ausgefallen. Habe mir das mit den Arrays zu Gemüte geführt, habe aber mit
kombi = Array("01", "02", "03", "04", "05") usw, gearbeitet und bin auf keinen grünen Zweig gekommen.

Dein Vorsschlag ist viel einfacher, logischer und daher viel besser nachzuvollziehen, das werde ich gleich mal übers Wochenende checken. Das ist ja ruckzuck umgeschrieben. Hoffentlich reicht der Arbeitsspeicher :)

Danke nochmals für Deine Antwort.Melde mich, wenn ich mehr weiß.
Gruß
A
 

Annihilator

Nicht mehr ganz neu hier

Ich gebe zu, ich war am Anfang etwas skeptisch, ob der Zeitraum beim Übertrag der Daten in ein Array und wieder zurück wirklich Ersparnis bringt.

Ich habe mal kleinere Kombireihen mit einander verglichen. Das Ergebnis war bei der ursprünglichen Methode 39 Sekunden. Bei der Array-Vergleichsmethode 22 und bei Übertrag des Ergebnisses zuerst in ein Array und dann mit Ausgabe 21 Sekunden. Und das unabhängig von Application.ScreenUpdating=False/True

Bei zwei "knüppelhärterten" Kombireihen lag der Wert der usprünglichen Methode bei 3:02 Minuten. Mit Variante 3 bei 1:40. Egal ob Application.ScreenUpdating=False/True.

Bringt also Zeitersparnis von satten 43%. Das ist mal eine Ansage!

Danke für Deine Mitarbeit und Deine Tipps. Hat geholfen!

Schöne Grüße in die Woche
A
 

gmtm

Noch nicht viel geschrieben

Das freut mich !
Danke Dir für die Auswertung der Rechenzeiten. Das habe ich vorher noch nie gegeneinander verglichen.
Wenn man jetzt noch die ursprünglichen 25 Minuten vom Anfang nimmt...

Viele Grüße und frohes Rechnen.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.611
Beiträge
1.538.341
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben