Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
964to968
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
964to968
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Mehrfach vorhandene Zellen löschen

Mehrfach vorhandene Zellen löschen
10.04.2008 20:30:14
Daniel
Schönen guten Abend, mir geht es darum ein Excelfile aus ca. 1000 Zeilen ein wenig schrumpfen zu lassen. Erheblich kleiner würde die Liste sein wenn ich Zeilen mit gleicher ID und Adresse löschen könnte.
Ich bräuchte also folgenden Befehl.
Lösche alle Zeilen bei denen einmal die Zellen aus SpalteA identisch sind UND gleichzeitig die Zellen aus Spalte B identisch sind.
Das bedeutet nichts anderes, dass sämtliche Zeilen mit doppelten oder mehrfachen Inhalten von Spalte A UND B gelöscht werden sollen. Wichtig: Zeilen bei denen zwar Zellen von SpalteA/B mehrfach vorkommen jedoch in den selben Zeilen bei SpalteB/A verschieden sind müssen erhalten beleiben.
Eine solche (halb)-automatische Lösung würde mir viel Zeit und Nerven sparen.
Grüße aus dem Spessart!

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrfach vorhandene Zellen löschen
10.04.2008 21:01:26
Volti
Hallo Daniel,
habe mal was schnell geschustert, schau mal, ob's das schon bringt.

Sub MachDeinDing()
Dim X As Integer, Zeile As Integer, T As String, SchonDa As String, Such As String
Zeile = 1
For X = 1 To 1000
Such = Cells(Zeile, 1) & Cells(Zeile, 2) & "@"
If InStr(SchonDA, Such) > 0 Then
T = Trim$(Str$(Zeile)) & ":" & Trim$(Str$(Zeile))
Rows(T).Delete Shift:=xlUp
Else
SchonDa = SchonDa & Such
Zeile = Zeile + 1
End If
Next
End Sub


Konnte ich allerdings nciht besonders lange testen und ist auch weder zeit -noch codeoptimiert.
viele Grüße aus dem Vorspessart :-)
Karl-Heinz

Anzeige
AW: Mehrfach vorhandene Zellen löschen
10.04.2008 21:19:33
Daniel
Hallo Karl-Heinz,
erstmal vielen Dank für die Turboantwort. Habe das Makro gleich mal ausprobiert und es funktioniert bis auf eine semantische Kleinigkeit. Wenn doppelte oder mehrfache Zellen in den beiden Spalten vorhanden sind sollen alles diese Zeilen gelöscht werden. Momentan bleibt ja immer noch eine Zeile übrig.
Sonst ist alles perfekt. Nur dass ich den Code gerne ganz verstehen würde. Ich versuche ihn einfach mal langsam Schritt für Schritt durchzugehen

viele Grüße aus dem Vorspessart :-)
Karl-Heinz


Wie klein doch manchmal auch das WWW ist :)

Anzeige
AW: Mehrfach vorhandene Zellen löschen
10.04.2008 22:16:00
Daniel
Hab leider doch noch etwas gravierendes gefunden. Wenn ich in Spalte1 mehrere gleiche Zellen habe dann werden dies (bis auf eine) auch gelöscht. Dies sollte jedoch nur passieren wenn gleichzeitig in den jeweiligen Zeilen auch die Zellen in Spalte2 gleich sind.
Kurz und knapp gesagt sollen alle Zeilen gelöscht werden wo Zellen in Spalte 1 und 2 gleichzeitig mehrfach vorhanden sind.

AW: Mehrfach vorhandene Zellen löschen
11.04.2008 14:59:00
volti
Hallo Daniel,
das immer eine Zeile übrigbleibt war mir klar. Ich hatte das halt so verstanden. Na ja wenn alles weg soll, muss man nochmal neu überlegen. Da muss sich das Tool, merken, wo die erste Fundstelle war; das wird etwas schwieriger.
Aber noch mal zum Verständnis: Da ich ja immer FeldA & FeldB zu einem Begriff zusammenfasse und mit einem zusätzlichen Zeichen absicher, kommt mir der Gedanke, ohne dass ich das jetzt ausprobieren könnte, dass einer der Felder (z.B.) FeldB leer ist.
Ein leeres Feld ist mit einem anderen leeren Feld natürlich auch gleich, wie zwei gleiche Einträge.
Also (FeldA-Zeile1 = FeldA-Zeile2) und (FeldB-Zeile1 (leer) = FeldB-Zeile2 (leer)
Ist das so?
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Mehrfach vorhandene Zellen löschen
11.04.2008 16:03:16
volti
Hallo Daniel,
schau mal, ob's so besser ist.

Sub MachDeinDing()
Dim X As Integer, Zeile As Integer, T As String, SchonDa As String, DieErsten As String,  _
Such As String
Zeile = 1
'Alles durchgehen und Mehrfache löschen bzw. erste festhalten
For X = 1 To 1000
Such = "@" & Cells(Zeile, 1) & "@" & Cells(Zeile, 2) & "@"
If InStr(SchonDa, Such) > 0 Then
T = Trim$(Str$(Zeile)) & ":" & Trim$(Str$(Zeile))
Rows(T).Delete Shift:=xlUp
If InStr(DieErsten, Such) = 0 Then DieErsten = DieErsten & Such
Else
SchonDa = SchonDa & Such
Zeile = Zeile + 1
End If
Next
'Alles durchgehen und die ehemals mehrfachen Ersten löschen
For Zeile = 1 To Zeile
If InStr(DieErsten, Such) > 0 Then
T = Trim$(Str$(Zeile)) & ":" & Trim$(Str$(Zeile))
Rows(T).Delete Shift:=xlUp
End If
Next
End Sub


viele Grüße
KH

Anzeige
AW: Mehrfach vorhandene Zellen löschen
11.04.2008 17:24:00
Daniel
Hallo Karl Heinz,
also das mit den leeren Zellen ist mir auch aufgefallen und trifft so zu wie du es vermutet hast. Die zweite Version mit "den Ersten" werde ich heute noch testen. Bin eben erst ins Internet gekommen und freu mich dass du dir das Ganze nochmal angeschaut hast.
Nochmal wegen "den Ersten". Mein zweiter Schritt bei der "Entrümpelung" wäre alle Zeilen rauszunehmen die in Spalte 1 und in Spalte 2 einmalig sind. Theoretisch sind das doch "die Ersten" dann auch, oder? Übrig beliben sollen dann nur noch Zeilen die in Spalte1 oder in Spalte2 gleich sind. Ich würde gerne eins nach dem anderen aussortieren damit ich den Überblick behalten kann. Die letzte Säuberung soll auch nur gemacht werden wenn ich noch mehr als 500 Zeilen habe oder so.
Vielen Dank für Version 2 und deinen Überlegungen!
Schönen Gruß und Start ins Wochenende!

Anzeige
AW: Mehrfach vorhandene Zellen löschen
11.04.2008 19:55:30
Volti
Hallo Daniel,
leider hatte ich vergessen, in der zweiten Schleife auch wieder den Suchbegriff zusammenzubauen. Sorry.
Hier noch mal neu:

Sub MachDeinDing()
Dim X As Integer, Zeile As Integer, T As String, SchonDa As String, DieErsten As String,  _
Such As String
Zeile = 1
'Alles durchgehen und Mehrfache löschen bzw. erste festhalten
Application.ScreenUpdating = False
For X = 1 To 1000
Such = ",@" & Cells(Zeile, 1) & "@" & Cells(Zeile, 2) & "@"
If InStr(SchonDa, Such) > 0 Then
Rows(Zeile).Delete Shift:=xlUp
If InStr(DieErsten, Such) = 0 Then DieErsten = DieErsten & Such
Else
SchonDa = SchonDa & Such
Zeile = Zeile + 1
End If
Next
'Alles durchgehen und die ehemals mehrfachen Ersten löschen
For Zeile = 1 To Zeile
Such = ",@" & Cells(Zeile, 1) & "@" & Cells(Zeile, 2) & "@"
If InStr(DieErsten, Such) > 0 Then
Rows(Zeile).Delete Shift:=xlUp
End If
Next
Application.ScreenUpdating = True
End Sub


Die mehrfachen "@" habe ich jetzt eingebaut, damit man feststellen kann, ob ein Leerfeld vorkommt.
Leider weiß ich immer noch nicht so ganz genau, was Du eigentlich haben möchtest.
Diese Sub macht (hoffentlich) folgendes:
Alle Zeilen, in denen Feld1 und Feld2 gleich sind, komplett entfernen. Wenn eines der Felder 1 oder 2 leer ist, stimmt dieses mit Zeilen, in denen dieses Feld auch leer ist und das jeweils andere gleich ist auch überein.
Leider habe ich kein Spielfeld, wo ich den harten Praxiseinsatz testen kann.
Gruß
KH

Anzeige
AW: Mehrfach vorhandene Zellen löschen
11.04.2008 19:56:00
Volti
Hallo Daniel,
leider hatte ich vergessen, in der zweiten Schleife auch wieder den Suchbegriff zusammenzubauen. Sorry.
Hier noch mal neu:

Sub MachDeinDing()
Dim X As Integer, Zeile As Integer, T As String, SchonDa As String, DieErsten As String,  _
Such As String
Zeile = 1
'Alles durchgehen und Mehrfache löschen bzw. erste festhalten
Application.ScreenUpdating = False
For X = 1 To 1000
Such = ",@" & Cells(Zeile, 1) & "@" & Cells(Zeile, 2) & "@"
If InStr(SchonDa, Such) > 0 Then
Rows(Zeile).Delete Shift:=xlUp
If InStr(DieErsten, Such) = 0 Then DieErsten = DieErsten & Such
Else
SchonDa = SchonDa & Such
Zeile = Zeile + 1
End If
Next
'Alles durchgehen und die ehemals mehrfachen Ersten löschen
For Zeile = 1 To Zeile
Such = ",@" & Cells(Zeile, 1) & "@" & Cells(Zeile, 2) & "@"
If InStr(DieErsten, Such) > 0 Then
Rows(Zeile).Delete Shift:=xlUp
End If
Next
Application.ScreenUpdating = True
End Sub


Die mehrfachen "@" habe ich jetzt eingebaut, damit man feststellen kann, ob ein Leerfeld vorkommt.
Leider weiß ich immer noch nicht so ganz genau, was Du eigentlich haben möchtest.
Diese Sub macht (hoffentlich) folgendes:
Alle Zeilen, in denen Feld1 und Feld2 gleich sind, komplett entfernen. Wenn eines der Felder 1 oder 2 leer ist, stimmt dieses mit Zeilen, in denen dieses Feld auch leer ist und das jeweils andere gleich ist auch überein.
Leider habe ich kein Spielfeld, wo ich den harten Praxiseinsatz testen kann.
Gruß
KH

Anzeige
AW: Mehrfach vorhandene Zellen löschen
11.04.2008 21:24:00
Daniel
Hallo
überlege dir mal, wie du so eine Aufgabe ohne VBA am schellsten erledigen würdest:
1. Spalte einfügen mit einer Formel, die alle zu löschenden Zeilen kennzeichnet
2. daten nach dieser Spalte sortieren
3. alle gekennzeichneten Zeilen löschen.
genau das macht dieses Makro:

Sub test()
Dim z1 As Long, z2 As Long
z1 = ActiveSheet.UsedRange.Row
z2 = ActiveSheet.UsedRange.Rows.Count
Range("A:B").Insert
Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;ZEILE())"
With Cells(z1, 1).Resize(z2, 2)
.Formula = .Value
.EntireRow.Sort key1:=Cells(z1, 1)
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
On Error GoTo 0
.EntireColumn.Delete
End With
End Sub


Gruß, Daniel

Anzeige
AW: Mehrfach vorhandene Zellen löschen
12.04.2008 11:25:00
Daniel
Guten Morgen Karl Heinz,
die Version 2 des ersten Makros hat leider noch nicht ganz funktioniert da aus noch unerklärlichen Gründen noch Zellen die gelöscht werden sollen vorhanden bleiben.
die Version 1 des zweiten Makros (Dein letzter Beitrag) funktioniert erstmal tadellos :) Alle Zeilen die raus müssen werden gelöscht. Und das durch so wenige Zeilen Code... aber die Vorgehensweise des Makros ist mir allerdings noch nicht ganz einleuchtend. Korrigiere mich bitte wenn ich falsch liege.
1. Du erstellst eine weitere Spalte, die optisch zwar leer ist allerdings alle zu löschende Zellen kennzeichnet
2. Dann soll die Spalte noch sortiert werden (Verstehe ich nicht weil die zu löschenden Zeilen ja schon Markiert sind und doch eigentlich einfach gelöscht werden könnten)
3. Die markierten Zeilen löschen
Dein Code scheint zwar perfekt zu funktionieren aber ich würde ihn auch sehr gerne verstehen :o) Ich wäre dir deshalb sehr dankbar wenn du mir ein paar Kommentare zu den Zeilen machen könntest. Hab zwar schon Programmierkenntnisse in anderen Sprachen doch in Sachen VBA bin ich noch in den Anfangsschuhen. Ich bin von den Möglichkeiten begeistert und will mir unbedingt mehr verstehen.
Achja hier ist ein kurzes Tesfile

Die Datei https://www.herber.de/bbs/user/51473.xls wurde aus Datenschutzgründen gelöscht

das ich immer zum testen benutze. Die roten Zellen müssen verschwinden.
Schöne Grüße
Daniel

Anzeige
AW: Mehrfach vorhandene Zellen löschen
12.04.2008 13:56:00
Daniel
Hallo Daniel (oder Karl-Heinz, bin grad etwas verwirrt)
das von dir hochgeladene Makro ist nicht von Volti, sondern von mir, deinem Namensvetter.
ich dachte, ich hätte schon beschrieben, wie ich die Daten lösche:

Sub test()
Dim z1 As Long, z2 As Long
z1 = ActiveSheet.UsedRange.Row
z2 = ActiveSheet.UsedRange.Rows.Count
Range("A:B").Insert
Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;ZEILE())"
With Cells(z1, 1).Resize(z2, 2)
.Formula = .Value
.EntireRow.Sort key1:=Cells(z1, 1) '--- kann weggelassen werden, dann wirds bei grossen  _
Tabellen langsamer
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 4).select ' --- diese Zeile ist nur nur zur  _
Verdeutlichung im Einzelstepmodus
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
On Error GoTo 0
.EntireColumn.Delete
End With
End Sub


lass mal diesen Code im Einzelstep-Modus durchlaufen, schau dir auch die eingefühgten Formeln an und du wirst verstehen was passiert:
ich füge eine Formel ein, die alle Zeilen, die gelöscht werden sollen, mit einem Wahrheitswert kennzeichnet.
Zellen, die einen Wahrheitswert enthalten, kann man über BEARBEITEN - GEHE ZU - INHALTE gezielt selektieren und dann löschen.
Ganz einfach.
Das Sortieren ist zwar nicht zwingened erforderlich, aber es beschleuinigt den Löschvorgang ungemein, wenn alle zu löschenden Zelllen direkt untereinander stehen.
dh. wenn du von 1000 Zeilen jede 2. Löschen willst, dann sind das für Excel immer 500 einzelne Löschaktionen.
sortierst du aber um, so daß du die Zeilen 1-500 löschen kannst, ist es nur eine Löschaktion.
Gruß, Daniel

AW: Mehrfach vorhandene Zellen löschen
13.04.2008 13:01:00
Daniel
Hallo Daniel, erstmal sorry wegen der Verwechslung :) ! Verstehe leider die einzelnen Schritte noch immer nicht ganz. Ich bleib aber am Ball.
Möchte eigentlich anstatt Zeile 1 und 2 die Zeilen 4 und 12 vergleichen. hatte das anfangs nicht erwähnt da ich mein Vorhaben so einfach wie möglich darstellen wollte.
Eigentlich müsste ich doch nur aus

Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;ZEILE())"
With Cells(z1, 1).Resize(z2, 2)


folgendes machen


Cells(z1, 12).Resize(z2, 4).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 4).Resize(z2, 4).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1; _
WAHR;ZEILE())"
With Cells(z1, 4).Resize(z2, 12)


aber leider reicht das nicht.

AW: Mehrfach vorhandene Zellen löschen
13.04.2008 21:36:00
Daniel
Hallo Daniel,
also wie schon erwähnt dein Makro läuft einwandfrei nur leider schaff ich es nicht es so umzuändern, dass die Spalten 4(D) und 12(L) aussortiert werden. Klar Range("A:B").Insert muss auch angepasst werden aber irgendwie bekomme ich es nicht hin, dass es läuft. Eine weitere Frage wäre, ob die benachbarten Spalten unverändert bleiben da in meinem Dokument jede Zeile 14 Spalten hat und diese sofern die jeweilige Zeile nicht gelöscht wird unverändert bleiben sollten
Also wenn du oder jemand anders nochmal kurz Zeit hätte um mir zu erklären wie ich das Makro so umschreibe dass statt nach Spalte 1 und 2 nun auf 4 und 12 aussortiert wird wäre ich dir sehr dankbar!
Schöne Grüße
Daniel

AW: Mehrfach vorhandene Zellen löschen
13.04.2008 21:47:00
Daniel
Also wie schon gesagt das Makro läuft einwandfrei nur leider schaff ich es immer noch nicht die zu sortierenden Spalten von 1(A) und 2(B) auf 4(D) und 12(L) zu änderen. Also wenn du oder jemand anders sich das nochmal anschauen könnte wäre ich sehr danbar.
Allen einen schönen Abend!

AW: Mehrfach vorhandene Zellen löschen
15.04.2008 10:36:00
Daniel
Hallo,
das Script von Daniel funkltioniert einwandfrei. Wie vielleicht einige bereits wissen möchte im Anschluss noch sämtliche Unikate aus Spalte L(12) markieren und sortieren.
Jetzt ist mir eingefallen, dass ich doch eigentlich im Anschluss der Markierung der Spallte die _ >1 mal in Spalte A(1) und B(2) vorkommen noch eine Abfrage nach wahr und falsch für Werte in Spalte L(12) die =1 (Unikate) sind mache. Die Abfrage müsste ja dann ähnlich wie der von Daniel laute nur mit =1 statt >1 lauten

"=WENN(ZÄHLENWENN(S(1);ZS(1))=1;WAHR;Zeile())"


Am Ende sollten dann alle Doppelt in Spalte A und B sowie im Anschluss alle Einfach in Spalte L vorkommenden mit Wahr gekennzeichnet und nach unten sortiert sein damit sie zum Schluss auf einen Rutsch löschen kann. Also genauso wie in Daniels Makro nur noch mit Erweiterung.
Range("A:B").Insert
Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;Zeile())"
With Cells(z1, 1).Resize(z2, 2)
.Formula = .Value
.EntireRow.Sort key1:=Cells(z1, 1)
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 4).Select ' Einzelstepinfo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
On Error GoTo 0
.EntireColumn.Delete
End With
End Sub

AW: Mehrfach vorhandene Zellen löschen
15.04.2008 11:05:00
Daniel
Hat sich erledigt, habe das ganze einfach nochmal hinten angehängt. trotzdem Danke!

Sub test()
Dim z1 As Long, z2 As Long
z1 = ActiveSheet.UsedRange.Row
z2 = ActiveSheet.UsedRange.Rows.Count
Range("A:B").Insert
Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(1)&ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;Zeile())"
With Cells(z1, 1).Resize(z2, 2)
.Formula = .Value
.EntireRow.Sort key1:=Cells(z1, 1)
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 4).Select
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
On Error GoTo 0
.EntireColumn.Delete
End With
Range("A:B").Insert
Cells(z1, 2).Resize(z2, 1).FormulaR1C1Local = "=ZS(2)"
Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))=1;WAHR;Zeile())"
'Wenn ID einmal vorhanden
With Cells(z1, 1).Resize(z2, 2)
.Formula = .Value
.EntireRow.Sort key1:=Cells(z1, 1)
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 4).Select
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
On Error GoTo 0
.EntireColumn.Delete
End With
End Sub


AW: Mehrfach vorhandene Zellen löschen
16.04.2008 00:23:15
Daniel
Hi
ich war grad ein paar Tage in Ischgl, da gabs wichtigere Dinge zu tun, als anderere Leute Excel-Probleme zu lösen.
aber schön, wenn sich das Thema erledigt hat.
nur nochmal zur erklärung:
die Entscheidung, welche Zelle gelöscht wird und welche nicht, wird mit dieser Zeile über die Excel-Formel getroffen:

Cells(z1, 1).Resize(z2, 1).FormulaR1C1Local = "=WENN(ZÄHLENWENN(S(1);ZS(1))>1;WAHR;Zeile())"


wenn ich die Bedingung ändert, muss eigentlich nur diese Formel angepasst werden, der Rest des Makros kann erhalten bleiben.
die Formel kannst du auch direkt in Excel (dh. ohne VBA ) entwickeln, dh du bastelst dir eine WENN-Formel, die für alle Zeilen, die gelöscht werden sollen den Wert WAHR als ergebnis hat und für alle anderen Zeilen als Ergebnis die Zeilen-Nr. der Zeile (dadurch bleibt die Original-Reihenfolge beim Sortieren auf jeden Fall erhalten).
Wenn du diese Formel hast, dann Selektierst du eine Zelle und gibst im Direktfenster den Befehl:
"?selection.formular1c1local" ein.
das Ergebnis kannst du dann in den Makrocode einfügen.
Gruß, Daniel
PS die Formel in Spalte B habe ich nur eingefügt, weil sich über diese Hilfsspalte das eigentliche Ergebnis leicher berechnen lässt (dh. mit einer einfacheren Formel)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige