Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Makro sortiert nicht wie gewünscht

Forumthread: Makro sortiert nicht wie gewünscht

Makro sortiert nicht wie gewünscht
18.11.2024 22:07:55
Christian
Hallo,

ich bin leider mit meinem Latein am Ende bitte helft mir.
Warum sortiert unten stehendes Makro immer nur bis zur ersten Leerzelle anstatt den ganzen Bereich 5:1000?

Sub CompleteTaskWithSortAndRemoveDuplicates()

Dim ws As Worksheet
Dim row As Long, col As Long
Dim lastCol As Long
Dim searchTerms As Variant
Dim cellValue As String
Dim sortRange As Range

' Arbeitsblatt "Update" definieren
Set ws = ThisWorkbook.Sheets("Update")

' Suchbegriffe definieren (korrekt mit "prothetisch")
searchTerms = Array("4 Begriffe")

' 1. Durchsuchen jeder 4. Zeile ab Zeile 8 nach den Suchbegriffen und Löschen der Zellen
For row = 8 To 1000 Step 4
For col = 1 To 300 ' Wir durchlaufen bis zur Spalte 300 (KN)
cellValue = ws.Cells(row, col).Value
' Überprüfen, ob einer der Suchbegriffe enthalten ist
Dim term As Variant
For Each term In searchTerms
If InStr(1, cellValue, term, vbTextCompare) > 0 Then
' Inhalt der Zelle löschen
ws.Cells(row, col).ClearContents
' Inhalt der 3 Zellen oberhalb löschen (wenn sie existieren)
If row - 1 >= 1 Then ws.Cells(row - 1, col).ClearContents
If row - 2 >= 1 Then ws.Cells(row - 2, col).ClearContents
If row - 3 >= 1 Then ws.Cells(row - 3, col).ClearContents
Exit For ' Aus der Begriffsschleife, da Fund
End If
Next term
Next col
Next row

' 2. Löschen der Zeilen, außer jeder 4. ab Zeile 3, **und Zeile 4 wird nicht gelöscht**
For row = 1000 To 1 Step -1
If row > 4 And row >= 3 And (row - 3) Mod 4 > 0 Then
ws.Rows(row).Delete
End If
Next row

' 3. Löschen der Spalten von A bis KN (Spalte 1 bis 300), wenn Zeile 5 leer ist
For col = 300 To 1 Step -1
If ws.Cells(5, col).Value = "" Then
' Spalte löschen
ws.Columns(col).Delete
End If
Next col

' 4. Bestimme die neue letzte Spalte anhand von Zeile 1 (nach dem Löschen)
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
MsgBox "Die neue letzte Spalte ist: " & lastCol

' 5. Sortieren des Bereichs 5:1000 in jeder Spalte alphabetisch
For col = 1 To lastCol
' Den Bereich für die Sortierung explizit festlegen (Zeilen 5 bis 1000 in der aktuellen Spalte)
Set sortRange = ws.Range(ws.Cells(5, col), ws.Cells(1000, col))

' Sortiere den Bereich alphabetisch
sortRange.Sort Key1:=ws.Cells(5, col), Order1:=xlAscending, Header:=xlNo
Next col

' 6. Duplikate in jeder Spalte (Bereich 5:1000) entfernen
For col = 1 To lastCol
' Bereich 5:1000 in der aktuellen Spalte für Duplikate
Set sortRange = ws.Range(ws.Cells(5, col), ws.Cells(1000, col))

' Duplikate entfernen
sortRange.RemoveDuplicates Columns:=1, Header:=xlNo
Next col

' 7. Löschen der Zeilen 4, 2 und 1 (in dieser Reihenfolge, damit Zeile 4 zuerst gelöscht wird)
ws.Rows(4).Delete
ws.Rows(2).Delete
ws.Rows(1).Delete

MsgBox "Die Duplikate wurden entfernt und Zeilen 1, 2 und 4 gelöscht."
End Sub


Gruß und danke
Christian
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro sortiert nicht wie gewünscht
18.11.2024 22:21:08
Onur
Code allein bringt doch nix.
Wie soll man da irgend etwas testen?
Anmerkung... Laufzeit?
19.11.2024 09:49:45
MCO
Moin Christian!

Wenn ich das richtig lese, hast du da eine Schleife gebaut, die 1000 Zeilen * 300 Spalten jeweils auf 4 Begriffe testet.
1000*300*4 = 1.200.000 einzeln angefasste Zellen (ohne Ausstieg)!

Ware es nicht viel sinniger, den Bereich auf einmal zu bearbeiten?
Ich denke da an
    For i = 0 To 4

Set gef = Range("A1:KN1000").Find(searchTerms(i), xlWhole)
If Not gef Is Nothing Then
gef.ClearContents 'gefunden, löschen
For t = -1 To -3 Step -1
If gef.Offset(t, 0) >= 1 Then gef.Offset(t, 0).ClearContents
Next t
End If
Next i


Ausserdem ist es deutlich schneller, erst den Bereich zu definieren, der gelöscht werden soll und dann einmal zu löschen.

Beispiel:
Sub zeilenweise_massen_löschen()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
lz = ActiveSheet.UsedRange.Rows.Count
Set rng = Range("A" & lz + 1)

For i = 1 To lz Step 15
Set rng = Union(rng, Range("A" & i))
Next i

rng.Rows.EntireRow.Select 'nur zum Kontrollieren, ausblenden!
Stop ', ausblenden!
Application.Calculation = xlCalculationAutomatic
End Sub


Für diesen Teil
    For col = 300 To 1 Step -1

If ws.Cells(5, col).Value = "" Then
' Spalte löschen
ws.Columns(col).Delete
End If
Next col


ist es sogar noch einfacher:
Range("A5:KN5").specialcells(xlcelltypeblanks).entirecolumn.delete


und hier
    ws.Rows(4).Delete

ws.Rows(2).Delete
ws.Rows(1).Delete

kannst du schreiben
ws.range("1:2,4:4").Delete


Hau rein!

Gruß, MCO
Anzeige
AW: Anmerkung... Laufzeit?
19.11.2024 14:09:12
Christian
Hallo MCO,

danke für die vielen Tipps, ich mache mich dann mal an die Umsetzung... du siehst ja sicherlich, ich bin alles andere als ein Experte.

Christian
AW: Makro sortiert nicht wie gewünscht
18.11.2024 22:29:57
Christian
Hallo Onur,

gebe ich dir recht. Mir ist gerade aufgefallen in einer anderen Mappe funktioniert der Code. (warum auch immer).

Werde dann erstmal versuchen, die ganzen INhalte in ne andere Mappe zu übertragen.

Falls nicht, gibts die Bsp Datei

Gruß
Christian
Anzeige

Forumthreads zu verwandten Themen