Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1828to1832
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ADODB Laufzeitfehler 3706 / 32 auf 64Bit

ADODB Laufzeitfehler 3706 / 32 auf 64Bit
12.05.2021 17:28:58
Marv
Hallo zusammen,
unsere knapp 40 Mitarbeiter nutzen ein VBA Tool zum einheitlichem Emailversand.
Bei Versand werden zeitgleich die Informationen in einer Access.mdb gespeichert.
Dies geschieht mit folgendem Code:

  • Dim dbpath Application.EnableCancelKey = xlDisabled Application.DisplayAlerts = False Application.ScreenUpdating = False Dim nConnection As New ADODB.Connection Dim nRecordset As New ADODB.Recordset Dim sqlQuery As String dbpath = "G:\Kundencenter\Auswertungen\Archiv\Neuer Ordner\Daten\XMAILDatabase_.mdb" nConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath sqlQuery = "Select * from DatenBetrieb" nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic With nRecordset .AddNew
  • Testweise wurde ein Mitarbeiterplatz von Excel 2010 32 Bit auf 2013 64 Bit umgestellt.
    Seitdem Erscheint der Fehler 3706 (Provider kann nicht gefunden werden).
    Liegt ja scheinbar an der 32 Bit Version mit der Codezeile
    
    
  • "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=".
  • Diese Zeile müsste nach Recherche bei der 64 Bit Version wie folgt aussehen:
  • 
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=".
    

  • Dies allein reicht jedoch scheinbar nicht aus.
    Bei diesen Themen bin ich leider gar nicht tief im Thema und benötige Hilfe in Laiensprache ☺
    Vielen Dank vorab

    13
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    12.05.2021 18:00:59
    EtoPHG
    Hallo Marv,
    Zitat: Testweise wurde ein Mitarbeiterplatz von Excel 2010 32 Bit auf 2013 64 Bit umgestellt.
    Zum Glück nur testweise. Frag mal deine IT warum auf Excel 64 Bit umgestellt wird. Was versprechen sie sich davon?
    Es gibt eindeutige Empfehlungen von Microsoft, dies nur unter wirklich erforderlichen Bedingungen zu tun:
    Wählen zwischen der 64-Bit- oder 32-Bit-Version... und dort unter den Gründen für eine 32Bit Version von Excel(bzw. Office)¨
    Wenn partout bei der 64Bit Version von Office geblieben werden soll, werdet ihr noch wesentlich mehr Probleme mit Euren selbstgestrickten Makros haben.
    Mir ist bis jetzt noch kein grösseres Unternehmen begegnet, das auf 64Bit Excel umgestellt hat. Alle sind bei 32Bit geblieben, weil zu viele selbstgebautes im Excel-Universum vorhanden ist/war.
    Gruess Hansueli
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    12.05.2021 18:17:36
    M.A.
    Hi, vielen Dank für die Antwort. Muss tatsächlich auf 64 Bit umgestellt werden. Verknüpfungen mit anderen Programmen erfordern dies aufgrund Abstürze etc. Das genannte Tool funktioniert problemlos unter 64 Bit nach unseren ersten Tests. Nur halt das Schreiben einer neuen Zeile in der AccessDB nicht mehr. Da wird halt durch den Debugger exakt diese Codezeile bemängelt.
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    12.05.2021 19:16:54
    Yal
    Hallo Marv,
    es ist immer nur die Frage "nach welchem Begriff muss ich goo*, um die richtige Antwort zu bekommen".
    
    Public Sub Test()
    #If VBA7 Then
    MsgBox "64Bit"
    #Else
    MsgBox "32Bit"
    #End If
    End Sub
    
    Dementsprechend die passende ConnectionString anleiten.
    Da es sich um Compiler-Anweisung handelt, kann man in dem Fall als Konstante -scheinbar doppelt, ist aber nicht- ablegen:
    
    #If VBA7 Then
    Public Const cProvider = "Microsoft.ACE.OLEDB.12.0"
    #Else
    Public Const cProvider = "Microsoft.Jet.OLEDB.4.0"
    #End If
    
    VG
    Yal
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    12.05.2021 20:00:53
    Nepumuk
    Hallo Yal,
    das ist so nicht richtig. VBA7 ist ab Excel 2010 wahr egal ob es sich um die 32 oder 64 Bit-Version handelt . Nur durch die Compilerkonstante "Win64" kannst du zwischen der 32 und der 64 Bit-Version unterscheiden.
    
    Public Sub Test()
    #If Win64 Then
    MsgBox "64Bit"
    #Else
    MsgBox "32Bit"
    #End If
    End Sub
    
    Gruß
    Nepumuk
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    12.05.2021 21:25:11
    Yal
    Hallo Nepumuk,
    vielen Dank für die Korrektur. Für den Fragenden aber auch für mich. Ich habe mich verlesen und hätte es nicht bemerkt.
    VG
    Yal
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    17.05.2021 13:30:58
    M.A.
    Hallo Yal, hallo Nepumuk,
    vielen Dank für die Antworten.
    Bekomme es nur nicht in meinen bestehenden Code eingearbeitet.
    Durch:
  • 
    #If Win64 Then
    Public Const cProvider = "Microsoft.ACE.OLEDB.12.0"
    

  • erhalte ich immer einen Fehler beim Kompilieren bei der "Public Const". und der Ergänzung
    
    
  • ;Data Source=" & dbpath
  • Habe einiges versucht, es jedoch nicht zum Laufen bekommen. Selbst mit dem Setzen der "" habe ich Probleme. Bin bezogen auf solche
    Zeilen, absoluter Laie.
    Könntet Ihr mir die Zeilen, in meinem ersten Eintrag stehenden Codestück, einarbeiten?
    Lieben Dank vorab.
    Marv
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    17.05.2021 16:24:14
    EtoPHG
    Hallo Marv,
    Bitte gewöhne dir an die fehlerhafte Zeile genau so im Forum wiederzugeben, wie sie in deinem Code aussieht. Textliche Erklärungen neigen zu Missverständnissen.
    Deine Zeile im Code könnte so lauten:
    
    nConnection.Open cProvider & ";Data Source=" & dbpath
    
    sonst poste den ganzen Code, so wie du ihn angepasst hast.
    Gruess Hansueli
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    17.05.2021 20:12:50
    Yal
    Hallo Marv,
    
    #If Win64 Then
    Public Const cProvider = "Microsoft.ACE.OLEDB.12.0"
    #Else
    Public Const cProvider = "Microsoft.Jet.OLEDB.4.0"
    #End If
    nConnection.Open "Provider=" & cProvider & ";Data Source=" & dbpath
    
    Alternativ: den gesamte Teil-String in der Konstant reinpacken:
    
    #If Win64 Then
    Public Const cConnectionTeilString1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    #Else
    Public Const cConnectionTeilString1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    #End If
    nConnection.Open cConnectionTeilString1 & dbpath
    
    VG
    Yal
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    18.05.2021 11:32:58
    M.A.
    Nochmals Danke, jedoch meckert er bereits bei der Zeile
    
    #If Win64 Then
    
  • Public Const cProvider = "Microsoft.ACE.OLEDB.12.0"
  • Diese markiert er rot.
    Füge ich meinen ursprünglichen Code testweise in eine neue Userform ein, dann meckert er bereits bei:
    Dim dbpath
    Application.EnableCancelKey = xlDisabled
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
  • 
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    

  • Dim sqlQuery As String
    dbpath = "G:\Kundencenter\Auswertungen\Archiv\Neuer Ordner\Daten\XMAILDatabase_.mdb"
    nConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath
    sqlQuery = "Select * from DatenBetrieb"
    nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
    With nRecordset
    .AddNew
    Mit diesem Code wurden bisher Daten einer Userform (Textboxen), in eine .mdb Datei in eine Tabelle übertragen.
    Bei Klick wurde ein neuer Datensatz in die Tabelle der .mdb geschrieben.
    Dies funktioniert nur bei dem Testplatz mit der 64Bit Version nicht mehr.
    Gemeckert hat VBA gar nicht. Es wurde nur kein Eintrag in die Datenbank geschrieben und
    das Programm stürzte einfach ab.
    Habe einige Stunden recherchiert und mir garantiert komisches zusammengebastelt.
    Leider komme ich hierbei gar nicht weiter.
    Anbei der ursprüngliche Code:
    
    Private Sub Test()
    Dim dbpath
    Application.EnableCancelKey = xlDisabled
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
  • 
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    

  • Dim sqlQuery As String
    dbpath = "G:\Testpfad\XMAILDatabase_.mdb"
    nConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath
    sqlQuery = "Select * from DatenBetrieb"
    nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
    With nRecordset
    .AddNew
    .update
    .close
    End sub
    Habe versucht nur den Teil der Providers von JET.OLEDB.4.0. auf ACE.OLEDB.12.0. zu ändern, jedoch wird die .mdb Datei gar nicht angesprochen, es wird
    kein neuer Datensatz angelegt. Irgendwas muss ich garantiert noch ändern in dem ursprünglichen Code. Leider meckert
    VBA nicht explizit an den entsprechenden Stellen.
    Ich muss mich entschuldigen, dass ich hier bis auf die Erklärung kaum einen Beitrag zu leisten kann, aber ohne Hilfe in Laiensprache komme
    ich nicht weiter. Ist denn z.B. .mdb denn das richtige Format? Wurde unter Excel 2010 32 Bit angelegt. Etc.
    Um die 64 Bit Version kommen wir nicht drum herum auf der Firma. In ein paar Tagen soll die Umstellung auf alle Plätze erfolgen.
    Lieben Dank vorab.
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    18.05.2021 12:42:09
    Yal
    Hallo Marv,
    es geht darum, dass die Connection auf 32 und 64 bittige Excel funktioniert. Es ist schon erreicht, wenn Du lesend eine Recordset-Abfrage auf beide Konfiguration beziehen kannst.
    Wenn irgendwo anders etwas nicht funktioniert, kann man nicht zwangläufig dem ConnectionString zuordnen.
    Noch eine Alternative:
    
    Public strConn As String
    #If Win64 Then
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    #Else
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    #End If
    nConnection.Open strConn & dbpath
    
    Viel Erfolg
    Yal
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    18.05.2021 16:12:24
    M.A.
    Hallo Yal,
    vielen Dank.
    Hier beschwert er sich nun über die Deklaration "Puplic" bei "
    
    Public strConn As String
    
    "
    Als "Dim" statt "Puplic" kommt "Fehler beim Kompilieren.
    Habe mal testweise eine neue Excel inkl. mini UserForm und eine .mdb mit einer Tabelle angelegt.
    Hier kann ich in einem Sub des Command-Buttons nicht mal
    
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    
    hinterlegen. Auch dann gibt es einen Fehler beim Kompilieren.
    Mein Code Ursprünglich:
    
    Private Sub Test()
    Dim dbpath
    Application.EnableCancelKey = xlDisabled
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    Dim sqlQuery As String
    dbpath = "G:\Kundencenter\Auswertungen\Archiv\Neuer Ordner\Daten\XMAILDatabase_.mdb"
    nConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath
    sqlQuery = "Select * from DatenBetrieb"
    nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
    With nRecordset
    .AddNew
    .update
    .close
    End sub
    
    Mein Code nun:
    
    Private Sub Test()
    Dim dbpath
    Application.EnableCancelKey = xlDisabled
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    Dim sqlQuery As String
    Public strConn As String
    dbpath = "G:\Kundencenter\Auswertungen\Archiv\Neuer Ordner\Daten\XMAILDatabase_.mdb"
    If Win64 Then
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    Else
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    End If
    nConnection.Open strConn & dbpath
    sqlQuery = "Select * from DatenBetrieb"
    nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
    With nRecordset
    .AddNew
    .update
    .close
    End sub
    
    Ich finde im Netz nur weitere Codemöglichkeiten, jedoch alle bezogen auf 32 Bit.
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    18.05.2021 19:35:13
    Yal
    Hallo Marv,
    vielleicht hätten wir es deutlicher sagen sollen:
    der Test "#If Win64 Then" ist ein Compiler-Anweisung. Daher ist die Raute (#) davor notwendig. Auch beim #Else und auch beim #End If.
    Sonst:
    _ Public und Private gelten für Variable auf Modul-Ebene. Nicht innerhalb einer Function/Sub. Da gibt es nur Dim.
    _ Gewönne dich, immer zuerst die Dim, dann die Anweisungen. Nicht vermischt. Es funktioniert zwar aber nicht immer (könnte bei dir der Fall gewesen). Sieht auf alle Fälle unschön.
    _ Achte auf das Einrücken. Es erhöht nicht nur die Lesbarkeit, sondern vermeidet Anfänger-Fehler (auch bei gestandenen Programmierer)
    _ der Pfad der DB ändert sich im Lauf der Verarbeitung nicht, daher ruhig als Const definieren (macht weniger Zeilen, wirkt sauberer)
    _ die Application.EnableCancelKey und Co kannst Du dir sparen. Bringt hier nichts.
    _ Ein "With" wird immer mit einem "End With" abgeschlossen.
    _ wenn schon "With nRecordset" dann den ".Open" auch dazu einreihern (nur Konsequent)
    
    Private Sub Test()
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    Dim sqlQuery As String
    Dim strConn As String
    Const dbpath = "G:\Kundencenter\Auswertungen\Archiv\Neuer Ordner\Daten\XMAILDatabase_.mdb"
    #If Win64 Then
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    #Else
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    #End If
    nConnection.Open strConn & dbpath
    sqlQuery = "Select * from DatenBetrieb"
    With nRecordset
    .Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
    .AddNew
    .Update
    .Close
    End With
    End Sub
    
    Und zwischen ".AddNew" und "Update" kommt noch was. Sonst passiert nichts, ausser eine leere Datensatz in der DB reinschreiben, wenn die Tabelle es erlaubt, ein Fehler sonst (wenn ein Feld Eingabe-Pflicht hat).
    VG
    Yal
    Anzeige
    AW: ADODB Laufzeitfehler 3706 / 32 auf 64Bit
    19.05.2021 09:19:52
    M.A.
    Hallo Yal, vielen Dank für die ausführliche Erklärung.
    Leider stürzt das Programm so ab und erzeugt keinen Eintrag in der .mdb (Excel startet neu).
    Wollte erneut eine neue Testdatei und Test.mdb erstellen, um die Funktion separat zu testen. (Schreiben in die .mdb).
    Da lässt er bereits folgende Deklarationen nicht zu:
  • 
    Dim nConnection As New ADODB.Connection
    Dim nRecordset As New ADODB.Recordset
    

  • 
    "Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert."
    
    Auch bei einer 32 Bit Version.
    Recht lustig, da der Code in dem eigentlichen Tool nicht anders aussieht.
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige
    Archiv - Verwandte Themen
    Forumthread
    Beiträge