2008-11-14 12 views
0

Quelqu'un peut-il me donner des détails sur l'erreur d'exécution 3734 dans Access vba? Pour référence, je reçois à partir d'un code dans le fil suivantaccess vba: Erreur d'exécution 3734

How to run a loop of queries in access?

Sub plausibt_check() 

Dim rs As DAO.Recordset 
Dim rs2 As ADODB.Recordset 
Dim db As database 
Dim strsql As String 
Dim tdf As TableDef 




Set db = opendatabase("C:\Codebook.mdb") 
Set rs = db.OpenRecordset("querycrit") 

Set rs2 = CreateObject("ADODB.Recordset") 
rs2.ActiveConnection = CurrentProject.Connection 


For Each tdf In CurrentDb.TableDefs ' in this line the error occurs 
+0

Publiez le code qui provoque l'erreur. – xsl

Répondre

0

Il semble que vous utilisez ADO dans la base de données actuelle sans enregistrer. Vous devez enregistrer avant d'exécuter le code qui contient ADO.

1

Je ne comprends pas ce que vous essayez de faire. Pourquoi utilisez-vous un jeu d'enregistrements DAO et un ADO? Cela n'a aucun sens du tout. Si vous avez enregistré des requêtes dans un frontal Access, alors même si votre back-end est, disons, SQL Server avec des liens de table ODBC, il n'y a vraiment aucune utilité à utiliser ADO.

Il n'y a aucune preuve d'une boucle dans votre code, donc à moins que votre code ne soit appelé par une boucle, il ne me semble pas que l'explication de l'article de la BC s'appliquerait. Je ne sais pas ce que vous voulez faire, mais le point sur l'ouverture de votre base de données une fois, plutôt que dans chaque répétition de votre boucle, devrait être assez évident pour quiconque y réfléchit. Si vous exécutez une boucle et que vous ouvrez plusieurs fois la même base de données à chaque répétition de la boucle, il est évident que l'opération appartient à la boucle.

Ce serait quelque chose comme ceci:

Dim db As DAO.Database 
    Dim qdf As DAO.QueryDef 

    Set db = CurrentDB() 

    For Each qdf in db.QueryDef 
    [do whatever here] 
    Next qdf 

    Set qdf = Nothing 
    Set db = Nothing 

Dans ce code, vous utilisez le MDB actuellement ouvert dans l'interface utilisateur, mais il n'a pas d'importance - quelle que soit la base de données que vous ouvrez et en boucle à travers ses objets ne devrait être ouvert qu'une seule fois, en dehors de la boucle.

Si vous souhaitez que votre boucle se trouve dans un sous-programme appelé à partir de votre code principal, transmettez la variable de base de données en tant qu'argument à votre sous-routine. Le sous-programme serait quelque chose comme ceci:

Public Sub ProcessQueries(db As DAO.Database) 
    Dim qdf As DAO.QueryDef 

    For Each qdf in db.QueryDef 
     [do whatever here] 
    Next qdf 

    Set qdf = Nothing 
    End Sub 

Et vous appelez cela ainsi:

Dim db As DAO.Database 

    Set db = CurrentDB()  
    Call ProcessQueries(db)  
    Set db = Nothing 

Maintenant, si vous insistez pour obtenir des données sources de DAO et puis en faisant quelque chose avec lui via ADO, vous Avoir une boucle DAO et à l'intérieur, et boucle ADO. À cause de cela, vous voudriez définir votre connexion ADO en dehors de votre boucle DAO, plutôt qu'à l'intérieur. La seule exception à cela serait que les données que vous extrayez de votre boucle DAO définissent la base de données que vous ouvrez avec ADO. Comme nous ne savons pas ce que vous essayez réellement d'accomplir, il est pratiquement impossible de donner de bons conseils sur ce que vous devriez changer dans votre code.

+0

Il peut parfois être utile d'utiliser des schémas ADO. – Fionnuala

+0

Je ne dis pas qu'ADO n'est jamais utile. En effet, il y a environ 6 choses que ADO peut faire avec Jet 4 que DAO ne peut pas (parce que MS a délibérément décidé de le laisser de côté quand ils déprécient DAO en faveur d'ADO, maintenant ils ont retourné). Mais pour les opérations de jeu d'enregistrements de base, je ne vois aucune utilité dans ADO sur DAO –

Questions connexes