Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Doppelte Einträge löschen Excel VBA





Frage

In Exceltabelle wird täglich erweitert. Diese Tabelle wird zu einer bestimmten Uhrzeit versendet und zu einer bereits bestehende Tabelle hineinkopiert. Nun werden jetzt auch Zeilen mit dem gleichen Inhalt hierhin kopiert. Diese doppelte Zeilen sollten gefunden werden und nur eine davon übrigbleiben.

Antwort 1 von Beverly

Hi,

eine Anrede und ein Gruß machen einen Beitrag doch viel freundlicher :-).

Schau mal auf meine HP, Seite "Beispiele m. VBA". Dort findest du das Beispiel Doppelte löschen. Vielleicht hilft dir das als Ansatz ja weiter.

Bis später,
Karin

Antwort 2 von debrö

Bitte um Entschuldigung!
Sicherlich war mein Eintritt, um salopp zu sagen etwas einfach...
Doch nun, danke ich dir Karin, auch die Aufmerksamkeit die du mir widmest.
Deine Lösung finde ich i.O. Jedoch werde ich den neu angefügten Tabelleninhalt vorher nicht sortieren können, denn die Zusendung erfolgt zu einer bestimmten Uhrzeit, deshalb habe ich hier keinen Einfluss darauf. Tatsache ist, dass der neue Inhalt aus der Originaltabelle zum alten (bearbeiteten)Zieltabellen-inhalt angehängt wird und die Originaltabelle enthält ja noch auch die alten Zeilen, die in der Zieltabelle bereits einmal enthalten sind.
Gruß Michael

Antwort 3 von Beverly

Hi Michael,

ist schon OK.

Wie häufig findet denn das Update der Daten statt? Du brauchs ja nicht den neu angefügten Inhalt vorher dortieren, sondern nach dem Anfügen die komplette Liste. Wenn das nicht jede 5 Minuten erfolgt, dürfte es doch kein Problem sein. Anschließend führst du dann den Code aus.

Verstehe bitte meine "Zweifel" richtig, aber ich kenne den Arbeitsablauf ja nicht genau und versuche, mir ein Bild zu machen.

Bis später,
Karin

Antwort 4 von debrö

Begrüße dich Karin,

danke für dein Verständnis.
Im Büro wird für mich in einer sog. TrafficLight-Arbeitsmappe in der Rechnungen-Tabelle alle an einem Tag geschriebene Rechnungen, sowohl Bar- als auch Überweisungsrechnungen eingetragen.
Der Aufbau in den Spalten ist folgender:
Datum, Rechnungs-Nr.:, Währung un HUF, Währung in Euro, Währung in USD, Partner, Zahlungsfrist, Verspätete Tage, Bezahlt am, Rechnungssumme.
Diese Tabelle wird im Büro täglich (hoffentlich) erweitert.
Diese Arbeitsmappe lasse ich per e-mail automatisch nach 17:00 Uhr zu mir versenden.
In meinem CashFlow-Program lade ich aus dieser Datei die Rechnungstabelle in eine Eingangstabelle komplett hoch. Per VBA selectiere ich zwischen Barbezahlungen bzw. Überweisungen und kopiere die Werte in die Tabellen "Barbezahlung" und "Überweisung". Hier kommen dann die doppelte Zeilen vor, die ich evtl. bereits am Vortag schin einmal aufgenommen habe. Diese komplett identische Zeilen sind dann zu löschen.
ich hoffe, habe mich verständlich ausgedrückt. Wissen tue ich was ich möchte aber wie in VBA?

Für deine Hilfe bedanke ich mich bereits an dieser Stelle.

Gruß
Michael

Antwort 5 von Beverly

Hi Michael,

wenn ich den Ablauf jetzt richtig verstanden habe, scheint der Spezialfilter die beste Methode zur Lösung deines Problems zu sein.
Das geht ganz ohne VBA. Wichtig ist, dass jede Spalte eine Überschrift hat. Am besten, du formatierst diese Überschrift fett - dadurch erkennt Excel sie sofort als Überschrift. Markiere alle Spalten -> Daten -> Filter -> Spezialfilter. Aktion: An eine andere Stelle kopieren. Als Kriterienbereich wählst du alle Spalten mit deinen Daten aus, unter Kopieren nach wählst du ein Zelle in deiner Tabelle aus, in der keine Daten stehen - z.B. D1, wenn deine Daten bis Spalte C gehen. Aktiviere unbedingt "keine Duplikate". Anschließend brauchst du nur noch die Ausgangsspalten löschen.

Wenn du das Ganze aber doch noch automatisch ablaufen lassen willst, brauchst du es nur mit dem Makrorecorder aufzeichenen und ein wenig nachbearbeiten. Das Endergebnis sollte dann in etwas so aussehen (ich habe es mal für 3 Spalten gemacht

 Sub doppelte_loeschen()
    Columns("A:C").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Columns( _
        "A:C"), CopyToRange:=Range("D1"), Unique:=True
    Columns("A:C").Delete
End Sub



Bis später,
Karin

PS: die Mail war also von dir. Nochmals - danke

Antwort 6 von debrö

Servus Karin,

guter Idee.
Habe inzwischen dein erstes Macro überarbeitet.
Der aktuelle "Rechnungen"-Stand wird aus dem Trafficlight komplett in die CashFlow-Mappe in "Rechnungen"-Tabelle reinkopiert, also angehängt.
Derweil filtere ich diese Daten nach Datum, Partner und Summe per Hand nun.
So werden die Dupplikate zueinandergestellt.
Anschliessend lasse ich dein abgeändertes Makro laufen, in dem die Dupplikate gelöscht werden. Dann erst kopiere ich den gesamten Inhalt zu den Bargeldzahlungen bzw. zu den Überweisungen. Hier lösche ich nach Kriterien die Zeilen die hier nicht relevant sind.
Dann habe ich die Daten für beide Fälle up-to-date.
Nun sind diese Daten fertig zur Weiterbearbeitung in die Cashflow-Beobachtung.
Es wird alles richtig gemacht.
Geht aber das ganze nicht etwas automatischer?
Ich würde dir gerne einen Auszug aus dieser Tabelle mit Makros zusenden, doch wie?

Antwort 7 von Beverly

Hi Michael,

wenn du die einzelnen Makros schon hast, musst du das Ganze nur noch zusammenbringen. Entweder du schreibst sie alle in ein Makro oder du rufst eines nach dem anderen auf, indem du einfach den Namen der Makros in der Reihenfolge ihres Aufrufs hintereinander schreibst.

Versuche es erst einmal so. Falls es nicht funktioniert - auf meiner HP findest du eine Mailadresse.

Bis später,
Karin

Antwort 8 von Beverly

Hi Michael,

weshalb machst du es nicht umgekehrt - kopierst erst alle, filterst und löschst dann die doppelten?

Sind deine Partner immer dieselben? Dann könnte man ja eine Liste erstellen. Diese Liste nimmt man als Basis für das Filtern, was man dann möglicherweise automatisch ablaufen lassen könnte.

Bis später,
Karin

Antwort 9 von debrö

Schönen Abend wünsche ich dir Karin,

heute war ein sch... tag aber auch ein schöner für mich in der Firma. Bin geschlaucht. erst jetzt komme ich zum lesen.
Zum eigentlichen Thema. Wir haben Stammkunden, diese kommen immer wieder und sind OnceOnly-Kunden, bei denen ich nur Barzahlungen gewähre. Aber auch ein neuer Kunde muß in den ersten zwei-drei Geschäften bar bezahlen. Nacher, wenn er wiederkommt, dann geht dieser in die Überweisungsmöglichkeit über. Aber der Kunde ist für mich zweitrangig. Wichtig ist, dass ich aus den täglich ausgestellten Rechnungen die zwei versch. Zahlungsarten unterscheide und diese pro Tabelle selektiere. Bei denen, die auf Überweisungen umgestellt sind, wird der Zahlungsfirst gesetzt. Ab dem Zahlunsfristdatum werden die Tage bis zur Bezahlung gezählt. Diese Zahl wird dann halbjährlich (erst mal manuell) für die Klassifizierung des Kunden verwendet (A, B, C, D-Kunde).
Der Geldfluss was ausgestellt ist, wann zu erwarten sei, dient dann für mich für die CashFlow-beaobachtung!
Sicherlich könnte man solch Program fertig kaufen. doch so etwas selber bzw. mit anderer Hilfe zu erstellen reizt mich um so mehr!
Was meinst du dazu;
Gruß
michael

Antwort 10 von Beverly

Hi Michael,

vom Prinzip her wäre das schon machbar. Das Wichtigste wäre erst einmal festzulegen, anhand welches Kriteriums du die Kunden unterscheiden willst, ich meine - woran erkennst du, ob sie in die eine oder die andere Tabelle übertragen werden sollen. Deine Kriterien A, B, C, D habe ich nirgendwo in deiner Arbeitsmappe gefunden. Du könntest nach diesen Kriterien filtern und in die entsprechende Tabelle übertragen.

Bis später,
Karin

Antwort 11 von debrö

Hallo Karin,
also die Unterscheidung bzgl. A, B u.ä. erfolgt nach etwa einem 1/2 Jahr durch eine allg. Sizzung in der Geschäftsführung. Bis jetzt kommt immer ein Inputbox auf, wenn die Dame in die Zelle einen Kundennameneinträgt. Hier wird sie befragt ob der Kunde Bargeldzahler sei oder per Überweisung die Zahlung die Ausgleichung getätig wird. Wählt sie Bargeldzahler, dann wird in einer enstpr. Zelle"G" das gleiche datum eingetragen wie die Rechnungsstellung. Ansonsten kann sie die Zahlungsfrist in Tagen (14, 30 o.ä) eingeben und wird zum heutigen Datum die Tage hinzugezählt. Dann wird dieses Datum in die Zahlungsfrist-Zelle "G" eingetragen. Durch diese Zelle "G" und Ausstellungsdatum in "A" kann ich bereits den Bargeldzahler unterscheiden.
Überwacht werden nun die Zellen in Spalte "G" gegenüber Spalte "A" beim Öffnen der Mappe. Ist der Zahlungsfrist abgelaufen, wird die jew. Zelle rot hinterlegt. Und da habe ich vor, dass bei rot aut. eine Mahnung erstellt wird.
Sicherlich ist es ein langer Atemweg bis dahin, aber... selbst ist der Mann/Frau. Oder?

Gruß
Michael

Antwort 12 von Beverly

Hi Michael,

dann kannst du ja nach "Nichtleere" in der betreffenden Spalte filtern. Das lässt sich mit dem Makrorecorder aufzeichnen.

Zum Kopieren benötigst du dann die erste freie Zeile in der betreffenden Tabelle. Diese kannst du mit folgendem Code ermitteln (ermittelt wird in Spalte A)

Dim loErste As Long
loErste = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) + 1


Bis später,
Karin

Antwort 13 von debrö

Servus Karin,

will dich nicht stören, jedoch möchte ich dir von meinem Fortschritt bzgl. TraffiLight berichten.
Hast auf gute Gedanken gebracht. Sicherlich habe ich noch lange nicht alles gelöst, aber bin gut vorangekommen.
Das Thema mit der Überwachung, Meldung, Sammelliste erzeugen habe ich bereits. Nächste Schritt wird dann die automatische Generierung von Mahnbriefe.
Zwischendurch habe ich die Kontrolle von Partnernamen bzw. Neuaufnahme in die Partnerliste gelöst.
Jetzt möchte ich dich fragen wie ich bewerkstelligen kann, das ein und dasselbe Programm und Modul in allen 3 Tabellen (Angebote, Bestellungen uns Rechnungen) zu verwenden?
Wenn du lust hast, würde ich dir gerne das neutrale Workbook mit VBA zusenden, womit du alles shen kannst.

Gruß
Michael

Antwort 14 von Beverly

Hi Michael,

auf jede Tabelle kann man den Code anwenden, wenn man vor jedem Bezug auf einen Bereich/Zelle die aktive Tabelle anspricht, z.B.

ActiveSheet.Range("A1")

Wenn es ein längerer Code ist, in dem die Tabelle mehrmals angesprochen wird, kann man das auch in eine With ... End With Anweisung packen

With ActiveSheet
.Range("A1")
End With

Wichtig ist dabei der "." vor dem Zellbezug. Der bedeutet, dass sich der Befehl auf das mit With angesprochene Objekt bezieht.

Bis später,
Karin

PS: Ich würde dein fertiges Produkt schon gerne mal sehen.

Antwort 15 von debrö

OK Karin,

ich sende dir zwei Dateien mit Makros dann auf deine zweite E-Mail Adresse zu.
Die zwei sind derweil unabhängig, da erst Testphase.
TrafficLight_2007_V2_Iroda
LrafficLight_Eingabe_Partner_vervollständigen.
Letztere ist in der Testphase und wird nach Fertgstellung in die ..._V2_Iroda eingeschleift.
Alles wird dann in CashFlow eingeleitet-dieses später.


Gruß
Michael

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: