office交流网--QQ交流群号

Access培训群:792054000         Excel免费交流群群:686050929          Outlook交流群:221378704    

Word交流群:218156588             PPT交流群:324131555

大量数据处理里使用进度条显示进度,但如何避免进度条拖慢处理时间呢

2020-01-03 08:00:00
zstmtony
原创
4432

最近帮一个客户在处理一个业务时,因为处理时间长,为了避免客户焦虑等待,在处理过程中添加了进度条,但因为记录数特别多,达几十万,增加进度条显示后,会导致处理时间成倍增加。拖慢了处理的速度,反而背离了之前的初衷。所以在显示进度条时想了一个办法,不是每条都刷新进度条,而是以一定的间隔如100 1000 10000 这样的等级间隔来刷新进度条,数据量越大,间隔长度越长,这样就在处理时间及显示进度条之间取得一个平衡,既显示了进度,但不会拖慢整个处理时间。





Public Sub 生成3个号和值振幅表()
    Dim rst         As Object           '子窗体记录集
    Dim rstTmp         As Object           '子窗体记录集
    Dim He123, He124, He125, He234, He235, He345, He134, He135, He145, He245 As Integer
    
    Set rstTmp = CurrentDb.OpenRecordset("TMP_tbl最后一期数据表", dbOpenDynaset)
        rstTmp.MoveFirst
        '把当前记录的数据保存在变量,用于计算所有组合的振幅
        He123 = rstTmp![123和]
        He124 = rstTmp![124和]
        He125 = rstTmp![125和]
        He234 = rstTmp![234和]
        He235 = rstTmp![235和]
        He345 = rstTmp![345和]
        He134 = rstTmp![134和]
        He135 = rstTmp![135和]
        He145 = rstTmp![145和]
        He245 = rstTmp![245和]
    rstTmp.Close
    Set rstTmp = Nothing
    
    
    
        
    CurrentDb.Execute "delete * from tbl3个号和值振幅表"
    
    Set rst = CurrentDb.OpenRecordset("tbl3个号和值振幅表", dbOpenDynaset)
    Set rstTmp = CurrentDb.OpenRecordset("tbl3个号和库", dbOpenDynaset)
    If rstTmp.RecordCount = 0 Then Exit Sub
    
    
    
    
    
    
    '初始化进度条
    '记录集先移到最后,以避免总条数取不对
    rstTmp.MoveLast
    rstTmp.MoveFirst Dim lngCnt As Long
    Dim i As Long
    lngCnt = rstTmp.RecordCount  '取记录的总数
    Dim clsProgress As New clsSysProgress
    Dim lngSplit As Long
    
    lngSplit = Int(lngCnt / 100)
    If lngSplit <= 0 Then lngSplit = 1

    clsProgress.gintStep = 1
    clsProgress.gintLong = lngCnt
    clsProgress.gintTime = 20
    clsProgress.gf_ChangeText "准备生成3个号和值振幅表 ..."
    clsProgress.gf_Show PM_Wait Do Until rstTmp.EOF
    
        '记录数比较大时,则隔一段时间才更新进度条,而不是每条都更新进度条,大大加快速度
        i = i + 1
        If i Mod lngSplit = 0 Or i = lngCnt Then
            clsProgress.gf_ChangeText "正在生成3个号和值振幅表-- 第" & i & "条/共" & lngCnt & "条 ..."
            clsProgress.gf_SetStep i
            DoEvents
        End If
        
        
        rst.AddNew
        rst!组合ID = rstTmp!组合ID
        rst!组合 = rstTmp!组合
        
        rst![123振幅] = Abs(rstTmp![123和] - He123)
        rst![124振幅] = Abs(rstTmp![124和] - He124)
        rst![125振幅] = Abs(rstTmp![125和] - He125)
        rst![234振幅] = Abs(rstTmp![234和] - He234)
        rst![235振幅] = Abs(rstTmp![235和] - He235)
        rst![345振幅] = Abs(rstTmp![345和] - He345)
        rst![134振幅] = Abs(rstTmp![134和] - He134)
        rst![135振幅] = Abs(rstTmp![135和] - He135)
        rst![145振幅] = Abs(rstTmp![145和] - He145)
        rst![245振幅] = Abs(rstTmp![245和] - He245)
        
        rst.Update
        rstTmp.MoveNext
    Loop
    
    '关闭进度条 处理完成
    clsProgress.gf_ChangeText "3个号和值振幅表 处理完成!"  '完成
    Set clsProgress = Nothing
 
 
    
    rst.Close
    rstTmp.Close
    Set rst = Nothing
    Set rstTmp = Nothing
分享