Access mehrere Datensätze kopieren

Hallo

würde gerne in einer Tabelle mehrere Datensätze kopieren und in eine andere Tabelle einfügen.

Also zB 2 Datensätze
100 bla bla bla
101 test test test

kopieren und in die andere Tabelle einfügen.

Dabei wird nach dem Inhalt der 1.Spalte gesucht,
wenn vorhanden, dann ersetzen, ansonsten neu einfügen.

zB
100 alt alt alt wird dann ersetzt durch 100 bla bla bla.

Wie kann man denn mehrere Datensätze gleichzeitig kopieren???
Man müsste doch auch eine ganze Tabelle kopieren können???
Geht das überhaupt, mit einem geht es ja über das Recordset.

Ansonsten müsste ich ja immer jede Tabelle öffnen und schließen um die Datensätze einzeln zu verschieben.

Mfg Werner

Hallo.

Wie kann man denn mehrere Datensätze gleichzeitig kopieren???
Man müsste doch auch eine ganze Tabelle kopieren können???
Geht das überhaupt, mit einem geht es ja über das Recordset.

Ansonsten müsste ich ja immer jede Tabelle öffnen und
schließen um die Datensätze einzeln zu verschieben.

Ähem … hast Du Dich schon mal mit Abfragen befasst? Du solltest es tun … Es gibt Auswahl-, Aktualisierungs-, Tabellenerstellungs-, Lösch-, Anfügeabfragen, Bla- und Blubb-Abfragen …

Und wenn Du SQL (Datenbank-Abfrage- und Beschreibungssprache) lernst, bist Du richtig gut im Lösen von Problemchens wie dem hier von Dir beschriebenen.

Im Überitzen gibt es auch ein Access-Brett sowie „Datenbanken allgemein“. Da sind auch Links drin, u.a. zum Lernen von SQL.

Gruß Eillicht zu Vensre

Hilfe statt Kritik
Hallo
nun ich bleibe mal sachlich und werde nicht wie du Statements abgeben,
nur weil hier jmd nachfrägt und Hilfe erwartet.

Du musst mir also nicht helfen, wenn du nicht möchtest.

Also zu deiner „Antwort“.
Bisher habe ich mich immer nur auf eine Tabelle bezogen, in der komme ich mit Recordset ganz gut zu recht, nun möchte ich aber Daten zwischen zweit Tabellen der gleichen Datei! verschieben. Wie ist erst mal zweitrangig, es fängt schon damit an, das ich diese Tabellen nicht parallel öffnen kann. Dann bekomme ich immer eine Fehlermeldung.

Da wäre also das erste Problem.

Da ich da nicht weiter komme, brauche ich erst gar nicht Abfragen zu gestalten. Dein Tip dich damit zu beschäftigen habe ich schon gemacht.
In dem Bucht steht aber auch, das es recht kompliziert sein kann und man sich am besten Beispiele sucht. Dazu habe ich aber bisher keine gefunden, also brauche ich jmd der sich da besser auskennt als ich.

Dazu nochmal das Beispiel.

  • Tabelle A und B öffnen
  • alle Daten von A markieren und nach B verschieben.

Kann mir das jmd sagen.

Mfg (wie immer freundlich) Werner

NEU: bestimmte Datensätze der Tabelle kopieren
Hallo
ok ich habs geschafft, beide Tabellen sind paraellel offen und ich kann die Daten verschieben.
Damit haben sich obige Fragen erledigt.

Ein Problem bleibt aber noch, wenn ich nur bestimmte Daten der Tabelle kopieren möchte, wie selektiere ich diese in ein(!) Recordset.

Also zB Datensatz 1, 3, 8, 15.

Vielleicht weiss das noch jmd.

Mfg Werner

Hallo Werner,

also in VBA kenne ich mich nicht aus. Aber Dein Problem kannst du wie bereits via SQL erledigen. Dabei sollte sich VB und VBA nicht unterscheiden.
Du sagtest bereits, das du es geschafft hast deine Tabellen zu öffnen und mit einem Recordset darauf zuzugreifen :smile:

Es kommt nun darauf an wie du auf deine DB zugreifst. Via DAO oder ADO?
Ich gehe mal von ADO aus.

Dann könnte dein öffnen deiner DB folgendermassen ausschauen

Public Function OpenDatabase(Filename As String) As Boolean 'Öffnet die DB
On Error GoTo ErrHandler
 Set Con = New ADODB.Connection
 With Con
 .Provider = "Microsoft.Jet.OLEDB.4.0"
 .CursorLocation = adUseClient
 .Properties("Data Source") = Filename
 .Mode = adModeReadWrite
 .Open
 RS.CursorType = adOpenKeyset 
 RS.LockType = adLockOptimistic
 RS.Open "SELECT \* FROM Adressen", Con, adOpenDynamic, adLockOptimistic
 End With
 OpenDatabase = True
 Exit Function
ErrHandler:
 OpenDatabase = False
 Exit Function
End Function


    
    
    Nun willst du Datensätze selektieren die einen bestimmten Kriterium entsprechen. Greifen wir mal auf mein gepostetes Bsp bezug.
    Du hast die Tabelle Adressen. Dort möchtest du nun alle Datensätze Selektieren in deren Feld Ort Leipzig steht.
    Das machst du dann wiefolgt :smile:
    
    
    
        
         rs.close 'DB schliessen
         rs.Open "Select \*From Adressen WHERE Ort Like 'Leipzig'",Con
    
    
    
    
    In diesem Bsp. Haettest du nun in deinem REcordset RS alle Datensätze vorhanden wo das Feld Ort in der Tabelle Adressen Leipzig ist.
    
    Sicher ist dies nicht deine Lösung. Dazu weiss man ja zu wenige Fakten. Aber das ist mit leichtigkeit umzubauen :smile:
    
    MfG Alex
    
    
    > <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hallo
ok ich habs geschafft, beide Tabellen sind paraellel offen und
ich kann die Daten verschieben.
Damit haben sich obige Fragen erledigt.H

Hallo Werner,
wie du es geschaftt hast interessiert mich überhaupt nicht. Jetzt. Aber vielleicht interessiert es Andere oder/und mich später irgendwann, wär schön wenns dann im Archiv zu finden wäre.
Nach langer Zeit mit VBA von Excel setze ich jetzt kleine Schrittchen in Richtung VBA von Word. Irgendwann kommt VBA von CorelDraw, Outlook Access usw.
Und wenn Access drankommt würde mich schon interessieren warum es erst nicht ging, dann ging, 2 Dateien parallel anzuschauen.

Jetzt also die zu erwartende Frage: Wie hast du es geschafft?

Gruß
Reinhard

Code
Hi Reinhard,
daran solls nicht scheitern.
Zunächst die Variablen in einen Modul global definieren:

Public Cn As New ADODB.Connection 'Verbindung zur Datenbank
Public RsT As New ADODB.Recordset 'Verbindung zur Datenbank
Public RsT2 As New ADODB.Recordset 'Verbindung zur Datenbank
Dim Feld As Variant

dann der Code zum öffnen beider Tabellen und dem verschieben der Daten:

Meldung = „SELECT * FROM Lokalsystem“
If LSZähler = 0 Then GoTo TRA 'beendet Routine, falls die Datenbank schon leer ist
LSZähler = 0
With RsT2
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = Meldung & " ORDER BY Datensatz"
.Open
.MoveFirst
End With

Meldung = „SELECT * FROM Datenbank“
SL = 0
With RsT
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = Meldung & " ORDER BY Datensatz"
.Open
.MoveFirst
End With

'--------------------------
With RsT2
Do While Not .EOF
ErrNr = 0
RsT.AddNew

For Each Feld In .Fields
RsT.Fields(Feld.Name).Value = .Fields(Feld.Name).Value
Next Feld

RsT.Update
'Fehlerroutine bei doppelter Punktnummer
ErrNr = Err.Number
If ErrNr = -2147467259 Then X = 0

.MoveNext
Loop
End With
'--------------------------

RsT.Close
RsT2.Close

SL = 0

Die Stelle mit dem Fehler und X=0 muß ich noch behandeln.
Hier erfolgt ein Fehler, falls in Spalte 1 schon der Eintrag einmal vorhanden ist. In diesem Fall wird ein Fehler erzeugt, den man dann abfangen muß. Dies macht man dann indem man .CancelUpdate macht, den Datensatz mit der Eintrag sucht, und diesen dann ersetzt und nicht neu anlegt.

Ich hoffe es hilft!
Ach ja, grundsätzlich muß man natürlich vorher in Access seine Datenbank aufbauen, indem man die Anzahl und Namen der Spalten anlegt, sowie Beziehungen aufbaut. Ich habe nur die Definition festgelegt, das in der 1.Spalte keine doppelten Werte auftreten dürfen. Bei mir sind das Punktnummern, welche eindeutig sein müssen.
Solche Definitionen müssen dann natürlich im Code in VB abgefangen werden (s.o.).

Mfg Werner

Hallo Werner und Reinhard,

Public Cn As New ADODB.Connection 'Verbindung zur
Datenbank
Public RsT As New ADODB.Recordset 'Verbindung zur
Datenbank
Public RsT2 As New ADODB.Recordset 'Verbindung zur
Datenbank
Dim Feld As Variant

Soweit korrekt!

Meldung = „SELECT * FROM Lokalsystem“

Warum ?

If LSZähler = 0 Then GoTo TRA 'beendet Routine, falls die
Datenbank schon leer ist

Goto Befehle sollte man tühnlichst unterlassen, da sie nur Probleme mit sich bringen! Und warum fragst du Nicht mit if not(LSZähler) ab? Ist schneller :wink:

LSZähler = 0

Wieso den LSZähler auf 0 setzen ?

With RsT2
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = Meldung & " ORDER BY Datensatz"
.Open
.MoveFirst
End With

Warum bei Source =Meldung & " ORDER BY DATENSATZ" ?
Warum machst du es nicht wiefolgt ?
–> .Source = „SELECT * FROM Lokalsystem ORDER BY Datensatz;“
Du hast geschrieben das du nur spezielle Datensätze brauchst. Warum selektierst du hier sie nicht gleich ? Das kannst du via SQL mit der WHERE Klausel machen :wink:

Meldung = „SELECT * FROM Datenbank“

Siehe oben :wink:

SL = 0

'Siehe auch oben :wink:

With RsT
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = Meldung & " ORDER BY Datensatz"
.Open
.MoveFirst
End With

Auch hier wieder bei Source, Warum? Sind nur unnötige Zeilen. Den SQL Syntax sollte man sich schon in einer Variablen zusammenbasteln und dann nur die Variable zuweisen. Aber das macht man nur, wenn die SQL Statements sehr lang sind und nicht bei solchen kurzen :wink:
Desweiteren werden SQL Statements immer mit einem ; abgeschlossen :smile:

'--------------------------
With RsT2
Do While Not .EOF
ErrNr = 0
RsT.AddNew

For Each Feld In .Fields
RsT.Fields(Feld.Name).Value = .Fields(Feld.Name).Value
Next Feld

Was ist wenn ein Wert von einem Feld den Wert ‚Null‘ hat?
Auch dann wird dir hier das programm abschmieren :frowning:
An dieser Stelle würde ich das noch überprüfen!

RsT.Update
'Fehlerroutine bei doppelter Punktnummer
ErrNr = Err.Number

Wieso Err.Number=0 wenn keine Fehlerbehandlung mit On Error… eingeschalten ist? Tritt ein Fehler auf, so steigt dein program eh aus

-(.

Ein kleiner Tipp bei der Erstellung voin Datenbanken. Man macht immer ein Feld mit dem Typ AUTO_INCREMENT rein. Nenne das Feld einfach IDx. Bei jeden Datensatz den du nun anlegst, wird ein Der Wert in dem Feld IDx um 1 erhöht(Einfügen der Datensätze via SQL!). Dies bedeutet wiederrum das du jeder Datensatz definitiv nur einmal vorhanden ist!
Bsp.
Du hast eine Tabelle mit 2 Feldern. Sagen wir mal Nachname und Vorname.
Es stehen dort 3 Datensätze drinnen. Sagen wir mal
DS1 : Max Muster
DS2: Hans Müller
DS3: Max Muster
Nun versuche mal den 1 DS ( Max Muster ) zu löschen! Dann siehst du das es nicht gehen wird!

If ErrNr = -2147467259 Then X = 0

Warum fragst du nicht gleich Err.Number ab? Hier verschwendest du wieder sinnlos eine Variable!

.MoveNext
Loop
End With

Warum kein Doevents ? Bei einer DB die etliche Millionen Datensätze hat, koennte es passieren das Dein rechner abschmiert oder für Minuten lahm gelegt ist! Erstelle dazu eine Variable und lasse sie hochzaehlen. Ein Doevents bei jeden Durchlauf waere übertrieben!
Aber da kannst du dann zum bsp. ganz einfach mit Variable Mod 100 abfragen :wink:

'--------------------------

RsT.Close
RsT2.Close

SL = 0

Was hat das SL zu bedeuten? Du hast sie noch nicht verwendet!

Wie du siehst Werner, ist der Code sehr Störanfaellig!
Ich kann mich noch erinnern, das du mir mal geschrieben hast, das dir 3 zeilen Code zuviel sind. Warum machst du es dir dann so schwer und nimmst nicht den Rat anderer an?
Dein Vorhaben , kann man mit etlichen Zeilen weniger realisieren und ist auch 3mal sicherer :wink: Das Stichwort hier heisst SQL!

Ist nicht böse gemeint, mein Statement :wink:

MfG Alex

Hi
Hallo
ne das ist schon so OK deine Kritik.
Man merkt am Text, das du das nicht böse meinst, aber der andere da,
das fand ich unpassend (s.o.).

Nun zu deiner Antwort, du hast dir ja mächtig Mühe gegeben mit dem Zerpflügen meines Codes.

Zuerst ist der Code nur ein Auszug, daher sind SL usw. natürlich für dich überflüssig, sie greifen aber an anderer Stelle des Programms.

Leider programmiert man natürlich immer, wie man es gelernt hat bzw. in diesem Falle wie man es sich selbst angeeignet hat.

Daher ist natürlich nicht immer alles 100%ig codemäßig minimiert, aber es funktioniert, darüber bin ich schon froh.

Mir fällt momentan nur das mit den 0er Feldern auf, was ich wirklich prüfen muß, ob da was abschmiert, ansonsten behandel ich in meiner Access-Tabelle nur Textfelder, es sollte daher nichts passieren.

Wie gesagt deinen Code kann ich manchmal deswegen nicht nachvollziehen, weil ich Ihn nicht so kenne oder verwenden könnte.
Ich versuche natürlich schon immer irgendwas zu optimieren, aber vieles ist auch einfach von anderer Stelle kopiert.

So zB verwende ich die Variable Meldung auch an anderer Stelle, sie ist hier natürlich überflüssig, du hast Recht.

Abschnließend aber die Frage, was passiert denn irgendwann,
wenn man zu vieler solcher überflüssiger Statements verwendet???
Ich hatte das schon mal, das meine Prozedur voll war, auch hier sicherlich vieles überflüssig.

Problem ist auch, das mein Programm wächst, da muß ich manches in etwas abgeänderter Form an anderer Stelle wiederverwenden.
Um mir Arbeit zu sparen, kopiere ich lieber füge es nochmal ein und passe es an. So spare ich mir die Arbeit, die andere Funktion nochmals püberprüfen zu müssen, damit beides funktioniert.

Soweit der Umstandskrämer Werner

PS: aber ich schau mir deine Sachen schon an, evtl. verwende ich einiges für die Zukunft, also dankeschön dennoch

nochmal SQL
Hi nochmal,
also habs mir jetzt mal angeschaut.

Ich hatte grad vergessen zu bemerken, das ich kein SQL kenne, daher vermeide ich es auch (tunlichst).
Es hat ja niemand auf meine Frage geantwortet, welche lautete:

Dazu nochmal das Beispiel.

  • Tabelle A und B öffnen
  • alle Daten von A markieren und nach B verschieben

Das ist ganz einfach, wenn man weiss wies geht, ich weiss es leider nicht, wäre aber sicher umsetzbar für mich Es ist dies aber nur die Grundidee.

Ich müsste dann noch abfangen, wenn Inhalt der Spalte 1 meines Datensatzes, welchen ich einbinden möchte schon vorhanden ist, weil so meine Access-Datenbank reagiert (Das ist die Fehlermeldung)
Wenn der Fehler erzeugt wird, weis ich aha Punktnummer schon vorhanden.
Dann gehts weiter, endweder ich gebe eine andere Punktnummer ein, ersetze den Datensatz, oder übergehe den Punkt und lasse den alten drin oder breche ganz ab. Das sind weitere 4 Abfragen.

Das in SQL umzusetzen ist für mich unmöglich!!! und kann ich mir auch nicht selbst beibringen.

Daher lasse ich natürlich auch die erste umsetzung mit SQL.
Ich verwende brav meine Instr, .Find und Recordsets und komme damit bis jetzt gut klar.

nochmal ifnot
Hallo,
den Befehl kenne ich nicht, wie funktioniert dieser.
Warum soll man kein Goto verwenden, ich habe die Fehlersuche aktiviert, daher gibt es jedes Goto nur 1x.

Was passiert denn mit dem Code nach dem Goto wenn ich if not(LSZähler) verwende, zB

If blabla Goto X
'wichtiger Code wenn nicht blabla
X:
'weiter

Wie setze ich das mit IfNot um???

nochmal Doevents
Hallo
DSovents habe ich bemerkt hat manchmal auch so seine Tücken, wenn man Formen öffnet oder danach schliesst. Ich hatte da schon hänger mit Statusbar usw. das kann recht nervig sein.

Manchmal habe ich es verwendet, manchmal nicht, genau weiss ich auch jetzt noch nicht, warum man es manchmal braucht, damit der Code sauber durchläuft und die Satusbar richtig ist, und der Ablauf usw.

Das Problem mit vielen Datensätzen habe ich momentan schon, leider.

Leider konnte mir da auch noch niemand weiterhelfen, ich wäre froh, wenns mir jmd hlefen könnte. Das Problem taucht aber nur beim Einlesen der Punkte auf, wo es bei 10000en Datensätzen etwas länger dauern kann.
1Mio Datensätze wird es nicht geben, es handelt sich um ein Vermessungsprogramm, da wird keiner 1Mio Punkte aufnehmen, 50000 wird schon sehr viel sein.

Wenn du dazu noch Helfen könntest, das Einlesen zu beschleunigen, sende ich dir gerne mal ein Testbeispiel mit der Datenbank zu.
Dann kannst dus optimieren.

So das war mein ausführlicher Teil dazu.
Mfg Werner

Ich hatte grad vergessen zu bemerken, das ich kein SQL kenne,
daher vermeide ich es auch (tunlichst).

Es hat zwar hier nichts verloren, aber nun folgt eine kleine SQL-Einführung:

CREATE TABLE tbellenname (definition);
z.B.: CREATE TABLE kunde (
kundenNR INTEGER NOT NULL PRIMARY KEY,
name CHAR(30),

);

Das wichtigste für dich Dateneingabe:
INSERT INTO Tabellenname VALUES (werte);
z.B.: INSERT INTO kunde (1, ‚Nirwarna‘, …);

Mit DELETE kann man noch Datansätze löschen.

Auf was will ich hinaus:
Wenn du den INSERT INTO in einem RecSet anwendest, wo du bis jetzt immer den SELECT-Befehl verwendet hast, kannst du Datensätze „kopieren“. Einfach den ursprünglichen RecSet von BOF bis EOF durchgehen und die Datensätze einfügen.

Hoffe ich konnte helfen
mfg Andreas

SQL
Hallo
du kannst mir schon helfen, allerdings bezogen auf mein Bsp weiter oben! sonst hilft mir das doch nichts.

Demnach bräuchte ich wohl SELECT * A,B (die Tabellen)
und dann weiter bei dem Bsp. oben alle Datensätze von Tabelle B wählen und nach A kopieren. Das ist der erste Schritt.

Dann gings weiter, wenn der Wert von Spalte 0 Tabelle B schon irgendwo in Spalte 0 Tabelle A vorhanden wäre.
Weiss nicht, ob du das auch hinbekommst, ist aber sicher nicht einfach.

Fangen wir erst mal bei den Grundlagen (1.) an.

Die Tabellen gibts schon, Sie müssen nicht erzeugt werden, Datenanbindung gibts auch schon. Ich brauche nur den richtigen SELECT-Befehl.

Mfg Werner

Zu 1.

 Set RecSet = New ADODB.Recordset
 With RecSet
 .ActiveConnection = DBCon
 .CursorLocation = adUseClient
 .CursorType = adOpenKeyset
 .LockType = adLockOptimistic
 .Source = "SELECT \* FROM " & TableName
 .Open
 End With

Danach stehen alle Daten der Tabelle mit dem Namen, der im String TableName steht in RecSet.

Dann kann man den RecSet durchlaufen mit RecSet.MoveNext usw.
Zum kopieren in die andere Tabelle schreibst du einfach:

 Set RecSet2 = New ADODB.Recordset
 With RecSet2
 .ActiveConnection = DBCon
 .CursorLocation = adUseClient
 .CursorType = adOpenKeyset
 .LockType = adLockOptimistic
 .Source = "INSERT INTO " & TableName2 & " VALUES " & \_
 RecSet(0) & ", " RecSet(1) & ");"
 .Open
 End With

Dann hast du alle Datensätze in die andere Tabelle kopiert.

Wenn du kontrollieren willst, ob es den Datensatz in der anderen Tabelle schon gibt musst du wohl die 2. Tabelle auch mit einem SELECT-Befehl auslesen und dann die Datensätze Schritt für Schritt durchgehen.

RecSet.MoveNext, RecSet.MoveFirst, RecSet.MoveLast

Hoffe ich konnte helfen
Mfg Andreas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

DBCon
Hatte ich fast vergessen. Im obigen Code ist das DBCon eine aktive Verbindung zu deiner Datenbank.

Antwort auf dein Re.: Hi vom Laufzeitfehler 7

Zu 1.

Set RecSet = New ADODB.Recordset
With RecSet
.ActiveConnection = DBCon
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = "SELECT * FROM " & TableName
.Open
End With

Danach stehen alle Daten der Tabelle mit dem Namen, der im
String TableName steht in RecSet.

Dann kann man den RecSet durchlaufen mit RecSet.MoveNext usw.
Zum kopieren in die andere Tabelle schreibst du einfach:

Set RecSet2 = New ADODB.Recordset
With RecSet2
.ActiveConnection = DBCon
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = "INSERT INTO " & TableName2 & " VALUES " & _
RecSet(0) & ", " RecSet(1) & „);“
.Open
End With

Dann hast du alle Datensätze in die andere Tabelle kopiert.

Wenn du kontrollieren willst, ob es den Datensatz in der
anderen Tabelle schon gibt musst du wohl die 2. Tabelle auch
mit einem SELECT-Befehl auslesen und dann die Datensätze
Schritt für Schritt durchgehen.

RecSet.MoveNext, RecSet.MoveFirst, RecSet.MoveLast

Hoffe ich konnte helfen
Mfg Andreas

Mit der Kontrolle habe ich gemeint, dass du vor dem einfügen kontrolierst, ob es den Datensatz schon gibt.
Dazu brauchst du beide Tabellen in einem RecordSet.
Ich nenne die jetzt einfach mal RecSetA und RecSetB

Dann musst du jeden Datensatz von A überprüfen, ob es den schon in B gibt.

Dim BExist As Boolean
BExist = False

Do While Not RecSetB.EOF
 If RecSetA(0) = RecSetB(0) Then
 BExist = True
 End If
 RecSetB.MoveNext
Loop

Jetzt hast du kontrolliert, ob der ERSTE Datensatz von A in B vorhanden ist. Wenn BExist False ist, dann kannst du diesen RecSet nach B kopieren, ohne dass ein Fehlermeldung auftritt. (ich gehe davon aus, das RecSetB(0) ein Index oder ähnliches ist. Zumindest der Primary Key)

Um jetzt jeden Datensatz zu kontrollieren musst du danach RecSetB mit dem MoveFirst-Befehl wieder an den Anfang setzen. Mit einer weiteren Schleife gehst du die Datensätze von RecSetA nach der Reiche durch.

Der fertige Code sollte dann som aussehen:

Dim BExist As Boolean
BExist = False

Do While Not RecSetA.EOF
 Do While Not RecSetB.EOF
 If RecSetA(0) = RecSetB(0) Then
 BExist = True
 End If
 RecSetB.MoveNext
 Loop

 If BExist Then
 'Datensatz kopieren
 End If
 RecSetB.MoveFirst
 RecSetA.MoveNext
Loop

ACHTUNG! Habe den Code nicht kontrolliert, müsste aber gehen.
mfg Andreas

kleiner Fehler
Das BExist, muss natürlich jedes mal wieder auf False gesetzt werden, sonst hat das ganze keinen Sinn

Dim BExist As Boolean

Do While Not RecSetA.EOF
 BExist = False
 Do While Not RecSetB.EOF
 If RecSetA(0) = RecSetB(0) Then
 BExist = True
 End If
 RecSetB.MoveNext
 Loop

 If BExist Then
 'Datensatz kopieren
 End If
 RecSetB.MoveFirst
 RecSetA.MoveNext
Loop

anderes Problem
Ja Code ist so OK, was anderes mache ich ja auch nicht, der Code von mir ist schon so in Ordnung. Es funktioniert ja auch alles.
Ob das ein paar mehr Zeilen an Code sind ist mir eigentlich egal.

Ich schick dir (und Anno) mal ein anderes Problem, was mir eher am Herzen läge. Zeitprobleme habe ich eigentlich eher beim Einlesen von großen Datenmengen. Hier würde ich gerne nochwas optimieren, wenns geht. Das Projekt ist so weit schon vorbereitet mit Timer um die Dauer zu testen.

Gibts dann morgen, weil ichs zuhause hab.

Mfg Werner