Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Bestimmte Daten vom Formular an bestimmte Zellen an Excel übergeben

Begonnen von Lemmy2902, Mai 20, 2025, 14:03:56

⏪ vorheriges - nächstes ⏩

Knobbi38

Hallo Lemmy,

eigentlich sagt der Fehler doch alles. Wenn du auf die ADODB Bibliothek verwenden möchtest, mußt du natürlich deinem Projekt auch einen Verweis auf diese Bibliothek ( "Microsoft ActiveX Data Objects 6.1 Library") hinzufügen, sonst kannst du diese nicht ansprechen.

Dann solltest du nicht einfach das Schlüsselwort NEW so in diesem Zusammenhang verwenden, sondern mit Set einer Referenzvariable zuweisen. Und ganz wichtig: wenn du Ressourcen verwendest, solltest du diese am Ende wieder freigeben; das gilt auch für Objecte, welche du selber mit Open eröffnest, dann mußt du auch anschließend die Close Methode verwenden. Das gilt um so mehr, wenn du eine andere Anwendung per Automation ansprichst. Wird das nicht ordentlich beendet, gibt es anschließend Probleme mit der Anwendung oder im schlimmsten Fall sogar mit Windows.

Ich nehme mal an, daß du das mit der BeispielDB aus #11 nachvollziehen kannst.

Gruß Knobbi38
 


Bitsqueezer

Hallo,

hier:
Dim rs As New ADODB.Recordsetwird ein ADO-Recordset deklariert. Wenn Du das verwenden willst, dann mußt Du eine Referenz auf die ADO-Library im VBA-Editor aktivieren, sonst kommt es zu dem Fehler.

Warum Hondo jetzt ein ADO-Recordset verwendet - keine Ahnung. Da Du mit einer Access-Datenbank arbeitest, kannst Du einfach ein DAO-Recordset verwenden, was der übliche Weg ist, auf Access-Tabellen zuzugreifen.
ADO ist vor allem für externe Datenbanken wie SQL Server gedacht. Die Datenbank, auf die zugegriffen wird, findet sich im Connectionstring, und die wird für die lokale Datenbank aus "CurrentProject" bezogen, weil Access grundsätzlich immer einen ADO-Connectionstring bereithält, auch wenn ADO nicht verwendet wird (aus historischen Gründen, Thema ADP).

Wie gesagt - brauchst Du aber nicht, verwende stattdessen die Deklaration DAO.Recordset.
Das Recordset wird mit "Set rs = CurrentDb.OpenRecordset("MeineTabelle") " geöffnet.
Anleitung und Beispiele:
https://learn.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao

Gruß

Christian


Lemmy2902

den einen Fehler behoben und schon kommt der nächste die lautet wie Unzulässige SQL Anweisung

Hondo

Zitat von: Bitsqueezer am Mai 21, 2025, 15:16:04Warum Hondo jetzt ein ADO-Recordset verwendet - keine Ahnung.
Hab ich dem Themenstarter zu Liebe gemacht, der hat zuerst ADO verwendet.
Ich selbst verwende eigentlich immer DAO.

Bitsqueezer

Hallo,

...und jetzt sollen alle raten, wie Dein Code dazu aussieht?...

DU willst doch Hilfe, also ist es an Dir, alle notwendigen Informationen bereitzustellen.

Gruß

Christian

Hondo

Zitat von: Lemmy2902 am Mai 21, 2025, 15:29:14Unzulässige SQL Anweisung
Und wie lautet deine SQL-Anweisung? Tabellennamen korrekt, Feldnamen korrekt?
Man, dass man dir alles aus der Nase ziehen muss.

Lemmy2902

SELECT tblProjekte.projektID, tblProjekte.proNummer, tblProjekte.proBeschreibung, tblProjekte.proProjektGeschlossen, tblProjekte.proStartDatum
FROM tblProjekte
WHERE (((tblProjekte.proProjektGeschlossen)=False) AND ((tblProjekte.proStartDatum) Like "*" & "2025"));

MzKlMu

Hallo,
und wie sieht es damit aus:
SELECT projektID
    ,proNummer
    ,proBeschreibung
    ,proProjektGeschlossen
    ,proStartDatum
FROM tblProjekte
WHERE proProjektGeschlossen = False
    AND Year(proStartDatum) = 2025
Gruß Klaus

Lemmy2902

Public Sub test()

    Dim rs As New ADODB.Recordset
    Dim i As Long
    Dim oExcel As Object
   
    On Error Resume Next
    Err.Clear
   
    Set oExcel = CreateObject("Excel.Application")
    If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
    On Error GoTo 0

    With oExcel
        .Visible = True
        .workbooks.Add
        rs.Open "tblProjekte", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        For i = 0 To rs.Fields.Count - 1
            .Cells(1, i + 1) = rs.Fields(i).Name
        Next i
        .Range("A2").Select
        .Selection.Copyfromrecordset rs
    End With
    Set oExcel = Nothing
    rs.Close
End Sub

Guten Morgen, das ist der Code den ich gerade verwende. wenn ich das strte wird mir der erste daten satz in Excel Geschrieben und dann kommt die Fehlermeldung "die Metohde copyFromRecordset für das Objekt Range ist fehlgeschlagen.

Wenn ich das ganze mit der von die Angepassten Abfrage Versuche kommt der Fehler wieder Unzulässige SQL-Anweisung

Hondo

Der Code ist Korrekt, ist ja auch von mir - was an sich nichts bedeuten muss.
Hast du die Datenbank von mir mal getestet?

Um die Sache abzukürzen, mach doch mal eine Beispieldb mit Beispielwerten in der Tabelle tblProjekte und lade die hier hoch.
Sind Datensätze in der Tabelle überhaupt vorhanden?
Gruß Andreas

Lemmy2902

ja ich habe diene Datenbank getestet da klappt alles bestens, tblProjekte hat insgesamt 499 Datensätze und ist aber nur ein teil. das komplette Projekt ist insgesamt 260MB groß

Lemmy2902

es bringt auch nicht eine neue DB zu erstellen, deine Funktioniert ja, es soll ja mit vorhanden Funktionieren.

Lemmy2902

so das Problem war ein OLE objekt jetzt kann ich tblProjekte in Excel übertragen, jetzt müsste die Inhalte noch in bestimmten Zellen Ausgegeben werden. z. B Datum auf Zelle A4

Knobbi38

Hallo Lemmy,

der Code von Andy ist möglicherweise nicht ganz optimal, aber dazu gab es schon andere Ratschläge, wie man das verbessern könnte. Die hast du aber noch nicht umgesetzt. Schau dir mal diese Codestellen näher an:
    On Error Resume Next
    Err.Clear

    Set oExcel = CreateObject("Excel.Application")
    If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
    On Error GoTo 0
Was soll den dieser Code bewirken, außer das im Fehlerfall CreateObject() zweimal aufgerufen wird?

Dim rs As New ADODB.RecordsetDaß das nicht besonders glücklich ist und nur Probleme verursacht, hatten wir schon.  Wo werden die Ressourcen wieder freigegeben? Gerade bei Automation ist sorgfältiges Programmieren sehr wichtig, sonst wir dein System instabil.
Einfach alle Tips (#15) ignorieren ist nicht zielführend.

      
.Range("A2").Select
.Selection.Copyfromrecordset rs
 
Der Umweg über das Selection-Objekt kannst du dir sparen, sondern du kannst einfach die CopyFromRecordset() Methode vom Range Objekt aufrufen. Schau dir einfach mal das Beispiel in der Hilfe an.

Noch zwei kleine Hinweise:
1. Vor der Verwendung eines Recordsets sollte geprüft werden, ob das Recordset überhaupt Datensätze enthält.
2. Steht zwar nicht im Handbuch, aber CopyFromRecordset() kann bei einer größeren Anzahl von Datensätzen Probleme bereiten. Das sollte man immer im Hinterkopf behalten und ggf. auf eine andere Methode ausweichen.

Knobbi38

PS:
Bei Fehlermeldungen immer auch den Fehlercode mit angeben.

PPS:
Zitatjetzt müsste die Inhalte noch in bestimmten Zellen Ausgegeben werden. z. B Datum auf Zelle A4
Wo ist jetzt das Problem? Die Syntax dafür kennst du doch schon - Stichwort "Cells()".



Lemmy2902

Private Sub Befehl139_Click()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim i As Long
     Dim oExcel As Object
     
     On Error Resume Next
     Err.Clear
     
     Set oExcel = CreateObject("Excel.Applikation")
     If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
     On Error GoTo 0
     
     Set db = CurrentDb
     Set rst = db.OpenRecordset("tblProjekte", dbOpenDynaset)
     With oExcel
        .Visible = True
        .workbooks.Add
     For i = 0 To rst.Fields.Count - 1
            .Cells(1, i + 1) = rst.Fields(i).Name
        Next i
        .Range("A2").Select
        .Selection.Copyfromrecordset rst
    End With
    Set oExcel = Nothing
    rst.Close

End Sub

Danke für die Hinweise ich habe jetzt den Code etwas Umgebaut von ADO auf DAO, läuft Prima. das mit den Cells ist mir noch etwas zu Hoch, ich weis das in der For-Schleife alle Inhalte srt Zeilenweise geschrieben werden, aber wie mache ich das das ein bestimmter Teil von den eingelesen Daten auf eine bestimmte cells geschrieben wird. ein kleiner Ansatz währe Hilfreich, Danke