Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

我窗体里这段VBA 为啥出错,总是提取数据不符

阿祺  发表于:2021-03-26 11:43:40  
复制

代码在form1里,代码的目的是做个计算,点击按钮

 

数据来自查询"Eligible",(共三列,ID,MADays, Score,表是按Score从大到小排列).

 

另有一个benchmark的查询,里边是预定值

 

我想在VBA里做的计算是从上到下累加查询里 MADays 这一列(按Score 从高到低排列顺序),当总和数大于benchmark查询里benchmark这个值时,停止累加. 这时算出一共有多少的ID(就是多少个行数,在这个查询里,加到第59行时,总值大于预定值,停止累加)59个ID作为count值,显示在窗体里,MADays累加值也显示在窗体里。

 

 

正确计算是,加到第59行退出,这时累加值刚好大于预定值。虽然代码显示的计算值也达到了要求,但它的累加顺序是错的。它只加了58行,窗体里 count 那个值。我用Excel做了一遍累加,把Excel 也附上了。

 

不知道为什么它没按设计的方法去累加,只能求助高人了


请看附件


点击下载此附件

 

Top
vious 发表于:2021-03-26 13:30:16

数据集并没有按SQL预期内容打开,估计是使用ADODB.Recordset的原因,更改为以下后正常

Sub Update()
'Dim rst As New ADODB.Recordset,
Dim FNum As Double, FSumNum As Double, FCount As Long, FMaxP As Double, FTdays As Long, FBudget As Long
Dim HiPay As Double, Lopay As Double, FPitDiff As Double, FRange As Double, FPercent As Double, FCoutoff As Double, FWscores As Double

    FNum = DLookup("Benchmark", "Benchmark")
    FTdays = DLookup("Totaldays", "Benchmark")
    FMaxP = DLookup("MaxPoint", "Benchmark")
    FBudget = DLookup("Budget", "variables")
    FPercent = DLookup("HiUp", "variables")
   
    Dim rst As Object
    Dim strsql As String
    Dim i As Integer
    strsql = "SELECT MADays, Score FROM Eligible order by Score DESC"
    Set rst = CurrentDb.OpenRecordset(strsql, 2)
       
    With rst
       ' .ActiveConnection = CurrentProject.Connection
       ' .CursorType = adOpenStatic
       ' .LockType = adLockOptimistic
       ' .Source = "SELECT MADays, Score FROM Eligible order by Score DESC"
       ' .Open
        Do Until .EOF
        FMaxP = .Fields("MADays")
        FSumNum = FSumNum + .Fields("MADays")
            FWscores = FWscores + .Fields("Score") * .Fields("MADays")
           i = i + 1
         
            If FSumNum > FNum Then
                FCount = .AbsolutePosition
                FCutOff = .Fields("Score")
                FRange = FMaxP - FCutOff
                FPitDiff = FSumNum + (FWscores - FCutOff * FSumNum) / FRange
                Lopay = Round(FBudget / FPitDiff, 2)
                HiPay = Round(Lopay * FPercent, 2)
                Exit Do
            End If
              .MoveNext
        Loop
    End With
    With Me
        .Text0 = FNum
        .Text2 = FMaxP
        .Text5 = FBudget
         .Text7 = FPercent
       ' .Text9 = FCount
        .Text21 = FSumNum
        .Text15 = Format(Lopay, "0.00")
        .Text17 = Format(HiPay, "0.00")
        .Text11 = FCutOff
        .Text9 = i
    End With

End Sub



唐家齐 发表于:2021-03-27 10:26:55

谢谢老师,现在计算正确了。但有一处不懂


 Do Until .EOF
        FMaxP = .Fields("MADays") 


FMaxP 是score里的最大值,为什么要设为等于MADays?



猿代码 发表于:2021-03-27 10:53:22
跟楼上的大师学习

vious 发表于:2021-03-27 11:13:25
测试读取数据用的,没有注释掉而已,没有疑问后请结贴,这是一个美德。

唐家齐 发表于:2021-03-27 11:25:56
怎么结贴?问题解觉了,谢谢老师 
     

vious 发表于:2021-03-27 11:38:51
找到你满意的回帖,设为最佳

总记录:6篇  页次:1/1 9 1 :