Excel - Makro um Tabelle abzugleichen

Obihörnchen

Semiprofi
Thread Starter
Mitglied seit
13.07.2005
Beiträge
2.040
Hi luxxer,
ich als Makronoob habe eine Frage. Wie schaffe ich es, ein Makro zu erstellen das folgende Aufgabe erfüllt:

Ich habe in Sheet1 einer Excelfile eine große Anzahl von Kontakten, welche ich anhand der zweiten Spalte (Kontakt-ID) zuordnen kann. Im Sheet2 liegt eine weitere Tabelle mit Kontakte, ebenfalls mit der Kontakt-ID in der zweiten Spalte.
Ziel ist es aus dem ersten Blatt (Sheet1) die Kontakte zu löschen, welche in Sheet2 bereits vorhanden sind.

Am Ende soll also eine Liste stehen, die die Kontakte enthält:
Kontakte aus Sheet1 MINUS Kontakte aus Sheet2 (sofern Überschneidungen vorhanden sind).

Wie kann ich das am besten lösen ohne dafür Stunden Handarbeit zu verwenden? Eine kleinschrittige Erklärung wäre am allerbesten.

Danke vorab für Eure Hilfe.
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Bin auch dankbar für Tipps, wo ich entsprechende Anleitungen finde...
 
musst du bei excel bleiben? ich hab von macros net soviel ahnung, aber wenn du die daten in access importierst, ist das ne sehr einfache angelegenheit...
 
Bei Access würde ich das sogar eventuell hinkriegen... ;) Nunja, es soll halt am Ende auch wieder ne Excel dabei rausspringen. Ein Kumpel programmiert gerade ein Makro und VIELLEICHT klappt das ja damit.
 
naja, die bereinigten daten aus access dann wieder exportieren und in excel importieren wäre eine möglichkeit, die andere wäre mit verknüpften datenquellen zu arbeiten, dann würden sie gleich in excel bleiben...
 
Da ich im Rahmen meiner Diplomarbeit ein 4500 Zeilenprogramm mit Excel/VBA geschrieben habe, kann ich dir wohl weiterhelfen :)

Ich gehe von folgenden Vorgaben aus, du musst den Code oder deine Tabellen dann anpassen, ist aber an sich selbsterklärend, wenn man ihn vor sich hat:

Auf Tabellenblatt1 hast du in Spalte 1 eine Liste mit den Namen, in Spalte 2 steht jeweils neben dem Namen die entsprechende ID.
Analoges auf Tabellenblatt 2.
Die Namen müssen hierbei nicht identisch sein, die IDs schon, die Reihenfolge ist egal, Leerzeilen auch.

Also hier die Schritt für Schritt Anleitung:

ALT-F8 drücken
Bei Makroname Doppelte_loeschen eingeben, sonst musst du den Code anpassen.
Dann auf Erstellen klicken
So, jetzt bist du im VBA Editor.
Es wurde automatisch das Modul1 angelegt.
Dessen Inhalt ersetzt du mit folgendem Code:
Option Explicit
Sub Doppelte_loeschen()
Dim i, j, lastRow1, lastRow2 As Integer
Dim doubleFound As Boolean

doubleFound = False
lastRow1 = Sheets("Tabelle1").Cells.SpecialCells(xlCellTypeLastCell).Row
lastRow2 = Sheets("Tabelle2").Cells.SpecialCells(xlCellTypeLastCell).Row

For i = 1 To lastRow1
For j = 1 To lastRow2
If Sheets("Tabelle1").Cells(i, 2).Value = Sheets("Tabelle2").Cells(j, 2).Value And Sheets("Tabelle1").Cells(i, 2).Value <> "" Then
doubleFound = True
End If
Next
If doubleFound = True Then
Sheets("Tabelle1").Rows(i).Delete
i = i - 1
doubleFound = False
End If
Next
End Sub
Jetzt schließt du den Editor und speicherst vorsichtshalber.
Dann wieder ALT-F8 oder Extras-->Makro-->Makros in der Symbolleiste, ist dasselbe.
Da das entsprechende Makro wählen und auf ausführen klicken --> fertig.

So, jetzt sehe ich in der Vorschau, dass das doofe Forum meine Einrückungen am Beginn der Zeilen wegmacht, das ist natürlich shice, so ist das etwas unübersichtlich, ändert jedoch nichts an der Funktionalität.
Ich habe den Code hier eben mal bei mir getestet und es funktioniert.

Zu beachten ist, dass bei doppelten immer die komplette Zeile gelöscht wird. Ist das nicht gewünscht, sondern du willst nur die betroffenen Zellen löschen, dann ersetzt du die Zeile
Sheets("Tabelle1").Rows(i).Delete
durch die beiden Zeilen
Sheets("Tabelle1").Cells(i, 1).Delete Shift:=xlShiftUp
Sheets("Tabelle1").Cells(i, 2).Delete Shift:=xlShiftUp

Viel Glück :)
 
Zuletzt bearbeitet:
oder du machst neben die ID spalte eine neue spalte und machst eine Formel mit nem s-verweis mit dem du ID der ersten tabelle in der 2. tabelle suchst und dann sagst wenn ja, dann "WAHR" sonst "FALSCH"...
Dann hast Du also zig Felder mit WAHR und FALSCH und sortierst dann die gesamte Liste nach FALSCH, also der neuen Spalte....
Die Werte, die FALSCH sind sind also nicht in der andern Tabelle vorhanden, also markierst du alle und kopierst die unter die andere...
hoffe das war verständlich....
 
Zuletzt bearbeitet:
Ich sehe gerade, man kann es noch optimieren, ist schon wieder zu lange her :)
Nimm den Code, der macht exakt dasselbe, ist aber effizienter:

Code:
Option Explicit
Sub Doppelte_loeschen()
    Dim i, j, lastRow1, lastRow2 As Integer

    lastRow1 = Sheets("Tabelle1").Cells.SpecialCells(xlCellTypeLastCell).Row
    lastRow2 = Sheets("Tabelle2").Cells.SpecialCells(xlCellTypeLastCell).Row
    
    For i = 1 To lastRow1
        For j = 1 To lastRow2
            If Sheets("Tabelle1").Cells(i, 2).Value = Sheets("Tabelle2").Cells(j, 2).Value And Sheets("Tabelle1").Cells(i, 2).Value <> "" Then
                Sheets("Tabelle1").Cells(i, 1).Delete Shift:=xlShiftUp
                Sheets("Tabelle1").Cells(i, 2).Delete Shift:=xlShiftUp
                i = i - 1
                Exit For
            End If
        Next
    Next
End Sub

EDIT: Oh, jetzt geht es mit dem Einrücken *AkteX Melodie pfeif*
EDIT2: OK, ich habe oben Zitat anstatt Code angeklickt ich Trottel, kaum macht man es richtig geht's :)
 
Zuletzt bearbeitet:
Shihatsu schrieb:
gott, 4500 zeilen mit sowas? du hast mein mitleid
Naja, zeig mir mal, wie du mit beispielsweise Java mein kleines Codebeispiel schneller hinbekommst...
Zugegebenermaßen gibt es viele Sachen, die mich gestört haben, aber das Konzept mit den Formularen und dem dahinter liegenden Code hat auch ganz klar was für sich. Wenn man da erstmal voll drinsteckt kann man da wohl gut mit um.
 
VBA kann ich nich so, hab mich eher auf die formeln festgelegt!
4500????HAHAHAHA!!!!
Ich hab letzten Monat eine gemacht, die hatte weit über 17.000, DAS war ne Arbeit!!!ABer mit der gleichen Methode hab ichs gemacht wie oben beschrieben, klappt auch, nur mit Makros isses natürlich eleganter!!
 
Du hast in einem Monat ein Programm mit 17.000 Zeilen Quellcode geschrieben? Das sind über 500 Zeilen pro Tag. Das sieht mir eher nach viel Cut and Paste aus als nach Programmieren. Sollte ich falsch liegen - sorry und fetter Respekt.
 
C+P war auch viel dabei, also deine 4500 Zeilen waren da hundert Pro mehr Arbeit, das wird auf Dauer nervig immer über ersetzen:Suche X ersetze durch Y....Deswegen bin ich immer begeistert, wenn Leute wie Du mal eben so ausm Kopf die Lösung hier rein posten, bei mir dauert das immer Stunden!!!!
Deswegen hab ich da so nen Hass drauf und machs lieber per Formeln, das checken hier in der Firma eh sonst nur sehr wenig Leute!!;)
 
Schlumpfbert schrieb:
Naja, zeig mir mal, wie du mit beispielsweise Java mein kleines Codebeispiel schneller hinbekommst...
Zugegebenermaßen gibt es viele Sachen, die mich gestört haben, aber das Konzept mit den Formularen und dem dahinter liegenden Code hat auch ganz klar was für sich. Wenn man da erstmal voll drinsteckt kann man da wohl gut mit um.
ich häts mit ner db als backend gemacht, und der code der die db abfragt wäre deutlich schlanker gewesen, aber ich wollte mit meiner aussage deine leistung nicht schmälern, ganz im gegenteil. ich hasse vba syntax und hab respekt vor jedem der sich da durchkämpft. erst recht bei grösseren sachen.
 
Ich habe jetzt ein Lösung mit nem Makro gefunden. Danke euch.

Gibt es eigentlich eine gute selbsterklärende Möglichkeit, sich mit Makros vertraut zu machen? Also im Sinne von lernen?
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh