为什么运行时错误'3061'。参数太少。预计1?访问2010

时间:2015-04-21 15:58:12

标签: ms-access access-vba ms-access-2010

我已经研究了所有STACKOVERFLOW问题,但无法使其发挥作用。我有一张简单的表格:

enter image description here

表格:

enter image description here

我想从表格中提取字段T:ActityRoster和“活动日期”,并将它们“添加”到表格T:ActivityHistory。

enter image description here

STACKOVERFLOW专家帮我提供了一些代码,但它甚至没有设置第一个记录集:rsIn

Dim ActID As Integer, actDate As Date, val1 As Long, val2 As Long, val3 As Boolean, val4 As Currency

Dim db As Database, rsIn As Recordset, rsOut As Recordset

Dim strSQL As String

Set db = CurrentDb

ActID = Me.cboActivityName.Column(0)

strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"

Debug.Print strSQL

Set rsIn = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)

rsIn.MoveLast

Set rsOut = db.OpenRecordset("T:AttendanceHistory", dbOpenDynaset, dbEditAdd)

rsOut.MoveLast

actDate = Me.ActivityDate.Value  ' retrive the date from the form

With rsIn
    .MoveFirst
    Do
    val1 = !ActivityID
    val2 = !MemberID
    val3 = !Attended
    val4 = !AmtSpent

           With rsOut
               .AddNew
               !ActivityDate = actDate
               !ActivityID = val1
               !MemberID = val2
               !Attended = val3
               !AmtSpent = val4
               .Update
           End With

    .MoveNext
    Loop Until .EOF
    .Close

End With

rsOut.Close
Set rsIn = Nothing
Set rsOut = Nothing
Set db = Nothing

End Sub

我已经验证所有字段名称都是正确的,并且是一致的数据类型。当我将查询重新放入Access时,它会给出预期的结果。

3 个答案:

答案 0 :(得分:4)

SELECT语句包含VBA变量的名称( ActID ):

strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"

不幸的是,db引擎对该变量一无所知。因此,当它看到 ActID 时,它假定这是您没有提供值的参数的名称。

在构建SELECT语句时包含变量的值而不是其名称。使用以下两个示例之一:第一个if [ActivityID]是text数据类型;或者第二个,如果是数值数据类型:

strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = '" & ActID & "'"
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = " & ActID

我将表名括在方括号中,因为该名称包含标点符号。但是,如果可能的话,我会重命名表。 T:AttendanceHistory 相同。选择不包含标点符号和空格且与VBA或SQL关键字不匹配的对象名称。

或者,您可以使用参数查询并使用 ActID 提供参数值:

strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = [which_ActivityID]"
Dim qdf As DAO.QueryDef
Set qdf = db.CreateQueryDef(vbNullString, strSQL)
qdf.Parameters("which_ActivityID").Value = ActID
Set rsIn = qdf.OpenRecordset(dbOpenSnapshot)

答案 1 :(得分:0)

我的来源是一个查询,它在引用表单上的字段时有标准。摆脱了这一切,现在一切都好。查询中的所有字段都是正确的名称等。

答案 2 :(得分:0)

有点旧,但我今天遇到了这个问题并需要一个不同的解决方案。所以希望这有助于将来遇到这种情况的任何人。

当我创建新查询并尝试在VBA中引用它时,我弹出了此错误:

Set rst = CurrentDb.OpenRecordset("SELECT * FROM qry_New WHERE [Field]='" & [RptField] & "'")

编译项目似乎解决了错误。 调试>在VB编辑器中编译[项目名称]

这也是Access 2013,而不是Access 2010,所以我不确定它是否适用于这种情况。