Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 14:18:05
28.04.2024 13:43:14
Anzeige
Archiv - Navigation
1920to1924
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

Key aus einzelnen Zellen je Zeile vergle

Key aus einzelnen Zellen je Zeile vergle
28.02.2023 07:14:42
Thomas
Hallo,
ich möchte mir aus einzelnen Zellen einer Zeile einen Key zusammensetzen und dann in allen darunter leigenden Zeilen prüfen ob es dort einen identischen Key geben würde wenn ja, soll in den Key Zeilen eine Zahl in Spalte 7 eingetragen werden.
Grundsätzlich habe ich eine lösung, allerdings läuft die bei über 16.000 Zeilen schon eine gefühlte ewigkeit, da gibt es bestimmt eine bessere Lösung oder?
Danke
MFG
Thomas
Sub Aufloesen()
Application.ScreenUpdating = False 
Dim lngRow As Long       
Dim lngLastRow As Long   
Dim strID As String       
Dim i As Long           
Dim strKeyFind
Dim lngrow2 As Long
i = 1                    
With tblDaten 
lngLastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'letzte nicht leere Zeile in Spalte 1 (A) ermitteln
        If .Cells(lngRow, 7) = "" Then
            strKeyFind = .Cells(lngRow, 8) & .Cells(lngRow, 9) & .Cells(lngRow, 5) & .Cells(lngRow, 10) & .Cells(lngRow, 12) 'Key wird erstellt der anschließend in allen Zeilen geprüft werden soll
             For lngrow2 = lngRow + 1 To lngLastRow
                If strKeyFind > .Cells(lngrow2, 8) & .Cells(lngrow2, 9) & .Cells(lngrow2, 5) & .Cells(lngrow2, 10) & .Cells(lngrow2, 12) Then
                
                    .Cells(lngRow, 7).NumberFormat = "@" 
                    .Cells(lngrow2, 7).NumberFormat = "@" 
                    .Cells(lngRow, 7) = i
                    .Cells(lngrow2, 7) = i 
                    .Cells(lngRow, 7).NumberFormat = "@"
                    .Cells(lngrow2, 7).NumberFormat = "@"
                    .Cells(lngRow, 1).NumberFormat = "@" 
                    .Cells(lngrow2, 1).NumberFormat = "@"
                    .Cells(lngRow, 1) = .Cells(lngRow, 2) & .Cells(lngRow, 3) & .Cells(lngRow, 5) & .Cells(lngRow, 10) & .Cells(lngRow, 12) & .Cells(lngRow, 4) 
                    .Cells(lngrow2, 1) = .Cells(lngRow, 2) & .Cells(lngRow, 3) & .Cells(lngRow, 5) & .Cells(lngRow, 10) & .Cells(lngRow, 12) & .Cells(lngRow, 4) 
                    .Cells(lngRow, 1).NumberFormat = "@"
                    .Cells(lngrow2, 1).NumberFormat = "@"
                Else
                    .Cells(lngRow, 7).NumberFormat = "@" 
                    .Cells(lngRow, 7) = i 
                    .Cells(lngRow, 7).NumberFormat = "@"
                    .Cells(lngRow, 1).NumberFormat = "@" 
                    .Cells(lngRow, 1) = .Cells(lngRow, 2) & .Cells(lngRow, 3) & .Cells(lngRow, 5) & .Cells(lngRow, 10) & .Cells(lngRow, 12) & .Cells(lngRow, 4)
                    .Cells(lngRow, 1).NumberFormat = "@"
                End If
            Next lngrow2
            
                i = i + 1 
    End If
Next lngRow
End With
Application.ScreenUpdating = True 
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 07:33:14
onur
2 x hintereinander ? Was soll das bringen ?
                    .Cells(lngRow, 7).NumberFormat = "@" 
                    .Cells(lngrow2, 7).NumberFormat = "@" 
                    .Cells(lngRow, 7) = i
                    .Cells(lngrow2, 7) = i 
                    .Cells(lngRow, 7).NumberFormat = "@"
                    .Cells(lngrow2, 7).NumberFormat = "@"
Wo ist denn die Zeile
For lngrow = ....
Der Rest des Codes ergibt auch nicht viel mehr Sinn.
Poste mal eine Datei.
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 08:02:30
Thomas
Hi,
das
For lngRow = 2 To lngLastRow
war beim kopieren verloren gegangen..... das steht nach lngLastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'letzte nicht leere Zeile in Spalte 1 (A) ermitteln
Die anderen sachen stehen nicht zweimal hintereinander, bzw. es sind dann immer zwei unterschiedliche Zeilen lngRow und lngrow2
Anbei eine Beispieldatei, in Spalte 7 sollen dann die die den gleichen Key (nicht den aus Spalte 1, der würde hier nicht passen) haben die gleiche Nummer bekommen, die anderen bekommen über die Variable i eine fortlaufende Nummer.
https://www.herber.de/bbs/user/158051.xlsm
Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 08:53:11
onur
"Die anderen sachen stehen nicht zweimal hintereinander, bzw. es sind dann immer zwei unterschiedliche Zeilen lngRow und lngrow2" - Blödsinn!
.Cells(lngRow, 7).NumberFormat = "@"   
.Cells(lngrow2, 7).NumberFormat = "@" 
.Cells(lngRow, 7) = i
.Cells(lngrow2, 7) = i  
.Cells(lngRow, 7).NumberFormat = "@"
.Cells(lngrow2, 7).NumberFormat = "@"
Zeilen 1 und 2 sind völlig identisch mit 5 und 6 oben.
Und hier:
.Cells(lngRow, 1) = .Cells(lngRow, 2) & .Cells(lngRow, 3) & .Cells(lngRow, 5) & .Cells(lngRow, 7) & .Cells(lngRow, 10) & .Cells(lngRow, 12)
.Cells(lngrow2, 1) = .Cells(lngRow, 2) & .Cells(lngRow, 3) & .Cells(lngRow, 5) & .Cells(lngRow, 7) & .Cells(lngRow, 10) & .Cells(lngRow, 12)
Wieso schreibst du nicht als 2. Zeile nicht einfach das hier (statt alles nochmal zu berechnen) ?
.Cells(lngrow2, 1) =  .Cells(lngRow, 1)
Wenn du Hilfe willst: Erklär bitte mal, wozu genau das Ganze gut ist (aus dem Code kann man nicht schlau werden, da er so viel Ballast enthält und teilweise sinnfrei ist) und poste eine Beispielsdatei mit mehr als 8-9 Datensätzen, damit man den erstellten Code auch mal richtig testen kann.
Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 11:57:53
Thomas
"Die anderen sachen stehen nicht zweimal hintereinander, bzw. es sind dann immer zwei unterschiedliche Zeilen lngRow und lngrow2" - Blödsinn! Nein kein Blödsinn, es stehen nicht zweimal die gleichen Punkte direkt hintereinander, sondern korrekt ist wie du ja dann auch schreibst das diese sich dann in Zeile 5 und 6 wiederholen, aber nicht direkt hintereinander. Zur erklärung dazu ich hab öfters mal mit dem Zellen Format Probleme gehabt, so das ich vor den beschreiben der Zelle das Format nun setze und im Anschluss nochmal, dürfte zwar doppelt gemoppelt sein, aber hat dann immer geholfen.
Zu deinem zweiten Punkte, da hast du absolut recht, das hätte ich einfacher haben/machen können.
Das ganze ist dazu gut, das wenn ein identischer Key in der Tabelle exisitiert diese Zeilen in Spalte 7 auch die identische Nummer bekommen, so müsste in der Beispieldatei die Zeile 2 und 9 die identisch Nummer bekommen, sowie 3 und 10 da dort die gleichen Daten stehen. alle anderen Zeilen müssten eine fortlaufende Nummer aus der Variablen i bekommen.
Wie geschrieben funktioniert das ganze ja im kleinen, aber wie du schon schreibst hat der Code zuviel Balast und wird dadurch deutlich zu langsam bei vielen Zeilen
Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 07:34:50
ralf_b
das schnellste wird sein du erzeugst eine hilfsspalte und fügst eine Formel ein ,die deine keys generiert. und dann filterst du diese einfach.
im Filterergebnis änderst du die Werte nach belieben und löschst die Hilfspalte und den Filter.
Beispiele gibts dafür schon Einige.
AW: Key aus einzelnen Zellen je Zeile vergle
28.02.2023 18:18:48
Daniel
Hi
in Excel 365 vielleicht so:
1. erzeuge in einer Hilfsspalte (getrennt von der Tabelle) eine Liste, in der die Keys einmalig vorkommen. Dein Excel hat hierfür die Funktion EINDEUTIG, die musst du auch nur in eine Zelle eintragen
=EINDEUTIG(H:H&I:I&E:E&J:J&L:L)
2. erstelle jetzt in Spalte 7 die ID mit der Formel
 =Vergleich(H2&I2&E2&J2&L2;Hilfspalte, die du unter 1. erstellt hast;0)
3. Spalte 7 kopieren und als Wert einfügen
4. Hilfsspalte wieder löschen
weitere Optimierungen wären:
- bei 1. in der Eindeutig-Funktion nicht ganze Spalten, sondern den tatsächlichen Zellbereich angeben
- die Liste mit den Keys zusätzlich sortieren (auch dafür hat dein Excel eine Funktion) und dann den Vergleich mit 1 satt 0 als letzten Parameter verwenden.
das kannst du natürlich auch per VBA ausführen lassen, der recorder hilft dir dabei.
mit den weitern Optimierungen sollte das auch sehr schnell sein.
die Alternative für alle Excelversion wäre folgende:
1. ggf eine Hilfsspalte mit der aktuellen Zeilennummer einfügen, dies ist aber nur erforderlich, wenn die ursprüngliche Reihenfolge erforderlich ist und nicht per Sortierung aus den vorhandenen Daten erstellt werden kann
2. Liste nach den Spalten, die die Keys bilden (H, I, E, J, L) sortieren, so dass Zeilen mit dem gleichen Key direkt untereinander stehen
3. in Spalte 7 ab Zeile 2 dann diese Formel eintragen (Zeile 1 sollte Überschrift sein):
=Wenn(Und(H2=H1;I2=I1;E2=E1;J2=J1;L2=L1);G1;Summe(G1;1))
4. dann auch wieder Spalte 7 kopieren und als Wert einfügen
5. ursprüngliche Sortierung wieder herstellen
auch das sollte bei 16.000 Zeilen sehr schnell sein.
Gruß Daniel
Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
02.03.2023 13:06:22
Thomas
Hallo zusammen, vielen Dank für eure Tips ich hab dann jetzt noch ein wenig gebastelt und ich glaube ich hab es mit Hilfe der "Hilfskey" Spalte jetzt auch hinbekommen, die Performance bei über 16.000 Zeilen ist zwar immer noch nicht herausragend, aber zumindest scheinen die Werte alle korrekt zu sein was ich bis jetzt Testen konnte, ich musste noch eine Suchabfrage einbauen weil ich auch noch andere Daten gefunden hab die in Spalte 8 Werte hatten und einem neu generierten Key ohne Werte entsprachen.
Hier der aktuelle Code,
wenn einer verbesserungs vorschläge hat, natürlich gerne.
Danke
MFG
Thomas
Sub Ohne()
Application.ScreenUpdating = False 'Bildschirm deaktivieren
Dim i As Long            'Zähler Variable die immer um 1 erhöht wird um immer eine neue eindeutige Nummer zu generieren
Dim lngLastRow As Long   'Letzte Zeile wird in dieser Variablen gespeichert
Dim rngFind As Range     'Range Variable in der der zu durchsuchende Bereich definiert wird
Dim rngZelle As Range    'Range VAriable um den Gesamten in rngFind definierten Bereich zu durchlaufen
Dim rngTreffer As Range  'Range Variable umd die gefunden Werte zu speichern
i = 1                         'i wird mit 1 inistalisiert
With tblDaten 
lngLastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'letzte nicht leere Zeile in Spalte 1 (A) ermitteln
 Set rngFind = .Range(.Cells(2, 1), .Cells(lngLastRow, 1)) 'Der nach doppelten EInträgen zu durchsuchende Bereich wird definiert,Spalte 1 (KeyNeu)
    For Each rngZelle In rngFind 'Alle Zellen im zu vor definierten Bereich werden durchlaufen
            If rngZelle > "" Then 'Es wird eine Sicherheitsprüfung abgefragt das keine "Leeren" Zellen berücksichtigt werden im Bereich
                If WorksheetFunction.CountIf(rngFind, rngZelle.Value) > 1 Then 'Über die Tabellenfunktion "Zählenwenn" wird geprüft ob der Wert in rngZelle im Bereich rngFind mehr wie 1 x vorkommt.
                    Set rngTreffer = rngFind.Find(rngZelle.Value, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious) 'Wenn der Wert mehrmals vorkommt, wird die Range Variable rngTreffer gefüllt, es wird von unten nach oben gesucht
                        If Not rngTreffer Is Nothing Then
                                If rngTreffer.Columns(8) > "" And rngZelle.Columns(8) = "" Then
                                        rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        rngZelle.Columns(8) = rngTreffer.Columns(8)
                                        rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        rngZelle.Columns(2).NumberFormat = "@" 'Key Spalte wird als Text Formatiert
                                        rngZelle.Columns(2) = rngZelle.Columns(3) & rngZelle.Columns(4) & rngZelle.Columns(6) & rngZelle.Columns(11) & rngZelle.Columns(8) & rngZelle.Columns(13) & rngZelle.Columns(5) 'Es wird ein neuer Key erstellt
                                        rngZelle.Columns(2).NumberFormat = "@"
                                        
                                 ElseIf rngTreffer.Columns(8) = "" And rngZelle.Columns(8) = "" And rngZelle.Columns(3) = "" Then
                                        rngTreffer.Columns(8).NumberFormat = "@"
                                        rngTreffer.Columns(8) = i
                                        rngTreffer.Columns(8).NumberFormat = "@"
                                        rngTreffer.Columns(2).NumberFormat = "@" 'Key Spalte wird als Text Formatiert
                                        rngTreffer.Columns(2) = rngTreffer.Columns(3) & rngTreffer.Columns(4) & rngTreffer.Columns(6) & rngTreffer.Columns(11) & rngTreffer.Columns(8) & rngTreffer.Columns(13) & rngTreffer.Columns(5) 'Es wird ein neuer Key erstellt
                                        rngTreffer.Columns(2).NumberFormat = "@"
                                        rngZelle.Columns(8).NumberFormat = "@"
                                        rngZelle.Columns(8) = i
                                        rngZelle.Columns(8).NumberFormat = "@"
                                        rngZelle.Columns(2).NumberFormat = "@" 'Key Spalte wird als Text Formatiert
                                        rngZelle.Columns(2) = rngZelle.Columns(3) & rngZelle.Columns(4) & rngZelle.Columns(6) & rngZelle.Columns(11) & rngZelle.Columns(8) & rngZelle.Columns(13) & rngZelle.Columns(5) 'Es wird ein neuer Key erstellt
                                        rngZelle.Columns(2).NumberFormat = "@"
                                        i = i + 1 'Zähler Variable i wird um eins erhöht
                                
                                ElseIf rngTreffer.Columns(8) = "" And rngZelle.Columns(8) = "" And rngZelle.Columns(3) > "" Then
                                        rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        rngZelle.Columns(8) = i
                                        rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        rngZelle.Columns(2).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        rngZelle.Columns(2) = rngZelle.Columns(3) & rngZelle.Columns(4) & rngZelle.Columns(6) & rngZelle.Columns(11) & rngZelle.Columns(8) & rngZelle.Columns(13) & rngZelle.Columns(5) 'Es wird ein neuer Key erstellt
                                        rngZelle.Columns(2).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                                        i = i + 1 'Zähler Variable i wird um eins erhöht
                                End If
                        End If
                Else
                    rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                    rngZelle.Columns(8) = i
                    rngZelle.Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                    rngZelle.Columns(2).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                    rngZelle.Columns(2) = rngZelle.Columns(3) & rngZelle.Columns(4) & rngZelle.Columns(6) & rngZelle.Columns(11) & rngZelle.Columns(8) & rngZelle.Columns(13) & rngZelle.Columns(5) 'Es wird ein neuer Key erstellt
                    rngZelle.Columns(2).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
                    i = i + 1 'Zähler Variable i wird um eins erhöht 
                End If
        End If
    Next
End With
Application.ScreenUpdating = True 'Bildschirm aktualisieren
End Sub

Anzeige
AW: Key aus einzelnen Zellen je Zeile vergle
03.03.2023 13:26:35
Yal
Hallo Thomas,
wenn Du schon nach Verbesserungsvorschläge fragst:
"Don't repeat yourself" ist der Motto der Python Programmiersprache, spricht,
_ wenn es aufwändig ist, nicht doppelt ablegen, z.B.
_ erzeuge nur einmal die neue Schlüssel
_ setze nur einmal die Werte in den 4 Spalten
_ trenne die Ermittlung der Fälle von deren Durchführung auseinander
_ stelle von anfang an die Spalte auf String und stelle sicher, dass Du eine String reinschreibst
darüber hinaus:
_ achte aus ein sauberes Einrücken (wobei es schon gut aussah)
_ Kommentar ist hervoragend, wenn es sehr wenig davon gibt. Sonst wird es gar nicht gelesen. Vermeide selbstverständlichkeit ( i = 1 )
_ rngZelle und rngTreffer sind fürs Auge zu nah zu einander. Da Laufvariable üblicherweise einstellig sind: "Z"
_ schau Dir, wie man With im With einsetzt, bzw. ab wann ist "With tblDaten" nicht mehr gebraucht.
Sub Ohne()
Dim i As Long            'Stepper: eindeutige, fortlaufende Nummer 
Dim Z As Range        'Laufvariable der For-Schleife
Dim rngFind As Range     'zu durchsuchende Bereich
Dim rngTreffer As Range  'gefunden Zelle
Dim case1 As Boolean
Dim case2 As Boolean
Dim case3 As Boolean
Dim NeueKey As String
    Application.ScreenUpdating = False 'Bildschirm-Aktualisierung deaktivieren
    i = 1
    With tblDaten
        .Columns(2).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
        .Columns(8).NumberFormat = "@" 'Die Zeile bekommt dann das Text Format
        Set rngFind = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)) 'Der nach doppelten EInträgen zu durchsuchende Bereich wird definiert,Spalte 1 (KeyNeu)
    End With
    For Each Z In rngFind 
        If Z > "" Then 'Leeren Zellen überspringen
            case1 = False: case2 = False: case3 = False 'saubere Startzustand (weil innerhalb einer For-Schleife)
        'Behandlung der Fälle
            If WorksheetFunction.CountIf(rngFind, Z.Value) = 1 Then 'wenn nur einmal vorkommt.
                case3 = True
            Else 'wenn mehrmals
                Set rngTreffer = rngFind.Find(Z.Value, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious) 'nächste vorkommen der Wert in Z
                If Not rngTreffer Is Nothing Then
                    case1 = rngTreffer.Columns(8) > "" And Z.Columns(8) = ""
                    case2 = rngTreffer.Columns(8) = "" And Z.Columns(8) = "" And Z.Columns(3) = ""
                    case3 = rngTreffer.Columns(8) = "" And Z.Columns(8) = "" And Z.Columns(3) > ""
                End If
            End If
    'Durchführung der Aktionen
        'rngZelle, bzw. Z
            If case1 Then
                Z.Columns(8) = CStr(rngTreffer.Columns(8))
            Else 'case2 Or case3
                Z.Columns(8) = CStr(i)
            End If
            'If case1 Or case2 Or case3 Then --> also IMMER
            With Z
                .Columns(2) = CStr(.Columns(3) & .Columns(4) & .Columns(6) & .Columns(11) & .Columns(8) & .Columns(13) & .Columns(5)) 'Es wird ein neuer Key erstellt
            End With
        'rngTreffer, nur bei case2
            If case2 Then
                With rngTreffer
                    .Columns(8) = CStr(i)
                    .Columns(2) = CStr(.Columns(3) & .Columns(4) & .Columns(6) & .Columns(11) & .Columns(8) & .Columns(13) & .Columns(5)) 'Es wird ein neuer Key erstellt
                End With
            End If
        'i++ nur in 2 Fälle
            If case2 Or case3 Then i = i + 1
        End If
    Next
    Application.ScreenUpdating = True 'Bildschirm-Aktualisierung reaktivieren
End Sub
Trotz allem Vorsicht, kann ich nicht garantieren, dass ich alles richtig umgesetzt habe. Aber damit hast Du ein Beispiel, wie man den Code schlanker gestalten kann.
VG
Yal
Anzeige

236 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige