2016-10-10 76 views
0

晚上好!通過宏插入MS Access中的記錄

在這一刻,我正在學習在MS Access中工作的目的。我對該程序的基礎知識有了一些瞭解,例如創建表格或製作簡單的表格(儘管還沒有理想地工作),到現在爲止我一直在解決以下任務。

我有一個數據庫BooksDatabase,它由三個表:書籍作者AuthorsInfo。第一個包含關於書籍(姓名,流派,國家,發行年份等)的信息,第三個關於作者(名,姓等),第二個將有史以來的書與其作者聯繫起來。任務是將數據從文本文件導入到這些表中,以便它幾乎是自動的。我知道如何將文件導入到MS Access(至少是* .txt擴展名),我在表BooksToImport中這樣做,但我在插入導入的數據時遇到了一些困難。這裏是我的功能ImportBooks(),這是我從同一個名字的宏執行的代碼:

' Procedure which imports data about books from the table BooksToImport 
Function ImportBooks() 
Dim dbBooks As Database 
Dim rstImBooks, rstBooks, rstAuthors, rstBALink As DAO.Recordset 
Dim codeI, codeB, codeA, codeL As Variant 
'initializing database 
Set dbBooks = CurrentDb 
Set rstImBooks = dbBooks.OpenRecordset("Query_BooksToImport",dbOpenDynaset) 'receiving data from query 
'checking if the query has any records 
If rstImBooks.RecordCount = 0 Then 
    MsgBox "There are no records for importing!", vbInformation, "Attention!" 
    rstImBooks.Close 
    Set dbBooks = Nothing 
    Exit Function 
End If 
'if it's OK, we're making a loop on query's records 
rstBooks = dbBooks.OpenRecordset("Books",dbOpenDynaset) 
rstAuthors = dbBooks.OpenRecordset("AuthorsInfo",dbOpenDynaset) 
rstBALink = dbBoks.OpenRecordset("Authors",dbOpenDynaset) 
rstImBooks.MoveLast 
rstImBooks.MoveFirst 
Do While rstImBooks.EOF = False 
    'checking if there is a book in out database with the same name as in imported data 
    codeB = DLookup("[ID]","[Books]","[BookName] = '" & rstImBooks![BookName] & "'") 
    If IsNull(codeB) Then 
    'inserting new record 
    With rstBooks 
    .AddNew 
    ![BookName] = rstImBooks![BookName] 
    .Update 
    .Bookmark = .LastModified 
    codeB = ![ID] 
    End With 
    End If 
    'in much the same way we're treating the data about authors and making the links 
    rstImBooks.MoveNext 
Loop 
rstImBooks.Close 
rstBooks.Close 
rstAuthors.Close 
rstBALink.Close 
Set dbBooks = Nothing 
End Function 

我有兩個問題,使用此功能:

  1. 方法.AddNewrstBooks不工作 - MS Access顯示錯誤438(「對象不支持此屬性或方法」)的消息;
  2. 此外,我不能將變量rstBALink分配給記錄集,因爲編譯器顯示「無效的屬性使用」。

所以我的問題是這樣的:我該如何解決這兩個問題?我做錯了,我的功能不能正常工作?

回答

1

我看到的代碼存在一些問題。這些可能會或可能不會解決您的問題。

您的聲明是隱含的,這意味着您沒有關於您的記錄集對象的具體內容。而不是使用:

Dim rstImBooks, rstBooks, rstAuthors, rstBALink As DAO.Recordset 

嘗試:

Dim rstImBooks As DAO.Recordset 
Dim rstBooks As DAO.Recordset 
Dim rstAuthors As DAO.Recordset 
Dim rstBALink As DAO.Recordset 

你可以把他們都在用逗號分隔的一個行,但你仍然需要聲明的每個或Access類型將假定它是一個變體。

其次,記錄集對象需要使用Set關鍵字創建,而不是單獨使用=

這是在你的代碼的頂部做得正確,但不正確的位置:

rstBooks = dbBooks.OpenRecordset("Books",dbOpenDynaset) 
rstAuthors = dbBooks.OpenRecordset("AuthorsInfo",dbOpenDynaset) 
rstBALink = dbBoks.OpenRecordset("Authors",dbOpenDynaset) 

應該是:

Set rstBooks = dbBooks.OpenRecordset("Books",dbOpenDynaset) 
Set rstAuthors = dbBooks.OpenRecordset("AuthorsInfo",dbOpenDynaset) 
Set rstBALink = dbBooks.OpenRecordset("Authors",dbOpenDynaset) 

我認爲這將解決你的問題,但我沒有」不要回顧你的代碼的每一行。讓我知道你是否仍然有問題。

編輯: 發現一個錯字:

rstBALink = dbBoks.OpenRecordset("Authors",dbOpenDynaset) 

應該是:

Set rstBALink = dbBooks.OpenRecordset("Authors",dbOpenDynaset) 

(錯過dbBooks一個 'O')

+0

非常感謝您!現在我已經完成了任務,所以我可以走得更遠。 :-)要說「set」命令,錯過它是我的錯誤,但我很驚訝VBA不喜歡當一次聲明所有相同類型的變量時。 – PiggyInTheMirror

+0

VBA仍然會將變量創建爲變體,如果使用Set,它可以轉換爲記錄集對象(因爲您沒有使用Set關鍵字,所以這不起作用)。然而,顯式聲明阻止編譯器在中途轉換類型的額外步驟,並且在排除有問題的代碼時很方便。出於這些原因明確使用它們也是很好的做法。你仍然可以在同一行輸入它們,但它不會使用最終的'As Type'並將其應用於該行上的所有聲明變量。真高興你做到了! – MoondogsMaDawg