Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1160to1164
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

Doppelte Zeile löschen aber ...

Doppelte Zeile löschen aber ...
walli
Hallo Experten,
jetzt habe ich etwas schwieriges.
Ich möchte in der Datenbank die doppelten Zeilen,
ausgehend von der Spalte "B" die Nummern,
1 Zeile löschen, dabei ist es egal welche Zeile.
Wenn allerdings in der Spalte "AO" in einer Zeile
ein Betrag steht, soll die Zeile, in der NICHTS steht,
gelöscht werden.
Hier das Muster : https://www.herber.de/bbs/user/69896.xls
mfg walli

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Super Klasse Thorsten !
04.06.2010 14:31:11
walli
Hallo Torsten,
einwandfrei und schnell !
Kannst Du mir beschreiben was da abläuft, ich möchte was lernen,
kenne z.b. die 49 nicht und To 4 Step -1 ?
Danke im Voraus.
Schönes Wochenende !
mfg walli
AW: Super Klasse Thorsten !
04.06.2010 14:57:53
Oberschlumpf
Hi
Zuerst:
ändere diese Zeilen

Set lrgRow = .Range("B" & lloRow & ":AY" & lloRow)
If Application.WorksheetFunction.CountIf(lrgRow, "") = 49 Then
um in

Set lrgRow = .Range("B" & lloRow & ":AO" & lloRow)
If Application.WorksheetFunction.CountIf(lrgRow, "") = 39 Then
Der Codewechsel deswegen, weil nicht der Bereich B:AY sondern nur der Bereich B:AO geprüft werden muss.
Die Zahl 39 (vorher 49) ergibt sich aus der Anzahl leerer Zellen im Bereich B:AO.
Oder anders:
Bereich B:AO = Bereich 2:41
Die Differenz aus (Spalte) 41 - (Spalte) 2 ergibt 39.
Jetzt mein weiterer Erklärungsversuch:

Sub sbDelTwin()
Dim lloRow As Long, lrgRow As Range
'alles was zwischen With.. und End With steht, bezieht sich
'in diesem Fall auf Sheets(1) = das erste Tabellenblatt in der Datei
With Sheets(1)
'mit For... wird ein Schleifendurchlauf gestartet
'der Code Cells(Rows.Count, 1).End(xlUp).Row gibt als Start
'die in Spalte 1 (A) zuletztgenutzte Zeile zurück
'in deiner Bsp-Datei ist es die Zeile 312
'wenn du jetzt noch z Bsp 10 Zeilen mit Daten hinzufügen würdest,
'dann würde Cells(Rows.Count, 1).End(xlUp).Row als Startwert
'die Zeile 322 zurückgeben - also eben, wie gesagt, die zuletzt benutzte Zeile
'wenn du wissen willst, welche letzte Zeile in Spalte B benutzt wird,
'musst du den Code Cells(Rows.Count, 2).End(xlUp).Row verwenden
For lloRow = .Cells(Rows.Count, 1).End(xlUp).Row To 4 Step -1
'mit If... erfolgt ein Vergleich
'wenn der Wert der aktuell geprüften Zelle mit dem Wert
'der Zelle eine Zeile darüber gleich ist, dann...
If .Range("B" & lloRow).Value = .Range("B" & lloRow - 1).Value Then
'Vorbereitung für nächsten Vergleich
Set lrgRow = .Range("B" & lloRow & ":AO" & lloRow)
'...wenn die Anzahl der leeren Zellen = 39 ist, dann
If Application.WorksheetFunction.CountIf(lrgRow, "") = 39 Then
'lösche die aktuell geprüfte Zeile
'an dieser Stelle ist sicher, dass zwei gleich-
'lautende Zeilen keinen Eintrag haben, und
'es wird eine der zwei Zeilen, wie gewünscht, gelöscht
.Rows(lloRow & ":" & lloRow).Delete Shift:=xlUp
Else
'Else heisst in diesem Fall:
'...wenn die Anzahl der leeren Zellen NICHT! 39 ist, dann
'hat der Code zwei Zeilen gefunden, die zwar in Spalte B
'den selben Wert haben, aber in einer der beiden Zeilen
'existiert auch in Spalte AO ein Wert
'und in diesem Fall soll ja die Zeile gelöscht werden, die in
'Spalte AO keinen Eintrag hat
.Rows(lloRow - 1 & ":" & lloRow - 1).Delete Shift:=xlUp
End If
End If
Next
End With
Set lrgRow = Nothing
End Sub
Hilfts?
Ciao
Thorsten
Anzeige
vergessen
04.06.2010 15:13:29
Oberschlumpf
Hi
Die For... Zeile mit To 4 Step - 1
Die Schleife beginnt zu zählen mit dem Wert der zuletzt benutzten Zeile in Spalte A.
In der Bsp-Datei ist das Zeile 312.
Die Schleife wird beendet, wenn Zeile 4 erreicht ist.
Zeile 4 ist die erste Zeile mit Daten (in den Zeilen darüber stehen nur Überschriften und müssen innerhalb der Schleife nicht beachtet werden)
Damit jetzt vom Startwert 312 der Endewert 4 erreicht werden kann, muss die Schleife "rückwärts" laufen.
Deswegen Step - 1
Verstanden?
Ciao
Thorsten
AW: vergessen
04.06.2010 19:29:04
walli
Hallo Thorsten,
es beginnt doch ab Zeile 3, da stehen Daten drin und nicht Zeile 4.
Zeile 1 nichts,
Zeile 2 Überschriften, muß ich noch was ändern ?
mfg walli
Anzeige
Danke Thorsten habe noch...
04.06.2010 22:13:54
walli
Guten Abend Thorsten,
DANKE für die ausführliche Erklärung.
Habe noch dies geändert: To 3 Step -1
mfg walter
hier noch eine Version,
04.06.2010 14:52:08
Tino
Hallo,
auch wenn Thorsten schneller war. ;-|
Sub Makro1()
Dim MaxCol As Long
Dim rngHilfsSpalte As Range

With Tabelle1
    MaxCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
    
    With .Range("A3", .Cells(Rows.Count, 1).End(xlUp)).Resize(, MaxCol + 1)
        Set rngHilfsSpalte = .Columns(.Columns.Count)
        rngHilfsSpalte.FormulaR1C1 = "=IF((COUNTIF(C2,RC2)>1)*(RC41=""""),TRUE,ROW())"
        
        Sheets(.Parent.Name).EnableCalculation = False
        
        .Sort Key1:=rngHilfsSpalte.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        
        On Error Resume Next
        rngHilfsSpalte.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
        rngHilfsSpalte.EntireColumn.Clear
        On Error GoTo 0
    End With
    
    .EnableCalculation = True
End With

End Sub
Gruß Tino
Anzeige
Melde mich später, muß gerade weg Tino !
04.06.2010 19:30:56
walli
Hallo Tino,
werd etwas später Testen, muß gerade weg,
gebe nachher bescheid, vorerst aber schon mal DAnke,
mfg walli
AW: hier noch eine Version,
04.06.2010 22:16:23
walli
Guten Abend Tino,
in deiner Version bleiben die erhalten, wenn in beiden eine Zahl steht.
mfg walli
AW: hier noch eine Version,
04.06.2010 22:37:20
Tino
Hallo,
ich dachte nur Löschen wenn in AO nichts steht.
Erweitern wir den Code einfach, so bleiben keine doppelten stehen.
Option Explicit

Sub Makro1()
Dim MaxCol As Long
Dim rngHilfsSpalte As Range
Dim oSH As Worksheet

Set oSH = Tabelle1 'Tabelle anpassen 

With oSH
    MaxCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
    
    With .Range("A3", .Cells(Rows.Count, 1).End(xlUp)).Resize(, MaxCol + 1)
        Set rngHilfsSpalte = .Columns(.Columns.Count)
        rngHilfsSpalte.FormulaR1C1 = "=IF((COUNTIF(C2,RC2)>1)*(RC41=""""),TRUE,ROW())"
        oSH.EnableCalculation = False
        .Sort Key1:=rngHilfsSpalte.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        
        On Error Resume Next
        rngHilfsSpalte.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
        rngHilfsSpalte.EntireColumn.Clear
        On Error GoTo 0
        oSH.EnableCalculation = True
        
        '____________________________________________________________________
         
        rngHilfsSpalte.FormulaR1C1 = "=IF(COUNTIF(RC2:R100C2,RC2)=1,Row(),TRUE)"
        oSH.EnableCalculation = False
        .Sort Key1:=rngHilfsSpalte.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        
        On Error Resume Next
        rngHilfsSpalte.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
        rngHilfsSpalte.EntireColumn.Clear
        On Error GoTo 0
        oSH.EnableCalculation = True
    End With
    
    
End With

End Sub
Gruß Tino
Anzeige
Leider noch Falsch
04.06.2010 22:55:36
walli
Guten Abend Tino,
leider sind jetzt auch ALLE Zeilen gelöscht, wenn beide Leer sind in
Spalte AO.
Es soll aber 1 Zeile stehen bleiben.
Wenn aber von 2 Zeilen in einer Zeile in der Spalte AO ein Wert steht,
soll die mit Wert stehen bleiben.
mfg walli
mag nicht mehr, Du hast ja eine Lösung oT.
04.06.2010 23:38:35
Tino
neuer Tag, neues Glück.
05.06.2010 09:47:01
Tino
Hallo,
so müsste es richtig funktionieren wie Du es haben möchtest.
Sub Makro1()
Dim MaxCol As Long
Dim rngHilfsSpalte As Range

With Tabelle1
    MaxCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
    
    With .Range("A3", .Cells(Rows.Count, 1).End(xlUp)).Resize(, MaxCol + 1)
        .Sort Key1:=.Cells(1, 2), Order1:=xlAscending, Key2:=.Cells(1, 41), Order2:=xlDescending, Header:=xlNo
        
        Set rngHilfsSpalte = .Columns(.Columns.Count)
        
        rngHilfsSpalte.FormulaR1C1 = "=IF(COUNTIF(RC2:R" & .Rows(.Rows.Count).Row & "C2,RC2)=1,ROW(),TRUE)"

        Sheets(.Parent.Name).EnableCalculation = False

        .Sort Key1:=rngHilfsSpalte.Cells(1, 1), Order1:=xlAscending, Header:=xlNo

        On Error Resume Next
        rngHilfsSpalte.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
        rngHilfsSpalte.EntireColumn.Clear
        On Error GoTo 0
        
        .Sort Key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
    End With
    
    .EnableCalculation = True
End With
Gruß Tino
Anzeige
Geht doch !!! --))
05.06.2010 09:58:33
walli
Guten Morgen Tino,
geht doch...
Neuer Tag, also das ist doch auch Klasse,
danke.
Schönes Wochenende,
mfg walli

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige