Duplikate in Spalte suchen in Excel 2003

  • #1
B

berliner-loewe

Bekanntes Mitglied
Themenersteller
Dabei seit
20.02.2004
Beiträge
4.606
Reaktionspunkte
0
Ort
Berlin
Hallo Gemeinde,

stehe mal wieder total auf dem Schlauch.

Brauche eine Funktion die überprüft ob es Duplikate in einer Spalte gibt.

Wer kann mir auf die Sprünge helfen?

Danke im voraus
 
  • #2
Ich...

Formel in Nachbarspalte runterkopieren:

=WENN(VERGLEICH(A1;A:A;0)=ZEILE();;Doppelt)

Gruß
PiPi
 
  • #3
pipi schrieb:
Ich...

Formel in Nachbarspalte runterkopieren:

=WENN(VERGLEICH(A1;A:A;0)=ZEILE();;Doppelt)

Gruß
PiPi

@pipi

Danke, funktioniert einwandfrei. ;)

Gibt es aber eventuell noch eine andere Möglichkeit ohne Hilfsspalte?
Das ist bei 52 Spalten recht aufwändig und wird dadurch auch m. E. etwas unübersichtlich.

Wünsche schon mal ein entspannendes WE und geniesst die Sonne ;)
 
  • #4
hi,

hab eine kleine gegen frage

also bei so einer liste hier:

Code:
a
b
c
d
b
e
f
g

willst du allgemein überprüfen ob z.B. b mehrmals vorkommt oder jeweils nur der erste wert wie hier a?

mfg billy
 
  • #5
Hallo Billy 17,

jeder Wert in der Spalte darf nur einmal vorkommen.

Also wie in deinem Beispiel, darf weder a, noch b, noch c usw. doppelt vorhanden sein.

Dies funktioniert mit der Funktion von pipi einwandfrei, hat nur den Nachteil dass ich so 54 zusätzliche Spalten einfügen muss, was vom Arbeitsaufwand her auch kein Problem ist, aber die Übersichtlichkeit könnte etwas leiden ;)

Habe es im Moment zusätzlich über die bedingte Formatierung abgefangen, so das die Zusatzspalten recht schmal gehalten werden können.

Wenn es aber eine komfortablere Lösung geben würde, wäre es sicherlich noch besser für die Übersicht.
 
  • #6
oke

und öhm... sorry die frage aber wieviele Spalten hast du? also von A bis zu welchem buchstaben?
 
  • #7
Die Spaltennummerierung geht von A - AZ,

in der ersten Zeile ist die Spaltenüberschrift KW1 bis KW52.

Zusatzlich sind pro Spalte 181 Zeilen zu überprüfen, diese Zahl könnte sich aber noch verändern.
 
  • #8
oke

versuchs mal hiermit

ich hoffe, ich hab mich mit den Kommentaren klar ausgedrückt sonst einfach Nachfragen (ich bin nicht der Profi wenn es darum geht Kommentare zu schreiben :-[)

Code:
Option Explicit
Sub dublikatesuchen()
Const c_spalten = 3->Hier gibst du die Anzahl Spalten ein
Const c_reihen = 50->Hier gibst du die Anzahl Reihen ein

'Das Makro ist so aufgegleist dass sie spalte um Spalte kontrolliert. Jeder Zelleninhalt
'von der ersten bis zur letzten Zelle wird überprüft ob Sie mehr als 2 mal vorkommt.

Dim reihe As Long, inhalt As String, bereich As String, spalte As Long

'Hier wird von der 1. bis zur oben definierten Spalte überprüft
For spalte = 1 To c_spalten
 
->Die eigentliche Reihenkontrolle
 For reihe = 2 To c_reihen

 inhalt = Cells(reihe, spalte).Value
 bereich = Cells(reihe, spalte).Address(rowabsolute:=0, columnabsolute:=0) & : & _
 Cells(c_reihen, spalte).Address(rowabsolute:=0, columnabsolute:=0)
 
->Sobald der aktuelle Zelleninhalt in der aktuellen Spalte mehr als 2 mal vorkommt, kann was passieren ^^
 If ActiveSheet.Application.WorksheetFunction.CountIf(ActiveSheet.Range(bereich), inhalt) >= 2 Then
  MsgBox Der Zelleninhalt  & inhalt & kommt mindestens 2 mal vor.
 End If
 
 Next reihe

Next spalte

End Sub

mfg billy
 
  • #9
HAllo Billy 17,

danke für den Code.
Er scheint zu funktionieren, leider zeigt er mir nicht die Zellen mit dem mehrfach vorkommenden Eintrag an.

Besteht die Möglichkeit, an den Zellen wo sich ein mehrfach vorkommender Eintrag pro Spalte befindet, die Prüfung anzuhalten und die Zelle anzuzeigen, so das man gleich Änderungen vornehmen kann, bzw. diese farblich hervorzuheben?

Dafür könnte man sich dann die Ausgabe in der Msg-Box ersparen.

Grüße aus dem unter Wasser stehenden Berlin

Edit: Noch besser wäre es, mir nicht nur die eine Zelle anzuzeigen an der der mehrfach vorkommende Wert steht, sondern alle dazugehörigen. :-\

Hoffe dieser Wunsch ist nicht zu unverschämt :)
 
  • #10
bla schrieb:
Edit: Noch besser wäre es, mir nicht nur die eine Zelle anzuzeigen an der der mehrfach vorkommende Wert steht, sondern alle dazugehörigen.

und die dann ein einer Fehlermeldung sozusagen oder einfach nur die Zellen einfärben?
 
  • #11
Billy schrieb:
und die dann ein einer Fehlermeldung sozusagen oder einfach nur die Zellen einfärben?

oder einfach nur die Zellen einfärben wäre ausreichend und sehr hilfreich, denke ich jedenfalls.

Kann sein das es in der Praxis dann doch anders gebraucht wird.
Aber jetzt habe ich es ja so ähnlich aber mit der Hilfsspalte ;)
 
  • #12
oke

ich hab jetzt dies und das einwenig geändert und einfach mal als Zellenhintergrundfarbe Gelb genommen. Du kannst sie noch ändern. Es steht wo genau sie sind ^^

wie gewünscht wurde wird das Makro beendet. Sobald in der aktuellen Spalte auch nur ein zeichen doppelt vorkommt, werden die betreffenden zellen gelb eingefärbt, das erste vorkommen aktiviert.

Code:
Option Explicit
Sub dublikatesuchen()
Const c_spalten = 3->Hier gibst du die Anzahl Spalten ein
Const c_reihen = 50->Hier gibst du die Anzahl Reihen ein

Dim reihe As Long, inhalt As String, bereich As String, spalte As Long, anzahl As Long
Dim c, firstfound As String

'Hier wird von der 1. bis zur oben definierten Spalte überprüft
For spalte = 1 To c_spalten
 
->Die eigentliche Reihenkontrolle
 For reihe = 2 To c_reihen

 inhalt = Cells(reihe, spalte).Value
 bereich = Cells(reihe, spalte).Address(rowabsolute:=0, columnabsolute:=0) & : & _
 Cells(c_reihen, spalte).Address(rowabsolute:=0, columnabsolute:=0)
 anzahl = ActiveSheet.Application.WorksheetFunction.CountIf(ActiveSheet.Range(bereich), inhalt)
 
->Sobald der aktuelle Zelleninhalt in der aktuellen Spalte mehr als 2 mal vorkommt, kann was passieren ^^
 If anzahl >= 2 Then
 ->Suchen der Spalten und einfärben
  With ActiveSheet.Range(bereich)
  Set c = .Find(inhalt, Lookat:=xlWhole)
  If Not c Is Nothing Then
   firstfound = c.Address
   Do
    If anzahl = 1 Then
     c.Activate->Erstes vorkommen wird aktiviert
    Else
     anzahl = anzahl - 1
    End If
    c.Interior.ColorIndex = 6->Zellenhintergrund wird gelb gefärbt
    Set c = .FindNext(c)
   Loop While Not c Is Nothing And c.Address <> firstfound
  End If
  End With
 ->makro beenden
  Exit Sub
 End If
 
 Next reihe

Next spalte

End Sub

mfg billy
 
  • #13
Hallo Billy 17,

ich danke Dir vielmals.

Das ist echt super, wie Du dich meiner Problematik annimmst.

Noch eine Frage.
Habe mich vorhin sicher etwas unglücklich ausgedrückt.
Da jetzt die Zellen eingefärbt werden, muss der Code eigentlich nicht mehr angehalten werden.

Wie muss ich den Code anpassen, das er die Zellen bei Fund zwar einfärbt, aber trotzdem weitersucht?

Also zum Schluss sollen alle Zellen in denen ein Wert in einer Spalte mehrfach vorkommt farbig hinterlegt sein.
 
  • #14
im letzteren teil findest du

Code:
 ->makro beenden
  Exit Sub

die beiden zeilen kannst du löschen und das makro sollte weiter durchgeführt werden =)
 
  • #15
Billy schrieb:
im letzteren teil findest du

Code:
->makro beenden
 Exit Sub

die beiden zeilen kannst du löschen und das makro sollte weiter durchgeführt werden =)

Danke, werde es gleich mal testen :)

Hallo Billy,

habe es gerade getestet, es funktioniert ;D Danke, Danke, Danke

Besteht jetzt noch die Möglichkeit das die leeren Zellen nicht mit markiert (geprüft) werden?
 
  • #16
Hi zusammen,

@billy:
das nimmt ja richtig Formen an. Toll !!!!  :D :D :D

Für Strings ist das Makro komplett.

Während ihr noch diskutiert habt, habe ich auch ein wenig experimentiert. Dabei ist herausgekommen, dass die Find-Methode nur für als String formatierte Zellen zu gebrauchen ist.

Bei den Formaten Zahl und Datum und und und ... versagt sie  :'(
oder muß besonders gefüttert werden.

Einziger Ausweg: Values direkt miteinander vergleichen.

So ist dann nachfolgender Makro entstanden.

Funktion:
- eine Spalte oder eine Zelle markieren -> betreffende Spalte wird auf doppelte Einträge untersucht
- leere Zellen werden nicht untersucht
- wird ein doppelter Eintrag gefunden, wird für diesen eine Meldung aller Fundtellen zusammengestellt. Mit entsprechender Beantwortung einer Nachfrage kann man die erste Fundstelle oder die erste doppelte Fundstelle anspringen.

Gruß Matjes :)
Code:
Option Explicit
Sub DoppelteEintaegeInEinerSpalteFinden()

  Dim wb As Workbook
  Dim ws As Worksheet, l_rows As Long, l_col As Long
  Dim ws2 As Worksheet, l_rows2 As Long
  Dim l_ZeileErsteDoppelte As Long, x As Long, z As Long, y As Long, s_Spalte As String
  Dim s_Meldung As String, s_Doppelte As String, s_Adr As String, s_Such As String
  Dim f_doppelt() As Long, f_doppelt_cnt As Long, ret As Integer
  
  Set wb = ActiveWorkbook
  Set ws = ActiveSheet
  
  
  If Selection.Columns.Count > 1 Then
    MsgBox ( _
      Es sind  & Selection.Columns.Count &  Spalten selektiert. & vbLf & _
      Bitte slektieren Sie nur eine Spalte / Zelle.)
  Else
   ->letzte zeile bestimmen
    l_col = Selection.Column
    l_rows = ws.Cells(ws.Rows.Count, l_col).End(xlUp).Row
   ->Spalte in A-Form
    s_Spalte = ws.Columns(l_col).Address(rowabsolute:=False, columnabsolute:=False)
    s_Spalte = Left(s_Spalte, Len(s_Spalte) \ 2)
    
   ->Bildschirm-Update abschalten
    Application.ScreenUpdating = False
    
   ->Temporäres Blatt erzeugen
    Set ws2 = wb.Worksheets.Add
   ->relevante Spalte auf temporäres Blatt kopieren
    ws.Range(ws.Cells(1, l_col), ws.Cells(l_rows, l_col)).Copy Destination:=ws2.Range(Cells(1, 1), Cells(1, 1))
    ws2.Activate
   ->Zeilenummern in Spalte 2, dann nach Spalte 1 sortieren
    ws2.Cells(1, 2).Value = 1
    If l_rows > 1 Then
      ws2.Cells(1, 2).AutoFill Destination:=ws2.Range(Cells(1, 2), Cells(l_rows, 2)), Type:=xlFillSeries
      ws2.Range(ws2.Cells(1, 1), ws2.Cells(l_rows, 2)).Sort _
        Key1:=ws2.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
    End If
   ->releavnte Zeilenanzahl auf temp. Blatt/ Spalte1
    l_rows2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
   ->für alle Zellen der Spalte
    l_ZeileErsteDoppelte = 0
    For z = 1 To l_rows2 - 1
      With ws2.Cells(z, 1)
       ->Zell-Inhalt mit Nachfolger vergleichen
        If .Value = .Offset(1, 0).Value Then
         ->bei Gleichheit: ursprüngliche Zeilennummer aus Spalte 2
          l_ZeileErsteDoppelte = .Offset(0, 1).Value
         -> bei erstem Fund abbrechen
          GoTo Resultat
        End If
      End With
    Next
Resultat:
   ->dem resultat entsprechende Meldung aufbereiten
    If l_ZeileErsteDoppelte = 0 Then
      MsgBox (Es ist kein Begriff in Spalte  & s_Spalte &   mehrfach vorhanden.)
    Else
     ->alle Fundorte für den doppeltgefundenen Eintrag suchen und merken
      ReDim f_doppelt(1 To 1): f_doppelt_cnt = 0
      With ws.Cells(l_ZeileErsteDoppelte, l_col)
        For z = 1 To l_rows
          If z <> l_ZeileErsteDoppelte Then
            If .Value = ws.Cells(z, l_col).Value Then
              f_doppelt_cnt = f_doppelt_cnt + 1
              ReDim Preserve f_doppelt(1 To f_doppelt_cnt)
              f_doppelt(f_doppelt_cnt) = z
            End If
          End If
        Next
       ->Meldungstext zur ersten Fundstelle aufbereiten
        s_Meldung = _
          Erster mehrfach vorkommender Eintrag in  & _
          .Address(rowabsolute:=False, columnabsolute:=False) &  : & vbLf
        If Len(.Value) > 100 Then
          s_Meldung = s_Meldung & Left(.Value, 100) &  ....
        Else
          s_Meldung = s_Meldung & .Value
        End If
      End With
     ->Meldungstext der doppelten aufbereiten
      s_Doppelte = doppelt in : 
      For x = 1 To f_doppelt_cnt
        If x = 10 Then
          s_Doppelte = s_Doppelte &  , ....
          Exit For
        Else
          s_Adr = ws.Cells(f_doppelt(x), l_col).Address(rowabsolute:=False, columnabsolute:=False)
          If x <> 1 Then s_Doppelte = s_Doppelte & , 
          s_Doppelte = s_Doppelte & s_Adr
        End If
      Next
      ws.Activate
     ->erste Fundstelle selektieren
      ws.Cells(l_ZeileErsteDoppelte, l_col).Select
     ->Meldung ausgeben
      ret = MsgBox(s_Meldung & vbLf & vbLf & s_Doppelte & vbLf & vbLf & _
      Soll der nächste doppelte Eintrag selektiert werden ?, _
      vbYesNo + vbDefaultButton1 + vbQuestion)
      If ret = vbYes Then
       ->Wenn erster doppelter Fundort selektiert werden soll, selektieren
        ws.Cells(f_doppelt(1), l_col).Select
      End If
    End If
  End If
Aufraeumen:
  Application.DisplayAlerts = False
  ws2.Delete->temp.Blatt löschen
  Application.DisplayAlerts = False
 ->Bildschirmupdate anschalten
  Application.ScreenUpdating = False
 ->Objekt-Variablen freigeben
  Set ws2 = Nothing:Set ws = Nothing: Set wb = Nothing
End Sub
 
  • #17
Hallo Matjes,

danke, werde nachher auch mal deinen Code probieren ;)

Denke aber das die Prüfung auf string-formatierte Zellen ausreichend ist.

Aber schön wenn man auch schon eine Lösung für andere Aufgabenstellungen hat ;D
 
Thema:

Duplikate in Spalte suchen in Excel 2003

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.836
Beiträge
707.957
Mitglieder
51.488
Neuestes Mitglied
elkhse
Oben