Microsoft Excel

Herbers Excel/VBA-Archiv

Die Methode DBEngine für das Objekt...


Betrifft: Die Methode DBEngine für das Objekt...
von: Jonas
Geschrieben am: 29.11.2018 09:58:27

Hallo ich bekomme beim ausführen eines meiner Subs folgende Fehlermeldung:

Die Methode DBEngine für das Objekt _application ist fehlgeschlagen.

Mit den Sub importiere ich Abfragen aus meiner Access Datenbank (accdb) in Excel (xlsb), um sie dort _
weiter zu bearbeiten. Die Exceltabelle und das Backend meiner Datenbank liegen beide auf unserem Netzlaufwerk. Es gibt zwei unterschiedliche Varianten darauf zuzugreifen. Entweder lokal über den eigenen Computer, oder über eine Remoteverbindung die sich auf den Server aufschaltet. Bei der ersten Variante funktioniert der Code hervorragend, lediglich über die Remoteverbindung erscheint die genannte Fehlermeldung, obwohl man auf dieselben Dateien zugreift. Auch die Officeversion ist bei beiden Varianten gleich. Ich kann mir den Fehler einfach nicht erklären.

Hier das erwähnte Sub:

Sub DatenImport()

    Dim wksRohdaten As Worksheet, wksRohdatenSheet, wksQualificationLevel As Worksheet,  _
wksCrossQualification As Worksheet

    Dim appAccess   As Object
    Dim accDB       As Object
    Dim accRst      As Object
    Dim accRst2     As Object
    Dim accRst3     As Object
    Dim accRst4     As Object
    Dim accRst5     As Object
    Dim accRst6     As Object
    Dim accRst7     As Object
    Dim strConnect  As String
    
    Set wksRohdaten = Sheets("Rohdaten")
    Set wksQualificationLevel = Sheets("QualificationLevelXWB")
    Set wksCrossQualification = Sheets("CrossQualification")
    Set wksRohdatenSheet = Sheets("RohdatenSheet")
    
    
    Const DB_NAME As String = "P:\500_Production\Production_Capacity\Datenbank\ _
Stammdatenbank_be.accdb" 'Datenbank
    Const PASSWORT As String = "******"       'Passwort
    
    'Connect String
    strConnect = "ms access;pwd=" & PASSWORT & ";database=" & DB_NAME
    
    'neues Access Object
    Set appAccess = CreateObject("Access.Application")
        
    'Datenbank öffnen
    Set accDB = appAccess.DBEngine(0).OpenDatabase( _
                DB_NAME, _
                    Options:=False, _
                    ReadOnly:=True, _
                    Connect:=strConnect)
    
    'neues Recordset
    Set accRst = accDB.OpenRecordset("qryCompetenceGridXWB")
    Set accRst2 = accDB.OpenRecordset("qryCompetenceQualificationOSXWB")
    Set accRst3 = accDB.OpenRecordset("qryCompetenceQualificationSpecificXWB")
    Set accRst4 = accDB.OpenRecordset("qryCompetenceQualificationOSSA")
    Set accRst5 = accDB.OpenRecordset("qryCompetenceQualificationOSLRFWD")
    Set accRst6 = accDB.OpenRecordset("qryCompetenceQualificationOSLRAFT")
    Set accRst7 = accDB.OpenRecordset("qryCompetenceGridSheetXWB")
    
    'Inhalt Tabellenblätter Rohdaten löschen um Alteinträge zu entfernen
    wksRohdaten.Range("A2:N100000").ClearContents
    wksQualificationLevel.Range("A2:D100000").ClearContents
    wksCrossQualification.Range("A2:F100000").ClearContents
    wksRohdatenSheet.Range("A2:C100000").ClearContents
    
    'Daten ausgeben
    wksRohdaten.Range("A2").CopyFromRecordset accRst
    wksQualificationLevel.Range("A2").CopyFromRecordset accRst2
    wksQualificationLevel.Range("C2").CopyFromRecordset accRst3
    wksCrossQualification.Range("A2").CopyFromRecordset accRst4
    wksCrossQualification.Range("C2").CopyFromRecordset accRst5
    wksCrossQualification.Range("E2").CopyFromRecordset accRst6
    wksRohdatenSheet.Range("A2").CopyFromRecordset accRst7
    accRst.Close
    accRst2.Close
    accRst3.Close
    accRst4.Close
    accRst5.Close
    accRst6.Close
    accRst7.Close
    accDB.Close
    
    Set accDB = Nothing
    Set accRst = Nothing
    Set accRst2 = Nothing
    Set accRst3 = Nothing
    Set accRst4 = Nothing
    Set accRst5 = Nothing
    Set accRst6 = Nothing
    Set accRst7 = Nothing
    
    'Pivot aktualisieren
    For Each wks In Worksheets
    For Each pt In wks.PivotTables
    pt.PivotCache.Refresh
    Next
    Next

End Sub
Hat einer von euch eventuell eine Erklärung dafür? Leider ist die Funktion über die Remote für die spätere Arbeitsweise der DB essentiell, da viele Mitarbeiter ausschließlich über die Remote arbeiten und auf ihren eigenen Computern gar kein Office installiert ist.

Liebe Grüße und vielen Dank
Jonas

  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Luschi
Geschrieben am: 30.11.2018 00:35:46

Hallo Jonas,

ich kann mir nicht vorstellen, das dieses Prozedur schon mal so funktioniert hat, denn der Verbindungsstring (Connect String) muß ganz anders aussehen; und wie, kannst Du hier nachlesen:
https://www.connectionstrings.com/access/

Bei mir klappen mit ADODB beide Varianten:
- Microsoft Jet OLE DB 4.0
- Microsoft ACE OLEDB 12.0

Gruß von Luschi
aus klein-Paris

-


  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Jonas Albrecht
Geschrieben am: 30.11.2018 09:27:01

Hallo Luschi, erstmal vielen Dank für die Antwort. So ganz sehe ich da aber noch nicht durch. _ Es wäre super lieb wenn du mir ein bisschen auf die Sprünge helfen könntest. Wenn ich das richtig verstanden habe, brauche ich die Microsoft Access Database Engine 2010, da ich ein 64bit System nutze. Des Weiteren habe ich Microsoft ActiveX Data Objects 2.8 Library Objektbibliothek aktiviert, allerdings wird der von der Website stammende Code

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;
Jet OLEDB:Database Password=MyDbPassword;
noch nicht erkannt. Sorry ich glaube ich habe das noch nicht so ganz verstanden :/

Liebe Grüße
Jonas


  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Luschi
Geschrieben am: 02.12.2018 06:56:31

Hallo Jonas,

stelle ein kleines praktisches Beispiel bereit, damit man Dir helfen kann.
Beim gesetztem Verweis 'Microsoft ActiveX Data Objects 2.8 Library' spricht man von 'Early Binding'. Hierbei kommt es manchmal dann zu Problemchen, wenn die User mit unterschiedlichsten Programmversionen unterwegs sind. Deshalb sind diese Verbindungsstrings besonders wertvoll, da man hier die Methode 'Late Binding' benutzt und so dem o.g. Problemchen aus dem wege geht.
Schmeiß die feste Verdrahtung zu ADO Version 2.8 raus und stürze Dich auf 'Late Binding'. Das Betriebssystem sorgt dann dafür, daß immer die aktuellste Version von AOO zum Einsatz kommt.
ADO ist datenbanktechnisch empfindlicher als die externe Verweise in Excel-Formeln und da können schon kleinste Schreibfehler zu Fehlern kommen bzw. die Datenrückgabe ist blockiert.
Deshalb ist das praktische Beispiel immer einer theoretischen Diskussion vorzuziehen.

Gruß von Luschi
aus klein-Paris



  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Jonas
Geschrieben am: 04.12.2018 17:41:06

Hey Luschi, also ich habe es jetzt mit deinem Ansatz wie folgt gelöst und es funktioniert für den Moment tadellos:

Sub DatenImport()

    Dim wksAuswertung As Worksheet
    Dim pt As PivotTable
    Dim wks As Worksheet
    Dim con As ADODB.Connection
    Set con = New ADODB.Connection
    Dim rs1 As ADODB.Recordset
    
    Set wksAuswertung = Sheets("Auswertung")
    
    With con
        .Provider = "Microsoft.ACE.OLEDB.12.0;Data Source=P:\500_Production\Production_Capacity\ _
Datenbank\Stammdatenbank_Frontend_Views.accdb; Mode=Share Deny None;"
        .Properties("Jet OLEDB:Database Password") = "*****"
        .Open
    End With
    
    'neues Recordset
    Set rs1 = con.Execute("qryToolsLostAndOutOfServiceStatistic")
    
    'Daten ausgeben
    wksAuswertung.Range("B3").CopyFromRecordset rs1

    rs1.Close
    con.Close
    
    Set rs1 = Nothing
    Set con = Nothing

    'Pivot aktualisieren
    For Each wks In Worksheets
    For Each pt In wks.PivotTables
    pt.PivotCache.Refresh
    Next
    Next

End Sub
Für wie sicher hältst du diese Lösung?

liebe Grüße
Jonas


  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Jonas
Geschrieben am: 30.11.2018 11:23:15

Hey Luschi! Ich habe jetzt einmal bisschem rumprobiert, aber jetzt hänge ich wirklich fest..

Dim con As ADODB.Connection
Set con = New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=P:\500_Production\ _
Production_Capacity\Datenbank\Stammdatenbank_be_test.accdb;Mode=Share Deny None;"
'Jet OLEDB: Database Password = "*****"
con.Open
Soweit bin ich bis jetzt gekommen. Das mit dem Passwort will noch nicht so recht funktionieren, weswegen ich es vorläufig erstmal aus der Datenbank entfernt habe. Das darf jedoch nicht so bleiben. Des Weiteren besteht noch die Frage wie ich meine erstellten Abfragen in meine Tabellenblätter bekomme?

Vielen Dank
Jonas


  

Betrifft: AW: Die Methode DBEngine für das Objekt...
von: Jonas
Geschrieben am: 30.11.2018 16:05:44

Hey Luschi, hat sich alles geklärt und funktioniert jetzt wunderbar! Vielen Dank! Du hast mir mein Wochenende gerettet :)

Liebe Grüße
Jonas