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

Forumthread: Datensatz aus Access Tabelle1 in Tabelle 2 kopiere

Datensatz aus Access Tabelle1 in Tabelle 2 kopiere
02.12.2012 10:48:14
Marco
Guten Tag Forum
Danke diesem Forum habe ich schon einige Ideen umsetzen können.
Nun habe ich ein Frage:
Ich versuche mittels VBA aus Excel von der Access Tabelle"DatenTransver" einen ausgewählten Datensatz in die Tabelle"DatenTransverAktiv" zu kopieren. Die Tabellen befinden sich in der selben .mdb
Bei der Prozedur wir ein Fehler bei
rs_daten2.Fields(i) = rs_daten.Fields(i).Value
ausgeben "ein Objekt, das dem angeforderten Namen oder Ordnerveweis entspricht, kann nicht gefunden werden. LZF-NR 3265
was mache ich da falsch,
Besten Dank
Marco
Hier mein Code
in Modul
Public AcsDbName As String
Public AcsDbSource As String
Public AcsDbSource2 As String
Public pfad As String
Public conn As New ADODB.Connection
Public rs_daten As New ADODB.Recordset
Public rs_daten2 As New ADODB.Recordset
Public ID As String
'****************************************
Sub Archiv_AuftraglisteKunden_Lesen()
Dim i As Byte
Rem  Access
With Uf_Exe.Controls(Uf_Exe.ComboVar)
VarOBez = .List(.ListIndex, 1)
VarANr = .List(.ListIndex, 2)
VarAStatus = .List(.ListIndex, 4)
End With
Rem: öffne Access DB
StartStammdatei
rs_daten.Index = "ID"        'Archiv auslesen
rs_daten.Seek (VarANr)
rs_daten2.Index = "ID"  'Aktiver Auftrag
Do Until rs_daten.EOF
If rs_daten.Fields("AuftagNr") = VarANr Then
Dim trans
For i = 1 To 21
rs_daten2.Fields(i) = rs_daten.Fields(i).Value
Next i
End If
Loop
Rem: Schliesse Access DB
DB_Close
End Sub

Sub StartStammdatei()
nochmals:
AcsDbName = "D:\Projekt\AuftraglisteKunden.mdb"
AcsDbSource = "DatenTransfer"
AcsDbSource2 = "DatenTransferAktiv"
On Error GoTo schliessen
pfad = ActiveWorkbook.Path & AcsDbName
Rem: öffnet Access DB
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & pfad
Set rs_daten = New ADODB.Recordset  'Datenblatt 1
With rs_daten
.ActiveConnection = conn
.CursorType = adOpenKeyset
.CursorLocation = adUseServer
.LockType = adLockOptimistic
.Source = AcsDbSource
.Open Options:=adCmdTableDirect
End With
Set rs_daten2 = New ADODB.Recordset  'Datenblatt 2
With rs_daten2
.ActiveConnection = conn
.CursorType = adOpenKeyset
.CursorLocation = adUseServer
.LockType = adLockOptimistic
.Source = AcsDbSource2
.Open Options:=adCmdTableDirect
End With
Exit Sub
schliessen:
Rem: Schliesse Access DB
DB_Close
GoTo nochmals
End Sub
Sub DB_Close()
On Error Resume Next
rs_daten.Update             'Actualisiert Access DB
rs_daten2.Update
rs_daten.Close              ' Schliesst Datenblatt Access
rs_daten2.Close
Set rs_daten = Nothing
Set rs_daten2 = Nothing
conn.Close                  'Schliesst Datei Access
Set conn = Nothing
End Sub

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datensatz aus Access Tabelle1 in Tabelle 2 kopiere
02.12.2012 11:36:47
fcs
Hallo Marco,
mich wundert, dass der Fehler erst in dieser Zeile auftritt.
Das liegt aber wahrscheinlich an der Fehlerbehandlung in den verschiedenen Sub-Routinen, die meistens nicht spezifisch auf bestimmte Fehler reagiert, sondern pauschal weitere Aktionen ausführt.
Der Fehler steckt wahrscheinlich hier:
Sub StartStammdatei()
nochmals:
AcsDbName = "D:\Projekt\AuftraglisteKunden.mdb"
AcsDbSource = "DatenTransfer"
AcsDbSource2 = "DatenTransferAktiv"
On Error GoTo schliessen
pfad = ActiveWorkbook.Path & AcsDbName
Rem: öffnet Access DB
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & pfad
Der Variablen "AcsDbName" weist du den Datenbank-Dateinamen inklusive Verzeichnis zu.
Dann berechnest du "pfad", indem du das Verzeichnis der Excelmappe vor dem Datenbanknamen einfügst.
Variable "pfad" hat dann eine Wert ähnlich
C:\MyeinProjekt\ExceldateiD:\Projekt\AuftraglisteKunden.mdb"
Damit funktioniert dann die conn.Open-Methode nicht und es kommt zu einem Fehler-Abruch.
Wenn die Datenbank im gleichen Verzeichnis liegt wie die Exceldatei, dann muss Variable "AcsDbName" anders vorgegeben werden.
AcsDbName = "AuftraglisteKunden.mdb"
und pfad wie folgt berechnet werden:
pfad = ActiveWorkbook.Path & "\" & AcsDbName
Auf jeden Fall muss du sicherstellen, dass Verzeichnis und Dateiname in der Variablen "pfad" korrekt zusammenfügt werden.
Gruß
Franz

Anzeige
AW: Datensatz aus Access Tabelle1 in Tabelle 2 kopiere
02.12.2012 12:02:04
Marco
Hallo Franz
Danke für Deine schnelle Antwort.
Ich habe nur einen Teil der gesamte Codes gepostet. Den Pfad habe ich dummerweise vollständig ausgeschrieben. Habe dies nun geändert und der Code läuft bis zur geposteten Fehlermeldung durch.
Wie nun weiter
Gruss Marco

AW: Datensatz aus Access Tabelle1 in Tabelle 2 kopiere
02.12.2012 15:22:38
Luschi
Hallo Marco,
in Deinem Vba-Code ist Einiges nicht korrekt:
AcsDbName = "D:\Projekt\AuftraglisteKunden.mdb"
pfad = ActiveWorkbook.Path & AcsDbName
Mit 'MsgBox pfad' wirst Du erkennen, daß hier etwas nicht stimmt.
Dann willst Du in eine 2. Access-Tabelle aus der 1. Tabelle etwas kopieren, ich interpretiere das mal mit anhängen.
Das muß man ADO auch mitteilen, ansonsten wird es in den 1. Datensatz (DS) der 2. Tabelle geschrieben.
Die Schreiboperation für jeden DS (nicht Datenfeld) muß mit der Update-Anweisung abgeschlossen _ werden:

For i = 1 To 21
rs_daten2.Fields(i) = rs_daten.Fields(i).Value
Next i
rs_daten2.Update
Die Seek-Methode hat 2 Parameter, wovon keiner der beiden woihl optional ist. Du benutzt nur einen.
Aus der Access-Hilfe - Seek-Methode (ADO)
Findet 'Seek' die gewünschte Zeile nicht, tritt kein Fehler auf, und die Zeile wird am Ende des Recordset-Objekts positioniert.
Man muß also überprüfen, ob etwas gefunden wurde.

If Not rs_daten.EOF Then
'Dein Übernahme-Code
Else
MsgBox "Nix gefunden !",16, "zur Information..."
End If
Die 'Do Until rs_daten.EOF'-Schleife ist eine Endlosschleife, da es keinen neuen Suchbefehl oder MoveNext-Befehl zum Weiterschalten des Datensatz-Zeigers im Recordset gibt.
Wenn Du eine Access-Demo-DB mit Testdaten hier bereitstellst, werde ich oder einer der vielen fleißigen Helfer das schon geradebiegen.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Datensatz aus Access Tabelle1 in Tabelle 2 kopiere
02.12.2012 16:33:23
Marco
Hallo Luschi
Besten Dank für Deinen Input.
Ich habe Seek entfernt und meinen Code mit "if not ..." angepasst und mit der Update-Anweisung abgeschlossen. Zudem habe ich für die Tabelle2, welche beim starten keine DS enthält, mit rs_daten2.AddNew ergänzt (nur Temporäre Daten enthält und wieder gelöscht werden) und nun funzt es bestens.
Nochmals Danke Euch alle
Gruss Marco
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Datensatz aus Access Tabelle kopieren in Excel


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung öffnen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul hinzufügen: Klicke mit der rechten Maustaste auf "VBAProject (deinWorkbookName)", gehe zu Einfügen und wähle Modul.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Public AcsDbName As String
    Public AcsDbSource As String
    Public AcsDbSource2 As String
    Public pfad As String
    Public conn As New ADODB.Connection
    Public rs_daten As New ADODB.Recordset
    Public rs_daten2 As New ADODB.Recordset
    
    Sub Archiv_AuftraglisteKunden_Lesen()
       Dim i As Byte
       With Uf_Exe.Controls(Uf_Exe.ComboVar)
           VarOBez = .List(.ListIndex, 1)
           VarANr = .List(.ListIndex, 2)
           VarAStatus = .List(.ListIndex, 4)
       End With
       StartStammdatei
       rs_daten2.Index = "ID"
       If Not rs_daten.EOF Then
           For i = 1 To 21
               rs_daten2.AddNew
               rs_daten2.Fields(i) = rs_daten.Fields(i).Value
           Next i
           rs_daten2.Update
       Else
           MsgBox "Nix gefunden!", 16, "zur Information..."
       End If
       DB_Close
    End Sub
    
    Sub StartStammdatei()
       AcsDbName = "D:\Projekt\AuftraglisteKunden.mdb"
       AcsDbSource = "DatenTransfer"
       AcsDbSource2 = "DatenTransferAktiv"
       pfad = AcsDbName
       conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & pfad
       ' Weitere Codezeilen hier einfügen
    End Sub
    
    Sub DB_Close()
       On Error Resume Next
       rs_daten.Update
       rs_daten2.Update
       rs_daten.Close
       rs_daten2.Close
       conn.Close
    End Sub
  4. Variablen anpassen: Stelle sicher, dass du die Pfade und Tabellennamen an deine Gegebenheiten anpasst.

  5. Code ausführen: Drücke F5, um den Code auszuführen.


Häufige Fehler und Lösungen

  • Fehler 3265: "Ein Objekt, das dem angeforderten Namen oder Ordnerverweis entspricht, kann nicht gefunden werden."

    • Lösung: Überprüfe die Schreibweise der Feldnamen in deiner Access-Tabelle. Es könnte sein, dass du versuchst, auf ein nicht existierendes Feld zuzugreifen.
  • Falscher Pfad: Wenn der Pfad zur Datenbank nicht korrekt ist, wird die Verbindung fehlschlagen.

    • Lösung: Setze den pfad korrekt zusammen, beispielsweise:
      pfad = "D:\Projekt\AuftraglisteKunden.mdb"
  • Endlosschleife: Wenn deine Schleife nicht anständig beendet wird, kann dies zu einer Endlosschleife führen.

    • Lösung: Stelle sicher, dass du MoveNext oder andere Abbruchbedingungen korrekt implementierst.

Alternative Methoden

  • Access-Daten direkt in Excel importieren: Du kannst auch die Import-Funktion in Excel verwenden, um Daten aus Access-Tabellen direkt zu importieren, ohne VBA zu nutzen.
  • Power Query: Eine leistungsstarke Methode, um Daten aus Access zu importieren und zu transformieren, ist die Verwendung von Power Query in Excel.

Praktische Beispiele

Hier ist ein Beispiel, wie man Daten von einer Tabelle in eine andere übernehmen kann. Angenommen, du möchtest alle Kundeninformationen von Kunden nach AktiveKunden kopieren:

Sub KundenKopieren()
    ' Initialisiere Verbindungen und Recordsets
    ' ...
    ' Kopiere die Daten
    If Not rs_kunden.EOF Then
        Do While Not rs_kunden.EOF
            rs_aktiveKunden.AddNew
            For i = 1 To rs_kunden.Fields.Count - 1
                rs_aktiveKunden.Fields(i) = rs_kunden.Fields(i).Value
            Next i
            rs_aktiveKunden.Update
            rs_kunden.MoveNext
        Loop
    End If
    ' Schließe die Datenbank
    ' ...
End Sub

Tipps für Profis

  • Fehlerbehandlung: Implementiere eine spezifische Fehlerbehandlung in deinen VBA-Prozeduren, um die Ursachen von Fehlern schneller zu identifizieren.
  • Daten validieren: Überprüfe die Daten vor dem Kopieren, um sicherzustellen, dass die Datenbankintegrität gewahrt bleibt.
  • Dokumentation: Kommentiere deinen Code gut, um die Nachvollziehbarkeit zu erhöhen, insbesondere wenn du mit mehreren Tabellen und Datensätzen arbeitest.

FAQ: Häufige Fragen

1. Frage: Wie kann ich mehrere Datensätze auf einmal kopieren?
Antwort: Du kannst eine Schleife verwenden, um durch die Datensätze zu iterieren und jeden Datensatz mit AddNew zu kopieren.

2. Frage: Was ist der Unterschied zwischen AddNew und Update?
Antwort: AddNew erstellt einen neuen Datensatz im Recordset, während Update die Änderungen an einem bestehenden Datensatz speichert.

3. Frage: Welche Version von Access und Excel benötige ich?
Antwort: Die meisten VBA-Codes funktionieren mit Access 2007 und höher sowie Excel 2007 und höher, achte jedoch auf spezifische Versionen bei der Verwendung von Funktionen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige