通过宏插入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
我有两个问题,使用此功能:
- 方法.AddNew为rstBooks不工作 - MS Access显示错误438(“对象不支持此属性或方法”)的消息;
- 此外,我不能将变量rstBALink分配给记录集,因为编译器显示“无效的属性使用”。
所以我的问题是这样的:我该如何解决这两个问题?我做错了,我的功能不能正常工作?
答
我看到的代码存在一些问题。这些可能会或可能不会解决您的问题。
您的声明是隐含的,这意味着您没有关于您的记录集对象的具体内容。而不是使用:
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')
非常感谢您!现在我已经完成了任务,所以我可以走得更远。 :-)要说“set”命令,错过它是我的错误,但我很惊讶VBA不喜欢当一次声明所有相同类型的变量时。 – PiggyInTheMirror
VBA仍然会将变量创建为变体,如果使用Set,它可以转换为记录集对象(因为您没有使用Set关键字,所以这不起作用)。然而,显式声明阻止编译器在中途转换类型的额外步骤,并且在排除有问题的代码时很方便。出于这些原因明确使用它们也是很好的做法。你仍然可以在同一行输入它们,但它不会使用最终的'As Type'并将其应用于该行上的所有声明变量。真高兴你做到了! – MoondogsMaDawg