2008-11-14 82 views
0

任何人都可以給我詳細的Access vba運行時錯誤3734。 作爲參考我在下面的線程訪問vba:運行時錯誤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

發佈導致錯誤的代碼。 – xsl 2008-11-14 11:45:15

回答

0

得到它從代碼看來,你是在當前數據庫中使用ADO,但不保存。運行包含ADO的代碼之前,您必須保存。

1

我不明白你要做什麼。你爲什麼使用一個DAO記錄集和一個ADO?這完全沒有意義。如果您已將查詢保存在Access前端,那麼即使您的後端是帶有ODBC錶鏈接的SQL Server,但使用ADO實際上也沒有任何實用性。

在代碼中沒有循環的證據,所以除非您的代碼被循環調用,否則在我看來,KB文章的解釋不適用。

我不知道你想要做什麼,但是關於打開你的數據庫一次而不是循環的每次重複,這點對任何想到它的人來說都是非常明顯的。如果你正在運行一個循環,並且在循環的每次重複中反覆打開同一個數據庫,那麼顯然該操作屬於循環之外。

這將是這樣的:

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 

在該代碼中,您使用的MDB目前在用戶界面中打開,但它並不重要 - 無論數據庫你打開和循環遍歷它的對象只能在循環外打開一次。

如果您希望讓循環處於從主代碼調用的子例程中,請將數據庫變量作爲參數傳遞給子例程。子程序會是這樣的:

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 

而且你會認爲這樣呼籲:

Dim db As DAO.Database 

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

現在,如果你堅持要由DAO源數據,然後通過ADO做有它的東西,你有一個DAO循環,裏面和ADO循環。因此,您希望在您的DAO循環之外定義ADO連接,而不是在其內部。唯一的例外是,如果您從DAO循環中提取的數據定義了您使用ADO打開的數據庫。由於我們不知道你實際上想要完成什麼,所以幾乎不可能就你的代碼中應該改變的內容提供很好的建議。

+0

使用ADO模式有時會很有用。 – Fionnuala 2008-11-16 20:49:53