Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Vergleichen und Kopieren von Zeilen (unsortiert)

Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 10:04:41
Zeilen
Hallo zusammen,
habe in 2 Tabellenblätter einer Mappe Daten stehen. Nun müssen die Spalten aus Blatt2 B-E in das Blatt1 unter Berücksichtigung jeweils des Wertes in der Spalte A zusammengefügt werden. (der Wert in Spalte A ist eine 6-stellige Zahl) Gedacht habe mir ich folgendes:
Wenn Inhalt von Spalte A(Blatt2) gleich Inhalt von SpalteA(Blatt1) dann kopiere(einfügen) Spalte B-E nach SpalteB(Blatt1).
Die ganze Sache hat aber einen Haken: die Reihenfolge von SpalteA(Blatt2) ist ungleich SpalteA(Blatt1). Es wäre auch möglich, das es keine übereinstimmenden Werte gibt. In diesem Fall sollte aber trotzdem kopiert werden.
Eine Lösung mit VBA ist erforderlich, da ich das ganze automatisieren möchte, leider habe ich keine umfangreichen Kenntnisse von VBA um das hinzukriegen.
Vielen Dank im voraus
ROlf
Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 10:33:21
Zeilen
Hallo Rolf,
machbar ist das schon, nur müsste ich wissen wohin das Ganze kopiert werden muss, in welche Spalte und wieviele Spalten und wohin müssen die Wert, die keinen übereinstimmenden Wert haben.
Gruss Beni
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 10:48:26
Zeilen
Hallo Beni,
die Spalten B-E(Blatt2) müssen, bei Übereinstimmung von Wert in Spalte A(Blatt1) = Wert in Spalte A(Blatt2) bei Blatt1 in Spalte B eingefügt werden.
Dabei dürfen natürlich nicht die vorhanden Spalten B-E überschrieben werden. ;-)
Die Zeilen die keine Überstimmung haben müssen in Blatt1 komplett eingefügt werden, also Spalten A-E, wo ist eigentlich egal. Perfekt wäre natürlich , innerhalb einer aufsteigenden Sortierung in Blatt1.
Grüße
ROlf
Anzeige
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 11:05:31
Zeilen
Hallo Rolf,
die nicht übereinstimmende Werte, werden am Ende der Tabelle angefügt, in aufsteigenden Sortierung ist nicht möglich, weil, wie Du schreibst, ist die Tabelle unsortiert ist.
Gruss Beni

Sub Vergleichen_und_Kopieren()
Sheets("Tabelle2").Select
With Worksheets("Tabelle1").Columns(1)
For i = 1 To Cells(65536, 1).End(xlUp).Row
Wert = Cells(i, 1)
Set C = .Find(Wert, LookIn:=xlValues, LookAt:=xlWhole)
If Not C Is Nothing Then
If C(1, 2) = "" Then Cells(i, 2).Copy Destination:=C(1, 2)
If C(1, 3) = "" Then Cells(i, 3).Copy Destination:=C(1, 3)
If C(1, 4) = "" Then Cells(i, 4).Copy Destination:=C(1, 4)
If C(1, 5) = "" Then Cells(i, 5).Copy Destination:=C(1, 5)
Else
r = .Cells(65536, 1).End(xlUp).Row + 1
Range(Cells(i, 1), Cells(i, 5)).Copy Destination:=.Cells(r, 1)
End If
Next i
End With
End Sub

Anzeige
Alternative
Erich
Hallo Rolf,
habe mit Hilfe des Forums mal folgende flexible UF entwickelt,
könntest du evtl. anpassen, falls Du das öfters benötigst:
https://www.herber.de/bbs/user/6159.xls
mfg
Erich
AW: Alternative
09.05.2004 11:46:48
ROlf
Hallo Erich,
auch ein schönes Teil. Glückwunsch. Ist für meinen Bedarf aber ein bisschen oversized.
Was mir aufgefallen ist, daß in der Ergebnisstabelle, alle Spalten gleich breit sind.
Hast Du das mit einer fixen Spaltenbreite oder mit festen Zeichenanzahl in einer Spalte gemacht ?
Habe nämlich noch so ein Problem auf einer anderen Baustelle, wo die Spalten eine feste Zeichengröße haben müssen, egal was drinsteht. Benötige dies für den Export in eine andere Anwendung.
Grüße
ROlf
Anzeige
Spaltenbreite
Erich
Hallo Rolf,
habe ebenfalls aus dem Forum sukzessive entwickelt:

Sub Spalte_opt()
Dim mySpalte As Integer
Dim iSpalte As Integer  ' Byte
Cells.Select
With Selection
.WrapText = False
End With
Range("A1").Select
' Hier die maximale Spaltenbreite einstellen
Const MaxBreite = 60
mySpalte = Cells.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(1, 1), Cells(1, mySpalte)).EntireColumn.AutoFit
For iSpalte = 1 To mySpalte
If Columns(iSpalte).ColumnWidth > MaxBreite Then _
Columns(iSpalte).ColumnWidth = MaxBreite
Next iSpalte
End Sub

Habe das in meiner PERSONL.XLS und damit immer "griffbereit"; dieses Problem
habe ich ebenfalls laufend auf den Baustellen.
mfg
Erich
Anzeige
AW: Spaltenbreite
09.05.2004 14:00:31
ROlf
Hallo Erich,
so stellts Du alle Spalten aud eine feste Breite ein. Ich suche nach einer Möglichkeit für alle Spalten unterschiedlich feste Breiten einzustellen.
Wenn du dann eine csv-Datei davon machst, wird die Spaltenbreite wieder entfernt. :-(
In meinem Fall soll diese aber bleiben. Vielleicht stimmt auch das csv-Format nicht und ich benötige ein anderes Format.
Grüße
ROlf
Anzeige
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
Zeilen
Hallo Beni,
das funzt super. Vielen Dank.
Leider hatte ich vergessen zu erwähnen, das die erste Zeile eine Überschrift ist. Die wird als nicht übereinstimmend jetzt mit gefunden. Habe folgende Änderung vorgenommen:
For i = 1 To Cells(65536, 2).End(xlUp).Row
Gilt das für beide Blätter? Habe es ausprobiert und es funktioniert so.
Grüße
ROlf
Anzeige
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
Zeilen
Hallo Rolf,
Du hast die Spalte geändert, bei Cells ist links die Zeile, 65536 ist die letzte Zeile, aufwärts bis zur letzten gefüllten Zelle.
Gruss Beni
For i = 2 To Cells(65536, 1).End(xlUp).Row
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 11:55:00
Zeilen
Hallo Beni,
autsch. ;-)
Danke dir.
Grüße
ROlf
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 13:37:58
Zeilen
Hallo Beni,
ähm ... also jetzt verstehe ich überhaupt nichts mehr.
Irgendie kopiert das kleine Makro nur Zeilen von Tabelle2 die NICHT in Tabelle1 enthalten sind.
Mein Ziel war es folgendes zu erreichen:
Beispiel:
Tabelle1
A|B|C
200530|4|ALCES
200565|2BEJUSE
200619|4|ALHERE
200624|2|BEJUSE
Tabelle2
A|B|C
200530|ARN|14
200565|CPH|14
200619|ARN|14
200620|ARN|14 :fehlt in Tabelle1
200624|GOT|7
Ergebnis:
Tabelle1
A|B|C|D|E|F
200530|200530|ARN|14|4|ALCES
200565|200565|CPH|14|2BEJUSE
200619|200619|ARN|14|4|ALHERE
200624|200624|GOT|7|2|BEJUSE
LEER|200620|ARN|14
Kannst Du hier vielleicht nochmal schauen ?
Danke
Grüße
ROlf
Anzeige
AW: Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 16:42:32
Zeilen
Hallo ROlf,
das sieht ein bisschen anders aus, dass die Werte zwischen die bestehende Werte eingefügt werden müssen, hast Du nicht geschrieben, aber macht nichts, ich hoffe jetzt funktioniert es.
Gruss Beni

Sub Vergleichen_und_Kopieren()
Sheets("Tabelle2").Select
With Worksheets("Tabelle1").Columns(1)
For i = 1 To Cells(65536, 1).End(xlUp).Row
Wert = Cells(i, 1)
Set C = .Find(Wert, LookIn:=xlValues, LookAt:=xlWhole)
If Not C Is Nothing Then
Range(.Cells(i, 2), .Cells(i, 4)).Cut Destination:=C(1, 5)
Range(Cells(i, 1), Cells(i, 3)).Copy Destination:=C(1, 2)
Else
r = .Cells(65536, 2).End(xlUp).Row + 1
Range(Cells(i, 1), Cells(i, 5)).Copy Destination:=.Cells(r, 2)
End If
Next i
End With
End Sub

Anzeige
Vergleichen und Kopieren von Zeilen (unsortiert)
09.05.2004 18:41:18
Zeilen
Hallo Beni,
da ist fast perfekt, aber:
die ursprünglichen 3 Spalten B|C|D aus Tabelle1 überschreiben nach dem Kopierenvorgang die Spalten E|F|G Tabelle1, sie müssen aber vor Spalte E wieder eingefügt werden, dodaß sich der Rest der Spalten nach recht verschiebt.
Sorry ;-)
Grüße
ROlf
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Vergleichen und Kopieren von Zeilen in Excel


Schritt-für-Schritt-Anleitung

Um die Daten zwischen zwei Tabellenblättern in Excel zu vergleichen und zu kopieren, kannst du das folgende VBA-Makro verwenden. Dieses Makro vergleicht die Werte in Spalte A und fügt die entsprechenden Werte aus Spalte B-E von Blatt2 in Blatt1 ein:

Sub Vergleichen_und_Kopieren()
    Sheets("Tabelle2").Select
    With Worksheets("Tabelle1").Columns(1)
        For i = 2 To Cells(65536, 1).End(xlUp).Row ' Ab Zeile 2 starten, um die Überschrift zu überspringen
            Wert = Cells(i, 1)
            Set C = .Find(Wert, LookIn:=xlValues, LookAt:=xlWhole)
            If Not C Is Nothing Then
                Range(.Cells(i, 2), .Cells(i, 4)).Cut Destination:=C(1, 5)
                Range(Cells(i, 1), Cells(i, 3)).Copy Destination:=C(1, 2)
            Else
                r = .Cells(65536, 2).End(xlUp).Row + 1
                Range(Cells(i, 1), Cells(i, 5)).Copy Destination:=.Cells(r, 2)
            End If
        Next i
    End With
End Sub

Führe die folgenden Schritte aus, um das Makro in Excel einzufügen:

  1. Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen und wähle Modul.
  3. Füge den obigen Code in das Modul ein.
  4. Schließe den VBA-Editor und gehe zurück zu Excel.
  5. Führe das Makro über Entwicklertools > Makros aus.

Häufige Fehler und Lösungen

  • Problem: Das Makro kopiert nicht die gewünschten Werte.

    • Lösung: Stelle sicher, dass die Spaltenüberschriften in beiden Blättern identisch sind. Überprüfe auch, dass die Daten in Spalte A die gleichen Formate haben.
  • Problem: Es werden zu viele oder zu wenige Zeilen kopiert.

    • Lösung: Überprüfe die Startzeile im Makro. Der Code sollte in der Regel bei Zeile 2 beginnen, um die Überschrift zu überspringen.
  • Problem: Die Spalten werden überschrieben.

    • Lösung: Stelle sicher, dass im Code die richtigen Zielzellen angegeben sind, um die bestehenden Daten nicht zu überschreiben.

Alternative Methoden

Eine alternative Methode zum Vergleichen und Kopieren von Zeilen ist die Verwendung von Excel-Formeln, wie z.B. SVERWEIS oder INDEX und VERGLEICH. Diese Methoden sind jedoch nicht so automatisiert wie VBA und erfordern manuelles Eingreifen.

Beispiel: Um einen Wert aus Blatt2 in Blatt1 zu finden, kannst du die folgende Formel verwenden:

=SVERWEIS(A2;Tabelle2!A:B;2;FALSCH)

Diese Formel sucht den Wert in A2 von Blatt1 in den Spalten A:B von Blatt2.


Praktische Beispiele

Beispiel: Angenommen, du hast folgende Daten:

Blatt1:

A       | B
200530  | 
200565  | 
200619  | 
200624  | 

Blatt2:

A       | B    | C
200530  | ARN  | 14
200565  | CPH  | 14
200620  | ARN  | 14

Nach Ausführung des Makros wird Blatt1 wie folgt aussehen:

A       | B      | C    | D    | E
200530  | 200530  | ARN  | 14   | 
200565  | 200565  | CPH  | 14   | 
200624  |         |      |      | 

Die Zeile mit 200620 aus Blatt2 wird am Ende von Blatt1 hinzugefügt.


Tipps für Profis

  • Verwende die Option Explicit-Anweisung am Anfang deines VBA-Moduls, um sicherzustellen, dass alle Variablen deklariert sind.
  • Speichere deine Excel-Datei als Makro-enabled Workbook (*.xlsm), um sicherzustellen, dass das Makro gespeichert wird.
  • Teste das Makro zunächst mit einer Kopie deiner Daten, um Datenverluste zu vermeiden.

FAQ: Häufige Fragen

1. Welche Excel-Version benötige ich für das VBA-Makro? Das VBA-Makro sollte in den meisten modernen Excel-Versionen ab Excel 2010 funktionieren.

2. Kann ich das Makro anpassen, um mehr Spalten zu kopieren? Ja, du kannst die Range-Objekte im Makro anpassen, um mehr oder weniger Spalten zu kopieren.

3. Was mache ich, wenn ich keine VBA-Kenntnisse habe? Du kannst die Schritte in der Schritt-für-Schritt-Anleitung befolgen, um das Makro zu verwenden, oder nach Hilfe in Excel-Foren suchen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige