Access VBA: Erreur lors de la déclaration du type d'un objet de Base de données: type défini par l'Utilisateur n'est pas défini

Dans Access 2010 VBA, si je lance ce sujet:

sub test

    Dim db
    Dim rst

    Set db = CurrentDb()
    Set rst = db.OpenRecordset("select * from mytable")

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub

puis il montre (dans le "Immédiats" du panneau):

db:  Database
rst: Recordset2

de sorte qu'il fonctionne, et de toutes les bibliothèques sont installées correctement (ADO par exemple).

Ok, maintenant, je veux déclarer explicitement les types de variables, en utilisant les types qui ont été montré ("Base de données" et "Recordset2"), j'ai donc modifier le sous de cette façon:

sub test

    Dim db   as Database        ' explicitly
    Dim rst  as Recordset2      ' explicitly

    Set db = CurrentDb()
    Set rst = db.OpenRecordset("select * from mytable")

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub

et quand je le lance, j'obtiens l'erreur suivante à la ligne "Dim db as Database":

Compilation error:
User defined type is not defined

Donc, je comprends que le type "Base de données" n'est pas définie (!). Pourquoi?

Remarque: j'ai aussi essayé:

Dim db   as ADO.Database        ' explicitly
Dim rst  as ADO.Recordset2      ' explicitly

et:

Dim db   as ADODB.Database      ' explicitly
Dim rst  as ADODB.Recordset2    ' explicitly

et:

Dim db   as DAO.Database        ' explicitly
Dim rst  as DAO.Recordset2      ' explicitly

et a obtenu le même erreur qu'avec eux. Comment est-il possible? Pourquoi ça fonctionne si je n'ai pas déclarer le type?


Modifier: je viens de découvrir que l'Accès propose également une ADODB.Objet de connexion pour la base de données actuelle, en appelant à "CurrentProject.Connexion". Donc, je peux déclarer explicitement:

sub test

    Dim db As ADODB.Connection
    Set db = CurrentProject.Connection      ' Access gives an ADODB object too!

    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.Open "select * from mytable", db

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub

qui montre:

db:  Connection
rst: Recordset

Donc je vais l'utiliser car ADO est plus moderne que DAO.

OriginalL'auteur freesoft | 2014-02-24