我是VBA的新手,已经和它一起工作了2个月,但我现在被困了。我有一个访问代码,用于从包含小时记录的表中计算项目的总小时数。我的代码成功计算了3个类别的小时数,但不计算最后两个类别我从按项目总计小时的查询中提取值并将其保存到变量,然后使用正确的值更新我的项目记录。
更新:对于第4次检查我使用select来查看它是否会更好地工作而不是使用IF语句,它最初是一个if语句。
非常感谢任何帮助。
我的代码如下:
Dim First As Integer
Dim Second As Integer
Dim Third As Integer
Dim Fourth As Integer
Dim Fifth As Integer
Set db = CurrentDb
Set rs = db.OpenRecordset("qryHermosaPCHoursSum1st", dbOpenDynaset, dbSeeChanges)
rs.FindNext "PlanCheck Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
If rs.NoMatch Then
First = 0
Else
First = (rs![SumOfHours])
End If
Set rs = db.OpenRecordset("qryHermosaPCHoursSum2nd", dbOpenDynaset, dbSeeChanges)
rs.FindNext "PlanCheck Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
If rs.NoMatch Then
Second = 0
Else
Second = (rs![SumOfHours])
End If
Set rs = db.OpenRecordset("qryHermosaPCHoursSum3rd", dbOpenDynaset, dbSeeChanges)
rs.FindNext "PlanCheck Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
If rs.NoMatch Then
Third = 0
Else
Third = (rs![SumOfHours])
End If
到这里工作正常。
Set rs = db.OpenRecordset("qryHermosaPCHoursSum4th", dbOpenDynaset, dbSeeChanges)
rs.FindNext "PlanCheck Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
Select Case True
Case rs.NoMatch
Fourth = 0
Case Else
Fourth = (rs![SumOfHours])
End Select
当我逐行运行代码时,它似乎正确地获取了rs![SumOfHours]的值,但未能将值传递给Fourth和Fifth。我有一个测试记录,它有15个匹配小时,查询正确总和,但代码将其保留为零。
Set rs = db.OpenRecordset("qryHermosaPCHoursSum5th", dbOpenDynaset, dbSeeChanges)
rs.FindNext "PlanCheck Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
If rs.NoMatch Then
Fifth = 0
Else
Fifth = (rs![SumOfHours])
End If
Set rs = db.OpenRecordset("tblHermosaBeachPC", dbOpenDynaset, dbSeeChanges)
rs.FindNext "ID Like " _
& Chr(34) & "*" & Me.PlanCheck & "*" & Chr(34)
rs.Edit
rs![1stSetHours] = First
rs![2ndSetHours] = Second
rs![3rdSetHours] = Third
rs![4thSetHours] = Fourth
rs![5thSetHours] = Fifth
rs.Update
答案 0 :(得分:1)
保存汇总数据通常是不必要的,而且设计不佳。需要时计算汇总数据。
单个查询应该能够计算所有5个聚合值,然后单个记录集可以检索字段。为什么使用通配符而不是=?
Set rs = db.OpenRecordset("SELECT * FROM qryHermosaPCHoursSum WHERE PlanCheck = '" & Me.PlanCheck & "'", dbOpenDynaset, dbSeeChanges)
If Not rs.EOF Then
Set rsDest = db.OpenRecordset("SELECT * FROM tblHermosaBeachPC WHERE PlanCheck = '" & Me.PlanCheck & "'", dbOpenDynaset, dbSeeChanges)
rsDest.Edit
rsDest![1stSetHours] = rs!First
rsDest![2ndSetHours] = rs!Second
rsDest![3rdSetHours] = rs!Third
rsDest![4thSetHours] = rs!Fourth
rsDest![5thSetHours] = rs!Fifth
rsDest.Update
End If
或者代替rsDest记录集对象:
CurrentDb.Execute "UPDATE tblHermosaBeachPC SET 1stSetHours=" & rs!First & _
", 2ndSetHours=" & rs!Second & ", 3rdSetHours=" & rs!Third & _
", 4thSetHours=" & rs!Fourth & ", 5thSetHours=" & rs!Fifth & _
" WHERE PlanCheck = '" & Me.PlanCheck & "'"