如何使读写数据和进度条同步?我的程序是对多个月报表进行汇总,形成一个年报表,数据的读写月需 1 分 20 秒左右,为形象点,我又用 progressbar 控件来显示进度,现在问题是如何是数据读写的代码和进度条一起执行。我的代码如下:

解决方案 »

  1.   

    sub 读写数据()
      ......
      ......
    end subsub 进度条()
    Dim y , i , n As Long
      Dim str As String
      y = 1200000    '处理时间约 1 分20 秒
      Form1.ProgressBar1.Visible = True
      
      Form1.ProgressBar1.Max = y
      Form1.ProgressBar1.Min = 0
      For i = y To 5 Step -1
        n = n + 1
        Form1.ProgressBar1.Value = n
        B = n / y
        DoEvents
        Form1.Label1.Caption = "正在处理数据,已完 " & Format(B, "00%") & ",请稍作休息"
       Next
    end  sub
      

  2.   

    将Y设置为需要处理的数据记录总数,
    Form1.ProgressBar1.Value = 以已处理的记录数进行对应处理.
    不要再引入一个什么时间的总量,不同的机器总时间不一定的.
      

  3.   

    怎么设置Y 为记录总数?
    我的程序中进度条只是为了好看而做的,所以对时间的长短准确性要求并不高!我的问题还是,如何同步?
    我以前用了 
    sub 读写数据()   call 进度条
       .....
       .....
    end sub 但是这样以来,进度条显示完了才开始读数据!
      

  4.   

    思路有问题。
    进度条代码肯定要与操作数据的代码集成到一起才行。
    你 call 一下,它肯定是先执行call,完了再回到调用者。应该是:sub 读写数据() '你处理数据的循环体 do while ....
      ......
      ......   '改变进度条的值 loop
    end sub
      

  5.   

    参考一下这段代码,功能是将数据库记录加载到 listview 中(lv1),用 状态栏(sb1)显示加载进度。换成进度条也一样!    Dim i As Integer, x As Long, r As Long, p As Long
        Dim objRs As New ADODB.Recordset, xItem As ListItem
        
        objRs.Open "select * from account order by acc_name", objConn, adOpenForwardOnly, adLockReadOnly
        r = objRs.RecordCount
        p = r \ 100
        If p < 1 Then p = 1
        
        i = 0
        Do While Not objRs.EOF
            Set xItem = lv1.ListItems.Add()
            With xItem
                .Text = objRs("acc_name")
                .SubItems(1) = objRs("init_date")
                .SubItems(2) = objRs("curr_name")
                .SubItems(3) = objRs("init_amt")
                .SubItems(4) = objRs("bala_amt")
            End With
            
            i = i + 1
            If i Mod p = 0 Then
                Sb1.Panels(1).Text = "正在加载数据,已完成 " & CStr(i * 100 \ r) & " % ..."
            End If
            
            objRs.MoveNext
        Loop
        objRs.Close
      

  6.   

    思路很不对!问题很严重!进度条没有这样写的,这样写个时钟倒有点像!你应该将进度条的Max与记录总数相匹配,在处理一定记录数后,更新一次Value,2-3条语句就行了。
      

  7.   

    谢谢阿勇、小吉的答复!
    我就是把握不了我的进度条代码放那里合适,这是我为进度条单独写出来的!
    我的代码是从多个月报表(xlwbm对象)的多个工作表(excel文件)中读取数据写入到年报表(xlwby对象)中,部分代码是如下(在下一楼):
      

  8.   

    道理很简单,你只要用下面的形式就可以了
    dim i as intger
    ProgressBar1.max=10000    '设定ProgressBar1的最大值,对应你数据库的记录数
    ProgressBar1.visible=true
    for i=1 to 10000  ProgressBar1.value=i     '改变ProgressBar1的值 ,对应你数据的某条记录nextProgressBar1.visible=false
      

  9.   

    谢谢阿勇、小吉的答复!
    我就是把握不了我的进度条代码放那里合适,以上sub 进度条() 是我为进度条单独写出来的!
    我的代码是对excel 文件操作,而不是对数据库的!从多个月报表(xlwbM对象)的多个工作表(xlshtM对象)中读取数据写入到年报表(xlwbY对象)中,部分代码是如下:
    sub 读写数据()
      ......'前面的代码是定义几个对象变量的,故略去。以下是真正读取数据的代码
    On Error GoTo Err3:
      Set xlwbY = xlapp.Workbooks.Open(file_path & "\" & MyFileY)
     
      Rem  **********  年报表第一页  ***********  
      Form1.labStatus2.Caption = "年报表第一页..."
      Set xlshtY = xlwbY.Worksheets("气压气温等")
        
      Form1.labStatus2.Caption = "正在读取“本站气压”"
      On Error GoTo Err4
      For i = 1 To 12
        '本站气压值
        mm = Format(i, "00")
        MyFile = MyPath & "\" & MyFileM & mm & ".xls"
        Set xlwbM = xlapp.Workbooks.Open(MyFile)
        Set xlshtM = xlwbM.Worksheets("本站气压")
        
        xlshtY.Cells(4 + i, 2) = xlshtM.Cells(42, 29)    '4 次平均月平均值
        xlshtY.Cells(4 + i, 3) = xlshtM.Cells(42, 30)    '最高气压月平均值
        xlshtY.Cells(4 + i, 4) = xlshtM.Cells(42, 31)    '最低气压月平均值
        xlshtY.Cells(4 + i, 5) = xlshtM.Cells(43, 4)     '最高气压月极值
        xlshtY.Cells(4 + i, 6) = xlshtM.Cells(43, 8)     '最高气压月极值出现日期
        xlshtY.Cells(4 + i, 7) = xlshtM.Cells(43, 12)    '最低气压月极值
        xlshtY.Cells(4 + i, 8) = xlshtM.Cells(43, 16)    '最低气压月极值出现日期
       
        xlwbM.Saved = True
        xlwbM.Close
      Next i
      
      Form1.labStatus2.Caption = "正在读取“气温”"
      For i = 1 To 12
        '气温值
        mm = Format(i, "00")
        MyFile = MyPath & "\" & MyFileM & mm & ".xls"
        Set xlwbM = xlapp.Workbooks.Open(MyFile)
        Set xlshtM = xlwbM.Worksheets("空气温度")
        .....
         xlwbM.Saved = True
        xlwbM.Close
      Next i
      
      Rem  **********  年报表第二页  ***********
      
      Form1.labStatus2.Caption = "年报表第二页..."
      Set xlshtY = xlwbY.Worksheets("电线积冰及天气现象等")
      
      Form1.labStatus2.Caption = "正在读取“蒸发、雪深雪压等”"
      For i = 1 To 12
        '连续降水、蒸发、雪深雪压等
        mm = Format(i, "00")
        MyFile = MyPath & "\" & MyFileM & mm & ".xls"
        Set xlwbM = xlapp.Workbooks.Open(MyFile)
        Set xlshtM = xlwbM.Worksheets("定时降水量等")
        ......
        xlwbM.Saved = True
        xlwbM.Close
      Next i  .....  '类次的代码共有十几段,总之从 12 个月工作簿文件的 22 个表(每个簿都含22表,结构一样)中取数据!
    end sub不知,progressbar 的代码怎么写到以上代码中,怎样才能同步
      

  10.   

    回aohan(景升) :
    谢谢你的答复!
    我不知道我的 ProgressBar1 的最大值该对应什么,是代码行的总数吗?
    我是先估计所需的时间,约需 1 分20 秒,所以就给 max =120000 !
      

  11.   

    很简单!
    Max=22*12
    Next前面Value=Value+1就行了或每个For前面都加一句
    Max=12
    Value=0
    Next前面Value=i就行了方法远不止这些,
    用个累加变量也行,
    Max=22;Next后加Value=Value+1

    想怎么写都行,只要Value能动起来,就达目的了
      

  12.   

    谢谢,小吉的答复!
    你的代码:
    或每个For前面都加一句
    Max=12
    Value=0
    Next前面Value=i就行了
    这样做,是否在每个 for 循环时 progressbar 的值从 0 开始 ?也就是 会不会在每个循环里进度条都从头显示一边? 
      

  13.   

    谢谢,小吉的答复!
        那我还是在程序的开始处给progressbar赋值,.max=12 * N (N 为 for 的个数)
    在每个 For 循环里 用 .value = value + 1    这样,进度条 应该显示一次吧(显示速度比较慢),而上面的方法显示好多次,比较快!
        
        是这样吗?我的 理解对吗? 
      

  14.   

    差不多,就是这个意思。.value = .value + 1
    使用时,还有点要注意。Max值一定要算准,不然超过Max会出错的。若不能很精准,.value + 1前先判断一下,也就安全了。
      

  15.   

    以前做了一个简单的通用进度条:
    用一个表单,设置三个变量:最大值,最小值,当前值
    两个控件:一个PIC控件,一个LAB控件。用LAB的宽来模仿进度
    内有一个过程,用来改变当前值,在改变同时改变LAB的宽度。
    当然,你也可以自已加上一些说明之类的。
      

  16.   

    谢谢,小吉和以上三位的关注!cnapc :
        你能否把你的代码贴到这里,或发给我看看,[email protected](不再留恋):
      
        能否从正面说说你的看法!?  :)