Mehrfache Zelleninhalte löschen

Hallo!

Ich möchte in einer Excel-Tabelle eine Spalte auf mehrfache Inhalte untersuchen und diese löschen. Das klappt wunderbar, leider etwas zu konsequent.

Zellinhalte vorher: 1,2,3,4,4,5
Zellinhalte nachher: 1,2,3,5

Wie kann ich erreichen, dass das Ergebnis 1,2,3,4,5 ist, also ein Element der mehrfachen Inhalte übrigbleibt?

Die mehrfachen Inhalte folgen nicht aufeinander.

Danke für alle Antworten, Martin.

Welche Funktion oder Code ist dafür verantworlich.

unerwartet

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Welche Funktion oder Code ist dafür verantworlich.

unerwartet

Ich habe den Quellcode extra nicht angegeben, da er ja offensichtlich unzureichend ist. Ich nehme auch an, das die gesuchte Funktionalität häufig gebraucht wird und daher für erfahrene Programmierer schnell kopierbarer Standard ist.

Martin.

Hallo Martin,

leider hast Du ein paar Details weggelassen, daher vorerst nur ein paar Fragen:

Ich möchte in einer Excel-Tabelle eine Spalte auf mehrfache
Inhalte untersuchen und diese löschen. Das klappt wunderbar,
leider etwas zu konsequent.

Zellinhalte vorher: 1,2,3,4,4,5
Zellinhalte nachher: 1,2,3,5

Ist in jeder Zelle immer nur eine Zahl?
Soll die Zelle leer stehenbleiben, oder die zugehörige Zeile gelöscht werden?
Gehen wir mal von dem einfachsten Fall aus (Eine Zahl pro Zelle, Zellinhalt wird gelöscht, „wenig“ Elemente):

sucheanfang = **
Tabellenende = **
Spalte = **
Vergleichanfang = **
For x = sucheanfang To Tabellenende - 1
For i = Vergleichanfang To Tabellenende
If Worksheets("**").Cells(i, Spalte).Value = Worksheets("**").Cells(x, Spalte).Value Then Worksheets("**").Cells(i, Spalte) = „“
Next i
Vergleichanfang = Vergleichanfang + 1
Next x

**= Entsprechende Werte oder Namen eingeben.

Geht bestimmt auch eleganter, aber das hier sollte klappen.

Grüße,

Anwar

Etwas genauer und mein Quellcode

Ist in jeder Zelle immer nur eine Zahl?
Soll die Zelle leer stehenbleiben, oder die zugehörige Zeile
gelöscht werden?

Die Zellinhalte bestehen aus fünfstelligen Zahlen, die Zeilen mit den mehrfachen Zellinhalten sollen gelöscht werden. Es gibt ca. 200 Zeilen.

sucheanfang = **
Tabellenende = **
Spalte = **
Vergleichanfang = **
For x = sucheanfang To Tabellenende - 1
For i = Vergleichanfang To Tabellenende
If Worksheets("**").Cells(i, Spalte).Value =
Worksheets("**").Cells(x, Spalte).Value Then
Worksheets("**").Cells(i, Spalte) = „“
Next i
Vergleichanfang = Vergleichanfang + 1
Next x

Anwar

Mir ist noch nicht klar, wo im oberen Skript etwas passiert. Wenn ich es richtig sehe, besteht es doch aus zwei Schleifen und dem Vergleich eines jeden Zellinhalts mit jedem.

Wie kann ich bei einem erfolgreichen Vergleich wissen, ob es der erste ist (Zeile soll stehen bleiben) oder ein weitere (Zeile löschen)?

Wenn ich nach einem erfolgreichem Vergleich Zeilen lösche, dann verändert sich doch die Zeilennummer. Das müsste doch völliges Durcheinander für diese Funktion bedeuten.

Mein Quellcode:

Private Sub CButZeilen_Click()
Dim p As Integer 'Zählvariable für Zeilen
Dim q As Integer 'Zählvariable für Zeilen
Dim r As Integer 'zählt Übereinstimmungen

ReDim multiinhalt_l(1) 'mindestens eine Position, damit es in Schleife gefüllt werden kann
p = 2
Do Until ActiveWorkbook.Worksheets.Item(1).Cells(p, spalteident).Value = „“
r = 0
q = 2
Do Until ActiveWorkbook.Worksheets.Item(1).Cells(q, 5).Value = „“

If (ActiveWorkbook.Worksheets.Item(1).Cells(p, 5).Value = ActiveWorkbook.Worksheets.Item(1).Cells(q, 5).Value) = (p q) Then
r = r + 1
End If
q = q + 1
Loop
If r > 0 Then 'Speicher der mehrfachen Ident-Nr. füllen
s = UBound(multiinhalt_l)
ReDim Preserve multiinhalt_l(s + 1)
multiinhalt_l(s) = ActiveWorkbook.Worksheets.Item(1).Cells(p, 5).Value
End If
p = p + 1
Loop
End Sub

Ich erhalte also ein Array multiinhalt_l mit Nennungen der mehrfachen Inhalte, wo zwischen dem erstmaligen Auftreten eines Inhalts und dem weiteren Auftreten nicht unterschieden werden kann. Und was nun?

Hallo Martin,

Die Zellinhalte bestehen aus fünfstelligen Zahlen, die Zeilen
mit den mehrfachen Zellinhalten sollen gelöscht werden. Es
gibt ca. 200 Zeilen.

Dann etwa so:

Mir ist noch nicht klar, wo im oberen Skript etwas passiert.
Wenn ich es richtig sehe, besteht es doch aus zwei Schleifen
und dem Vergleich eines jeden Zellinhalts mit jedem.

Nicht „jeder mit jedem“, sondern „jeder mit jedem Nachfolgenden“, das ist auch der Schlüssel, warum nicht das „Original“ gelöscht wird, sondern nur die Nachfolger. Im Prinzip kannst Du das Skript, so wie ich es aufgeführt habe benutzen. Es lässt zwar die leeren Zeilen stehen, aber das kann man ja durch sortieren lösen. Probier’s mal aus.

Wenn ich nach einem erfolgreichem Vergleich Zeilen lösche,
dann verändert sich doch die Zeilennummer. Das müsste doch
völliges Durcheinander für diese Funktion bedeuten.

Ja, wenn Du die Zeilen tatsächlich löscht und nicht nur (wie ich es gemacht habe) den Zellinhalt. Mit Löschen der Zeile musst Du den Zählanfang und das Tabellenende variabel halten:

sucheanfang = **
tabellenende = **
Spalte = **
Vergleichanfang = **
For x = sucheanfang To tabellenende - 1
For i = Vergleichanfang To tabellenende
If Worksheets("**").Cells(i, Spalte).Value = Worksheets("**").Cells(x, Spalte).Value Then
Worksheets("**").Rows(i).Select
Selection.Delete
i = i - 1
tabellenende = tabellenende - 1
End If
Next i
Vergleichanfang = Vergleichanfang + 1

Ich erhalte also ein Array multiinhalt_l mit Nennungen der
mehrfachen Inhalte, wo zwischen dem erstmaligen Auftreten
eines Inhalts und dem weiteren Auftreten nicht unterschieden
werden kann. Und was nun?

Do…while und arrays sind zwar ganz schön, aber hier irgendwie mit Kanonen auf Spatzen geschossen. Das mach Dir Probleme.

Grüße,

Anwar

PS: beide Quellcodes sind ausführbar, musst Du nur noch richtig bei Dir einbinden!

Ist eigentlich ganz einfach
Mir war auch irgendwie schon klar, dass die Geräte zu groß sind, die ich da eingesetzt habe. Aber: jetzt geht es und ich bin sher zufrieden! Danke.