office交流網--QQ交流群號

Access培訓群:792054000         Excel免費交流群群:686050929          Outlook交流群:221378704    

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

大量數據處理裡使用進度條顯示進度,但如何避免進度條拖慢處理時間呢

2020-01-03 08:00:00
zstmtony
原創
4055

最近幫一箇客戶在處理一箇業務時,因爲處理時間長,爲瞭避免客戶焦慮等待,在處理過程中添加瞭進度條,但因爲記録數特彆多,達幾十萬,增加進度條顯示後,會導緻處理時間成倍增加。拖慢瞭處理的速度,反而背離瞭之前的初衷。所以在顯示進度條時想瞭一箇辦法,不是每條都刷新進度條,而是以一定的間隔如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
分享