Ms access Access VBA代码未将变量设置为查询值
我对VBA有点陌生,已经用它工作了2个月,但现在我被卡住了。我有一个访问代码,用于从一个包含小时记录的表中计算项目的总小时数。我的代码成功计算了3个类别的小时数,但没有计算最后两个类别的小时数。我从按项目汇总小时数的查询中提取值,并将其保存到变量中,然后用正确的值更新项目记录 更新:对于第四个检查,我使用select来查看它是否能以这种方式更好地工作,而不是使用if语句,它最初是一个if语句 非常感谢您的帮助 我的代码如下:Ms access Access VBA代码未将变量设置为查询值,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我对VBA有点陌生,已经用它工作了2个月,但现在我被卡住了。我有一个访问代码,用于从一个包含小时记录的表中计算项目的总小时数。我的代码成功计算了3个类别的小时数,但没有计算最后两个类别的小时数。我从按项目汇总小时数的查询中提取值,并将其保存到变量中,然后用正确的值更新项目记录 更新:对于第四个检查,我使用select来查看它是否能以这种方式更好地工作,而不是使用if语句,它最初是一个if语句 非常感谢您的帮助 我的代码如下: Dim First As Integer Dim Second As
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]但未能将值传递给第四和第五。我有一个测试记录,它有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
保存聚合数据通常是不必要的,而且设计很差。在需要时计算聚合数据 单个查询应该能够计算所有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 & "'"
不是解决办法,而是一句话。您正在使用重复代码,按类别计算。这应该是一个危险信号,表明你的方法是错误的。考虑有150个类别…一个简单的查询就足够了。为什么要保存聚合数据,而不只是在需要时进行计算?为什么要将第四个的代码更改为使用Select Case?应该是
选择Case rs.NoMatch
然后在第四个中使用IF,就像在其他的中一样。类似于如果rs.NoMatch则第四个=0,否则第四个=(rs![SumOfHours])
和一个建议。为什么要使用这么多记录集?如果您只是在特定记录中查找一个值,那么Dlookup可能会帮助您。我使用不同记录集的原因是,我需要它为同一个项目累计多个小时。我有一个项目表和一个小时表,每个项目在小时表中有多个小时条目,我想把这些小时的总和转移到项目表中。