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

Forumthread: Spalte A und B vergleichen und Zeilen kopieren

Spalte A und B vergleichen und Zeilen kopieren
09.08.2015 18:58:09
Anna
Hallo zusammen,
ich möchte gerne die Spalte A des Tabellenblattes "Kunden" mit der Spalte B des Tabellenblattes "Tabelle3" vergleichen.
Wenn es übereinstimmungen gibt soll die jeweilige Zeile(C:H) von Tabelle 3 in die Tabelle "Kunden" (G:H) kopiert werden.
Die Tabelle "Kunden" hat etwa 30000 Einträge, die Tabelle3 nur etwa 4000.
Beim Durchlaufen des Codes kommt der Fehler: "Anwendungs- oder objektdefinierter Fehler".
Public Function Zeilen_vergleichen()
Worksheets("Kunden").Activate
Range("A4").Select
Endi = Range("A65536").End(xlUp).Row
Worksheets("Tabelle3").Activate
Range("B2").Select
Endj = Range("A65536").End(xlUp).Row
For i = 1 To Endi
For j = 1 To Endj
If Worksheets("Kunden").Range("A" & i) = Worksheets("Tabelle3").Range("B" & j) Then
Worksheets("Tabelle3").Range(Cells(2 + j, 3), (Cells(2 + j, 8))).Copy _
Destination:=Worksheets("Kunden").Range(Cells(3 + i, 2), (Cells(2 + i, 6)))
End If
Next j
Next i
End Function
Wo ist der Fehler?
Liebe Grüße,
Anna

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spalte A und B vergleichen und Zeilen kopieren
09.08.2015 19:29:52
Michael
Hallo Anna,
es gibt leider mehrere Fehler:
a) Du möchtest einen waagerechten Bereich Range(Cells(2 + j, 3), (Cells(2 + j, 8)) auf einen mehrzeiligen kopieren: Range(Cells(3 + i, 2), (Cells(2 + i, 6)) (einmal ist es DREI+i, einmal ZWEI+i) - das kann nicht gehen. Abgesehen davon benötigt Excel beim Ziel nur die obere, linke Ecke.
b) die cells-Angaben beziehen sich auf das aktive Blatt (das ist IMMER "Kunden", da Du es eingangs aktiviert hast), beim Kopieren könntest Du also vor jedes cells ausführlich schreiben:
BLA.Range(Worksheets("Tabelle3").cells(bla,bla),usw.)
oder einfacher, da die Spalten immer gleich sind:
Worksheets("Tabelle3").Range("C" & j & ":H" & j).copy
Weil "Kunden" sowieso aktiv ist, kannst Du Dir hier die Angabe sparen, und die obere, linke Ecke genügt: Range("B" & i)
(Cells(3+i,2) ergibt nämlich Spalte "B" für 2.)
Das Ganze geht auch ohne das Destination, insgesamt also so:
Worksheets("Tabelle3").Range("C" & j & ":H" & j).copy Range("B" & i + 2)

(das "B" mußt Du halt ersetzen)
*Aber* die ganze Geschichte wird Ärger machen: wenn es nämlich funktioniert, machst Du 30000 mal 4000 Schleifendurchgänge "im Excelsheet", das sind 3x10hoch4 mal 4x10hoch3=12mal10hoch7, also 120 Mio. Schleifendurchläufe - das dauert.
Abhilfe: Spalte A aus Kunden und Spalte B aus Tabelle3 zuvor je in ein array laden; dann sind es immer noch 120 Mio. Durchläufe, die gehen aber schneller.
Abhlife2: Du durchläufst nur Spalte B aus Tabelle3 und suchst mit .Find in Kunden die passende Zeile, das benötigt nur 4000 .find-Aktionen, das geht relativ fix.
Weiteres nur mit Beispieldatei mit ein paar 100 Spieldaten.
Schöne Grüße,
Michael

Anzeige
kommt mir auch bekannt vor
09.08.2015 19:39:23
Michael
Hi Anna,
wenn Du die gleiche Anna bist wie hier:
https://www.herber.de/forum/archiv/1440to1444/t1440636.htm#1440636
dann versuch doch mal, Ransis Code anzupassen, das läuft für mich unter "Abhilfe3".
Schöne Grüße,
Michael
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

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