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
怎么设置Y 为记录总数? 我的程序中进度条只是为了好看而做的,所以对时间的长短准确性要求并不高!我的问题还是,如何同步? 我以前用了 sub 读写数据() call 进度条 ..... ..... end sub 但是这样以来,进度条显示完了才开始读数据!
思路有问题。 进度条代码肯定要与操作数据的代码集成到一起才行。 你 call 一下,它肯定是先执行call,完了再回到调用者。应该是:sub 读写数据() '你处理数据的循环体 do while .... ...... ...... '改变进度条的值 loop end sub
参考一下这段代码,功能是将数据库记录加载到 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
道理很简单,你只要用下面的形式就可以了 dim i as intger ProgressBar1.max=10000 '设定ProgressBar1的最大值,对应你数据库的记录数 ProgressBar1.visible=true for i=1 to 10000 ProgressBar1.value=i '改变ProgressBar1的值 ,对应你数据的某条记录nextProgressBar1.visible=false
谢谢阿勇、小吉的答复! 我就是把握不了我的进度条代码放那里合适,以上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 的代码怎么写到以上代码中,怎样才能同步
......
......
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
Form1.ProgressBar1.Value = 以已处理的记录数进行对应处理.
不要再引入一个什么时间的总量,不同的机器总时间不一定的.
我的程序中进度条只是为了好看而做的,所以对时间的长短准确性要求并不高!我的问题还是,如何同步?
我以前用了
sub 读写数据() call 进度条
.....
.....
end sub 但是这样以来,进度条显示完了才开始读数据!
进度条代码肯定要与操作数据的代码集成到一起才行。
你 call 一下,它肯定是先执行call,完了再回到调用者。应该是:sub 读写数据() '你处理数据的循环体 do while ....
......
...... '改变进度条的值 loop
end sub
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
我就是把握不了我的进度条代码放那里合适,这是我为进度条单独写出来的!
我的代码是从多个月报表(xlwbm对象)的多个工作表(excel文件)中读取数据写入到年报表(xlwby对象)中,部分代码是如下(在下一楼):
dim i as intger
ProgressBar1.max=10000 '设定ProgressBar1的最大值,对应你数据库的记录数
ProgressBar1.visible=true
for i=1 to 10000 ProgressBar1.value=i '改变ProgressBar1的值 ,对应你数据的某条记录nextProgressBar1.visible=false
我就是把握不了我的进度条代码放那里合适,以上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 的代码怎么写到以上代码中,怎样才能同步
谢谢你的答复!
我不知道我的 ProgressBar1 的最大值该对应什么,是代码行的总数吗?
我是先估计所需的时间,约需 1 分20 秒,所以就给 max =120000 !
Max=22*12
Next前面Value=Value+1就行了或每个For前面都加一句
Max=12
Value=0
Next前面Value=i就行了方法远不止这些,
用个累加变量也行,
Max=22;Next后加Value=Value+1
。
想怎么写都行,只要Value能动起来,就达目的了
你的代码:
或每个For前面都加一句
Max=12
Value=0
Next前面Value=i就行了
这样做,是否在每个 for 循环时 progressbar 的值从 0 开始 ?也就是 会不会在每个循环里进度条都从头显示一边?
那我还是在程序的开始处给progressbar赋值,.max=12 * N (N 为 for 的个数)
在每个 For 循环里 用 .value = value + 1 这样,进度条 应该显示一次吧(显示速度比较慢),而上面的方法显示好多次,比较快!
是这样吗?我的 理解对吗?
使用时,还有点要注意。Max值一定要算准,不然超过Max会出错的。若不能很精准,.value + 1前先判断一下,也就安全了。
用一个表单,设置三个变量:最大值,最小值,当前值
两个控件:一个PIC控件,一个LAB控件。用LAB的宽来模仿进度
内有一个过程,用来改变当前值,在改变同时改变LAB的宽度。
当然,你也可以自已加上一些说明之类的。
你能否把你的代码贴到这里,或发给我看看,[email protected](不再留恋):
能否从正面说说你的看法!? :)