Problème d'accès à une base Access 2007

Mark53 - 21 août 2012 à 10:25
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 - 23 août 2012 à 08:37
Bonjour à tous,

J'utilise VBA 6.3 et j'essaie d'ouvrir un fichier Access 2007 (accdb). J'ai installé le programme de Microsoft AccessDatabaseEngine.exe et j'ai checké la référence "Microsoft Office 12 access database engine object library" sous VB.

Pourtant, le code suivant :

Dim db As DAO.Database
 
Set db = DBEngine.OpenDatabase("C:\chemin\matable.accdb")


renvoie toujours l'erreur 3044 ("C:\chemin\matable.accdb" n'est pas un chemin d'accès valide). Bien entendu, j'ai vérifié le chemin et le nom de fichier et ils sont ok. J'imagine que c'est un problème classique. Est-ce que vous pourriez me dire ce qui se passe ? J'ai tenté aussi d'ouvrir un fichier mdb mais j'obtiens exactement la même erreur...

Merci,
Mark

14 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 août 2012 à 11:11
Salut

DAO est obsolète. Utilise ADO (ADODB).
Ajoute la référence suivante : "Microsoft ActiveX Data Objects 2.8 Library" = fichier msado28.tlb
Éventuellement, supprime ta référence à la référence que tu as citée.

Voilà un exemple de connexion :
    Dim oConnexion  As ADODB.Connection
    Dim oRS         As ADODB.Recordset
    Dim sSQL        As String
    Dim r           As Long

    Set oConnexion = New ADODB.Connection
    oConnexion.ConnectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Users\Jack\Documents\Database1.accdb;" & _
        "Persist Security Info=False;"
    oConnexion.Open
    If oConnexion.State <> adStateOpen Then
        Debug.Print "Pas ouverte", oConnexion.State
        Exit Sub
    End If

    Set oRS = New ADODB.Recordset
    sSQL = "Select * From Table2"
    With oRS
        .CursorLocation = adUseClient
        .Open sSQL, oConnexion, adOpenDynamic, adLockOptimistic
        If oRS.RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                For r = 0 To .Fields.Count - 1
                    Debug.Print .Fields(r).Name; " : "; _
                                .Fields(r).Value,
                Next r
                DoEvents
                Debug.Print
                .MoveNext
            Loop
        Else
            Debug.Print "Pas de lecture"
        End If
        .Close
    End With
    oConnexion.Close

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Salut Jack,

Merci de ta réponse, mais j'ai également essayé ADODB :

    Dim cnx As ADODB.Connection
    Set cnx = New ADODB.Connection
    
    cnx.Provider = "Microsoft.ACE.OLEDB.12.0"
    cnx.ConnectionString = "C:\chemin\matable.accdb"
    cnx.Open


Et j'obtiens exactement la même erreur (mais cette fois avec le code 80004005).

J'ai essayé en enlevant le chemin (car le fichier se trouve dans le même répertoire que le fichier Excel où tourne la macro) mais pour une raison inconnue, il va chercher dans c:\Users\moi\Documents qui doit être un répertoire par défaut... Du coup, je me demande aussi comment je vais pouvoir ouvrir le fichier dans le répertoire où tourne la macro, pour ne pas avoir à configurer le chemin sur chaque poste...

Merci,
Mark
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 août 2012 à 11:49
Parce que tu n'as pas respecté la syntaxe de la ConnectionString.
Relis-la, il manque des éléments.
0
Ta syntaxe est équivalente à la mienne.

Ce code ne marche pas mieux :

Dim cnx As ADODB.Connection
Set cnx = New ADODB.Connection

cnx.ConnectionString = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=C:\chemin\matable.accdb;" & _
    "Persist Security Info=False;"
cnx.Open


Est-ce qu'il y a un serveur Access" à lancer ou quoi que ce soit ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
21 août 2012 à 17:17
Bonjour,

Va voir là. Avec un peu de chance, tu vas pouvoir bâtir une chaîne de connexion qui marche.
0
Dans ton tuto, l'exemple en VBA part du principe qu'il existe une base de données "active" accessible via CurrentDb(). Je ne pense pas être dans ce cas, ma base est placée dans un fichier sur le disque...

Bon, j'ai découvert que l'origine du problème se situe dans le chemin. Pour une raison inconnue, si je place le fichier à la racine du C, j'arrive à l'ouvrir mais si je place le fichier dans autre chemin sur le disque, là il y a erreur. Donc j'ai mis la base sur le C pour avancer...

Mais maintenant, j'ai un nouveau problème : aucune requête SQL ne fonctionne. Bien entendu, je les ai testées sur la base Access et là c'est ok. Un simple "select *" sur une des tables de ma base ne fonctionne pas, le champ RecordCount du RecordSet vaut -1. Vraiment, c'est la merde tout ça...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 août 2012 à 20:29
L'orthographe de ton chemin/fichier a t-il quelque chose de particulier (série d'espaces, apostrophes ...) ?

Perso, je n'ai eu aucun mal à me connecter à ma base, mais Access est installé sur ma machine.
Est-ce ton cas aussi ?
(Access en version 2010 (14) en utilisant le moteur 12)

Tu as bien référencé le "Data Objects 2.8" ?
0
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
22 août 2012 à 08:31
Bonjour

J'ai trouvé ça :
http://support.microsoft.com/kb/467868/fr

bonne journée
0
@jack, le chemin et le nom de fichier n'ont aucun espace, ils sont absolument basiques. Ta question de savoir si Access est sur ma machine ou sur le réseau est pertinente. J'ai checké et tout est bien installé en local.

J'ai essayé Data Objects 2.8 et 6.1, mais j'obtiens la même erreur avec les deux (code 80004005).

@c148270, merci pour le lien. Voici la partie qui correspond à mon erreur :

Message d'erreur

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] '(unknown)' isn't a valid
path. Make sure that the path name is spelled correctly and that you are
connected to the server on which the file resides.

Cause

Le chemin lu par le serveur Web n'est pas valide. En général, cette
erreur se produit lorsque le Global.asa est utilisé et que la chaîne de
connexion a été créée sur un ordinateur autre que le serveur Web. Si le
chemin est une lettre de lecteur mappé, il est valide uniquement pour
l'ordinateur client sur lequel a été créée la chaîne de connexion.


Mais je n'utilise pas de serveur Web... J'essaie d'ouvrir une base de données locale à partir d'un programme VBA qui tourne également en local. Mon lecteur C est un disque dur local.
0
Ouh, il semble y avoir un GROS bug là... Regardez donc ce que j'ai découvert...

Voici mon code de test :
Dim chaine1 As String, chaine2 As String
    
chaine1 =  "C:\KGD\Outil\Tables.accdb"
chaine2 = Application.ThisWorkbook.Path & "\Tables.accdb"


En débuggant pas à pas, je vérifie bien que les 2 chaines sont strictement identiques. Apparemment, on ne peut pas uploader d'image, mais je peux vous envoyer une copie d'écran par MP pour vous le prouver.

Ensuite, si j'exécute le code suivant, j'obtiens l'erreur habituelle :

cnx.ConnectionString  = chaine1
cnx.Open


Mais si j'exécute celui-ci, ça passe !!!

cnx.ConnectionString = chaine2
cnx.Open


C'est à n'y rien comprendre... J'ai pensé aux caractères d'échappement ("") qui seraient mal gérés dans VBA mais au niveau du débuggueur (ou du Print), les chaines s'affichent parfaitement.

Bref, en utilisant le Path, ça fonctionne donc je vais partir là-dessus. Mais il faut que j'avance... Quelqu'un a une idée pour le problème SQL ? Parce que là je n'arrive à rien exécuter sur la base de données (voir 4 messages plus haut).
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 août 2012 à 12:01
Je te le répète, au cas où, ConnectionString n'est pas un paramètre dans laquelle on se contente de rentrer un chemin seul. Il y a des mots clés à ajouter.

Avant de vouloir faire une requète, il faut vérifier si .State est bien à adStateConnected.
Est-ce le cas ?

Il faut mettre la référence à Data Objects 2.8
Sans cela, les objets ADODB ne seront pas reconnus.

Si tu veux de l'aide, il faut montrer le code que tu utilises et, si possible, tenir compte des remarques que l'on te fait.
0
Bien entendu, j'ai rentré le provider aussi. Mais je crois que tu n'as pas compris le souci. Quel que soit le programme derrière, il se trouve que le comportement est différent avec 2 chaines identiques au débugage, c'est complètement fou ! Je discute avec un américain en ce moment qui a déjà eu ce problème apparemment... Encore un gros bug de VBA j'imagine.

Oui, j'utilise la référence Data Objects 2.8 et je ne le faisais pas, je ne pourrais même pas exécuter le code ! Donc ta remarque ne fait pas sens...

Dès que je me suis connecté, je vérifie que cnx.State est égal à adStateOpen avant d'exécuter la requête. Je n'ai pas d'erreur, juste que le RecordCount est égal à -1.

Je me disais, quand j'ouvre ma base de données avec Access, j'obtiens un avertissement de sécurité d'Office qui m'invite à activer le contenu si je veux accéder à la base. Est-ce que ce ne serait pas ça qui rende les requêtes inefficaces ? Comment indiquer via programme qu'on souhaite activer le contenu de la base, une fois connecté ?
0
C'est bon pour le problème de la requête, là ça venait de moi, j'avais laissé en commentaires la ligne

.CursorLocation = adUseClient


Et du coup, le RecordSet renvoyait -1, ce qui ne veut pas dire qu'il n'y a pas de résultats, juste que le serveur ne sait pas combien il y en a. Un MVP m'a expliqué ça sur un autre forum.

En revanche, le premier problème reste incompréhensible à mes yeux...
0
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
23 août 2012 à 08:37
Bonjour

Questions idiotes :

Lorsque tu change le chemin de connexion fait tu une mise à jour des liens?

Sur la nouvelle destination as-tu vérifié les droits d'accès ?

Bonne journée
0
Rejoignez-nous