我已经研究了所有STACKOVERFLOW问题,但无法使其发挥作用。我有一张简单的表格:
表格:
我想从表格中提取字段T:ActityRoster和“活动日期”,并将它们“添加”到表格T:ActivityHistory。
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时,它会给出预期的结果。
答案 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,所以我不确定它是否适用于这种情况。