Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access VBA代码未将变量设置为查询值_Ms Access_Vba_Ms Access 2010 - Fatal编程技术网

Ms access Access VBA代码未将变量设置为查询值

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

我对VBA有点陌生,已经用它工作了2个月,但现在我被卡住了。我有一个访问代码,用于从一个包含小时记录的表中计算项目的总小时数。我的代码成功计算了3个类别的小时数,但没有计算最后两个类别的小时数。我从按项目汇总小时数的查询中提取值,并将其保存到变量中,然后用正确的值更新项目记录

更新:对于第四个检查,我使用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]但未能将值传递给第四和第五。我有一个测试记录,它有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可能会帮助您。我使用不同记录集的原因是,我需要它为同一个项目累计多个小时。我有一个项目表和一个小时表,每个项目在小时表中有多个小时条目,我想把这些小时的总和转移到项目表中。