AW: VBA: Wiederholung von Zahlengruppen in Spalte
Zahlengruppen
Hallo Born,
mir ist jetzt nur die VBA-Lösung mit roher Gewalt eingefallen, die sich in geschachtelten Schleifen an das Ergebnis heranarbeitet. Da braucht es ggf. schon ein wenig Rechenzeit, wenn die Liste lang ist und die Spanne zwischen Min und Max-Wert der Gruppengöße groß. Bei Größe 4 bis 7 geht es noch recht flott.
Gruß
Franz
Sub GruppenSuchen()
Dim Zeile As Long, Zeilen As Long, StartZeile As Long, Spalte As Long, Ergebnis As Long
Dim LetzterTreffer As Long
Dim rngGrp As Range, GrpLaenge As Long, ZeileGrp As Long, ZeileVergleich As Long
Dim wks As Worksheet, bolIdentisch As Boolean, MinGrpLaenge As Long, MaxGrpLaenge As Long
Set wks = ActiveSheet
With wks
StartZeile = 3 'Zeile mit 1. Wert der Verglichen werden soll
Spalte = 1 'Spalte mit den zu vergleichenden Werten
Ergebnis = 2 'Spalte für Ergebnisausgabe der Gruppenlänge, Spalte daneben wird _
für vorherige Trefferzeile benutzt
'Anzahl Zeilen mit Daten in Spalte
Zeilen = .Cells(.Rows.Count, 1).End(xlUp).Row - StartZeile + 1
MinGrpLaenge = 4 'kleinste Gruppenlänge, die noch verglichen werden soll
MaxGrpLaenge = 7 'größte _
Gruppenlänge, die noch verglichen werden soll
'Altergebnisse löschen
.Range(.Cells(StartZeile, Ergebnis), .Cells(StartZeile + Zeilen - 1, _
Ergebnis + 1)).ClearContents
'Gruppenlänge in 1er-Schritten von maximale auf minimale Gruppenlänge reduzieren
For GrpLaenge = MaxGrpLaenge To MinGrpLaenge Step -1
'Gruppen der Länge in 1er-Schritten durch den Zellenblock verschieben und mit den _
restlichen Zeilen vergleichen
For Zeile = StartZeile To StartZeile + Zeilen - GrpLaenge
Set rngGrp = .Range(.Cells(Zeile, Spalte), _
.Cells(Zeile, Spalte).Offset(GrpLaenge - 1, 0))
LetzterTreffer = Zeile
If Zeile + 2 * GrpLaenge > StartZeile + Zeilen - 1 Then Exit For
'Blöcke bis zur letzten Zeile mit dem Gruppenblock vergleichen
For ZeileGrp = Zeile + GrpLaenge To StartZeile + Zeilen - GrpLaenge
bolIdentisch = True
'Prüfen, ob Zeile schon einem längeren Block als Treffer zugeordnet ist
If IsEmpty(.Cells(ZeileGrp, Ergebnis)) _
Or .Cells(ZeileGrp, Ergebnis) = GrpLaenge Then
'Zeilenweiser Vergleich der Blöcke
For ZeileVergleich = 1 To GrpLaenge
'Wertevergleich und Prüfung, ob Zeile schon Treffer eines längeren Block
If rngGrp.Cells(ZeileVergleich, 1) <> .Cells(ZeileGrp + ZeileVergleich - 1, _
Spalte) _
Or Not (IsEmpty(.Cells(ZeileGrp + ZeileVergleich - 1, Ergebnis)) _
Or .Cells(ZeileGrp, Ergebnis) = GrpLaenge) Then
bolIdentisch = False
Exit For
End If
Next ZeileVergleich
If bolIdentisch = True Then
'Blocklänge in Ergebnisspalte eintragen
.Range(.Cells(ZeileGrp, Ergebnis), _
.Cells(ZeileGrp, Ergebnis).Offset(GrpLaenge - 1, 0)).Value _
= GrpLaenge
'vorherige Trefferzeile eintragen
.Cells(ZeileGrp, Ergebnis + 1).Offset(GrpLaenge - 1, 0) = LetzterTreffer
'vorherigen Trefferwert neu setzen
LetzterTreffer = ZeileGrp
'Zeilenzähler der Schleife anpassen
ZeileGrp = ZeileGrp + GrpLaenge - 1
End If
End If
Next ZeileGrp
Next Zeile
Next GrpLaenge
End With
End Sub