2016-10-10 77 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