在這一刻,我正在學習在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
我有兩個問題,使用此功能:
- 方法.AddNew爲rstBooks不工作 - MS Access顯示錯誤438(「對象不支持此屬性或方法」)的消息;
- 此外,我不能將變量rstBALink分配給記錄集,因爲編譯器顯示「無效的屬性使用」。
所以我的問題是這樣的:我該如何解決這兩個問題?我做錯了,我的功能不能正常工作?
非常感謝您!現在我已經完成了任務,所以我可以走得更遠。 :-)要說「set」命令,錯過它是我的錯誤,但我很驚訝VBA不喜歡當一次聲明所有相同類型的變量時。 – PiggyInTheMirror
VBA仍然會將變量創建爲變體,如果使用Set,它可以轉換爲記錄集對象(因爲您沒有使用Set關鍵字,所以這不起作用)。然而,顯式聲明阻止編譯器在中途轉換類型的額外步驟,並且在排除有問題的代碼時很方便。出於這些原因明確使用它們也是很好的做法。你仍然可以在同一行輸入它們,但它不會使用最終的'As Type'並將其應用於該行上的所有聲明變量。真高興你做到了! – MoondogsMaDawg