在MS Access中编译VBA代码中的错误

时间:2010-09-15 12:30:03

标签: ms-access vba compilation access-vba

我在访问中有以下功能,它运行得相当好。但现在我突然开始出现编译错误:找不到方法或数据成员

Function Serialize(qryname As String, keyname As String, keyvalue) As Long
Dim dbs As Database
Dim rs As Recordset

Set dbs = CurrentDb
On Error GoTo Err_Serialize
Set rs = dbs.OpenRecordset(qryname, dbOpenDynaset, dbReadOnly)


   On Error GoTo Err_Serialize

     'Find the current record.'
     Select Case rs.Fields(keyname).Type
        ' Find using numeric data type key value?'
        Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
        DB_DOUBLE, DB_BYTE
           rs.FindFirst "[" & keyname & "] = " & keyvalue
        ' Find using date data type key value?'
        Case DB_DATE
           rs.FindFirst "[" & keyname & "] = #" & keyvalue & "#"
        ' Find using text data type key value?'
        Case DB_TEXT
           rs.FindFirst "[" & keyname & "] = '" & keyvalue & "'"
        Case Else
           MsgBox "ERROR: Invalid key field data type!"

     End Select

    Serialize = Nz(rs.AbsolutePosition, 0) + 1


Err_Serialize:
        'Add your own Error handler'
        rs.Close
        dbs.Close
        Set rs = Nothing
        Set dbs = Nothing

End Function

错误突出显示rs.Findfirst

这是一个错误吗?

2 个答案:

答案 0 :(得分:3)

尝试:

Dim rs As DAO.Recordset

如果无法编译,请确保您仍然引用Microsoft DAO x.x对象库。

答案 1 :(得分:2)

Access,DAO(本机库)和ADO中有两个可能的数据接口库,两者都有Recordset对象。只有DAO有一个FindFirst方法 - 在ADO中,它是Find。正如@Remou在他的回答中指出的那样,你可以指定库并避免歧义。

在大多数情况下,没有理由考虑使用除DAO之外的任何东西作为Access应用程序(MDB / ACCDB)中的默认界面。当然,对于ADP,ADO是唯一的选择(因为ADP是无喷射的)。

对于你的代码,你明显使用DAO(因为你使用的数据库变量,在ADO中不存在 - 你使用连接对象),所以你可能有错误的引用(ADO或者你同时拥有ADO和DAO,它们首先是ADO的顺序。

一般来说,几乎从来没有一种情况,在我看来,两种参考都是合适的 - 它只是让一切变得更难。 ADO可以在没有引用的情况下使用(也可以使用DAO),但它涉及对象变量的弱类型和对它们的Intellisense丢失。通常的做法是主要使用DAO,并且可能会偶尔使用DAO来处理DAO所缺少的东西(或者比ADO效率低一些)。对于偶尔的ADO需求,您可以使用CurrentProject.Connection对象并将变量键入为对象,并且完全不使用ADO引用。