Excel 2010 - VBA - Duplikate entfernen und nur Werte übertragen

Surtia

Lieutenant
Registriert
Feb. 2008
Beiträge
731
Aloha Community,

mit meinem Mini-Makro, zum Filtern von Duplikaten, stehe ich vor zwei Problemen und hoffe auf Hilfe.

Ich schreibe die Zellen B1 bis B50 ohne Duplikate von D1 bis D... .
Allerdings würde ich gern nur Werte ohne Formatierung übertragen. Ist das möglich?

Makro:
Code:
Sub Filter()
Range("D1:D20").ClearContents

Dim Q, Z As Range
Set Q = Range(Cells(1, 2), Cells(50, 2))
Set Z = Range("D1")

Q.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Z, Unique:=True
End Sub

Sollte erste Problematik klappen, so würde ich gern nur die Duplikate filtern, zu denen aus Spalte A ein bestimmter Name gehört.

Wäre über Hilfe sehr dankbar!
 

Anhänge

  • Beispiel Filter.zip
    12,9 KB · Aufrufe: 270
Zuletzt bearbeitet:
Spezialfilter ohne ohne Uebertragung der Formatierung geht meines Erachtens nicht.
Bei der Loesung muesstest du schlichtweg die Formatierung am Ende einfach loeschen bzw. wie gewuenscht setzen.

Zum zweiten Problem
Einfache Loesung: Tabelle um eine Spalte erweitern, die die Anzahl der Eintraege in Spalte A zählt und entsprechend die Spezialfilterkriterien fuer diese Spalte auf >1 setzen.

Laesst sich aber vielleicht auch direkt als Spezialfilterkriterium hinterlegen ...
 
Zuletzt bearbeitet:
Ok, danke Dir. Schade, dass es ohne Formatierung nicht geht.
Bin schon die ganze Zeit am Tüfteln aber finde keine Lösung.
Gibt es einen Befehl "an die vorhandene Formatierung anpassen"?
Wobei sich das vermutlich widerspricht, da ja zuvor mit der neuen Formatierung überschrieben wird. Mhhh...

Tabelle erweitern... Welche meinst Du genau? Die Range, welche im VBA definiert ist oder die Quelle selbst?
 
DragonGate schrieb:
Gibt es einen Befehl "an die vorhandene Formatierung anpassen"?
Ich bin mir unsicher, was du meinst ...
Um die Formatierung zu loeschen gibt es Range.ClearFormats.
Wenn du aber etwas anderes haben moechtest, musst du Schriftgröße/-Farbe, Zahlenformat manuell setzen.
Oder statt Range.ClearFormats gezielt einzelne Attribute auf Standard setzen.

DragonGate schrieb:
Tabelle erweitern... Welche meinst Du genau? Die Range, welche im VBA definiert ist oder die Quelle selbst?
Damit das Filterkriterium auch eine Wirkung zeigt, sollte die zu filternde Tabelle inkl. Range im Makro angepasst werden.
 
Es gibt in Excel die Möglichkeit in eine vorhandene Formatierung einzufügen. Also weder formatlos noch mit eigener Formatierung überschreiben. Aber wie gesagt, in meinem Fall beist sich die Katze in den Schwanz.

Puh ok. Damit muss ich mich auseinandersetzen. Ist quasi neu. Mal sehen ob das klappt.

Danke Dir jedenfalls!
 
Mit "Range.PasteSpecial xlPasteFormats" kannst du kopierte Formate "einfügen".
 
  • Gefällt mir
Reaktionen: Surtia
Tjoa, ich bekomme es einfach nicht umgesetzt, dass er nur die Duplikate entfernen soll, wenn in Spalte A ein ganz bestimmter Name steht.

Hat zufällig wer das Wissen bzw. die Möglichkeit es fix in das Makro zu tippen?
Das wäre wirklich super!
 
Ich habe das Gefuehl, du weißt nicht wie man mit dem Spezialfilter umgeht: yt-Link.
Dein zweites Problem hatte ich diesbezueglich wahrscheinlich auch falsch verstanden, weswegen der Teil in #2 ignoriert werden sollte.
 
Warum baust du nicht einfach eine IF Abfrage ein durch welche du eine Variable füer
Unique:=True/False setzt? Zumindest fällt mir das auf den ersten Blick in Auge ;-)
 
  • Gefällt mir
Reaktionen: Surtia
@Scientist
Damit hast du recht. Filtern ist für mich mit VBA neu.
Danke für den Link. Werde ihn mir auf jeden Fall ansehen.

@Janush
Habe den Ansatz überprüft aber es scheint nicht zu funktionieren. Das ist die Geschichte wo ich schrieb, dass sich die Katze selbst in den Schwanz beist - oder ich habe einen Denkfehler.

Code:
Sub Filter()
Range("D1:20").ClearContents

Dim Q As Range
Set Q = Range(Cells(1, 2), Cells(50, 2))
A = Application.WorksheetFunction.CountA(Q)
Set Z = Range("E1")

For i = 0 To A - 1
    j = False
    If Cells(1 + i, 1) = Range("H1") Then j = True
    Cells(1 + i, 3) = j 'Kontrolle
    Q.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Z, Unique:=j
Next
End Sub
 

Anhänge

  • Beispiel_Test.zip
    11,8 KB · Aufrufe: 249
Ähm, ok...was genau willst du eigentlich erreichen? Wenn in H1 Hugo steht, willst dann nur die Werte von Hugo haben, oder alle Werte incl. Olgas, wobei nur von Hugo die Duplikate entfernt werden sollen?

Wie oft wird dieses Makro verwendet werden und wie sehr lohnt es sich hier eine Lösung dafür zu präsentieren?
 
  • Gefällt mir
Reaktionen: Surtia
Wenn in H1 "Hugo" steht, dürfen in der Zielspalte (Ergebnis) nur die Werte aus Spalte B ohne Duplikate stehen.
Das Ergebnis darf nicht die Formatierung der Rohdaten enthalten, sondern muss ohne Formatierung erscheinen.

Hehe, es kommt darauf an aus wessen Sicht.
Für mich wäre es sehr lohnenswert, da mir extrem viel Zeit erspart werden würde.

In der Praxis geht es um eine Excel-Rohdatendatei, die aus einer Datenbank ausgelesen wurde.
Aus dieser Rohdatendatei müssen die Reklamationsgründe (hier Zahlen in Spalte B) in ein Zielformular (hier D1 oder E1) übertragen werden. Das dürfen sie allerdings nur dann, wenn ein ganz bestimmtes Automodell (hier Hugo oder Olga) betroffen ist. Werden zu diesem Automodell nun alle Reklamationsgründe gefunden können nicht zichtausend Gründe untereinander stehen, sondern müssen ohne Duplikate ins Formular - kein Formular ist zich tausend Zeilen lang. ;)
Naja und als i-Tüpfelchen darf die Formatierung aus der Rohdatendatei nicht übertragen werden, da sonst das Format des Formulars flöten geht.
 
Tja mit der Formatierung siehts eher schlecht aus, da es keine Option dafür im AdvancedFilter gibt. Selbst wenn du es im Nachhinein anpasst, dürfte das Formular schon kaputt sein.

Nochmal zu den Werten: Wenn da Hugo steht, sollen auch nur die Reklamationsgründe von Hugo gezogen werden? Also eigentlich immer unique, aber immer nur von dem Model welches du angegeben hast?
 
  • Gefällt mir
Reaktionen: Surtia
Dann wuerde ich Vorschlagen, die Liste in ein extra Blatt zu importierten, diese dann zu bearbeiten und anschließend nur die Werte ins Formular zu einzufuegen.
 
@Janush
Ja, wenn das Auto Hugo heisst, sollen alle dazugehörigen Reklamationsgründe (Spalte B) gezogen werden, jedoch ohne Duplikate.

Scientist hat recht aber es gibt quasi genügend Platz unterhalb oder neben dem Formular. Eine Zwischenliste ist also definitiv machbar. Müsste mir dann eben nur einen geeigneten Platz suchen. Hier im Beispiel wäre es egal wo.
 
So, hier hast du einen Lösungsansatz zu dem Thema. Ich hoffe du benutzt kein MAC, denn ich weiss nicht ob es da funktionieren würde.

Viel Spass beim knobeln :-)
 

Anhänge

  • Beispiel_Test.zip
    19,2 KB · Aufrufe: 273
  • Gefällt mir
Reaktionen: Surtia
Wow, super. Habe vielen Dank!
Jetzt muss es nur noch so funktionieren, dass Spalte E nicht mitgeschrieben wird, sondern nur das Ergebnis aus Spalte F. Ist das möglich?

Wozu dient das "Option Explizit" über dem Sub()?
Dieses Beispiel bzw Beispielmakro wird nur Bestandteil eines weitaus größeren Makros. Könnte dieser Zusatz "Option Explizit" zu Problemen führen?
 
Option Explizit heist, dass du jede Variable explizit deklarieren musst. Kann zu Problemen führen, wenn das im Rest des Programs nicht geschehen ist.

Woher kommt das größere Makro? Wer hat das gebaut?
 
  • Gefällt mir
Reaktionen: Surtia
D.h. Explizit ist nicht zwingend notwendig, oder?

Das kommt aus meinem Kopf. ;) Nur stieß ich auf diese für mich nicht lösbare Problematik und muss nun versuchen es irgendwie zu implementieren.

Jedoch muss ich das Problem, dass Spalte E mitgeschrieben wird noch lösen.
 
Genau deswegen habe ich gefragt, wenn du den Rest eines noch größeren Makros geschrieben hast und meinen Teil erfolgreich eingebaut hast, sollte das mit Spalte E mit einem Tastendruck erledigt sein ;-)
 
  • Gefällt mir
Reaktionen: Surtia
Zurück
Oben