如何给自己的程序,做一个进度条,进度条要和程序运行的时间相同?

时间:2023-01-20 17:43:01
如题。如何用vb来做一个进度条和程序的运行时间相同。

23 个解决方案

#1


这个不难吧.可以用ProgressBar1控件,也可用picture控件画图:
给你一个例子参考:http://blog.csdn.net/chenjl1031/archive/2007/12/24/1964909.aspx

#2


和程序的运行时间相同?天知道程序要运行多久,max怎么算

#3


程序的运行时间是什么意思?

#4


问题的关键是:你在某一个操作之前(需要显示进度的操作),能够确定它需要的时间吗?
    或者在操作过程中,能够“及时”的知道“当前进度”(现在完成的百分比)吗?

如果能做到上面的任一点,你的“进度”要求就太容易实现了。
如果哪一点都做不到,恐怕你的希望有点渺茫。

#5


打个比方来说,就像我们平时复制文件的那个进度条一样,文件复制结束了,进度条就到100了。我在模块中定义了一个函数是来处理表格的,大概有一定的时间来完成,我就是想让它运行的时候来显示进度条啊。

#6


那你那个“函数”每次要处理的总行数(或记录总数)应该积知道吧?

简单的方法:
1. 在窗体中添加一下进度条控件。
2. 设置控件的最大值为100,最小值为0
3. 刚进入函数的时候,设置控件的Value为0。
4. 循环处理过程中,设置控件的Value = 已处理行数÷待处理总行数×100。

#7


引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算


楼主熬通宵,max=24小时

#8


8013你的想法,我也想过,就是不知道怎么来判断已经处理的行数啊?假如我的函数有50行,怎么能判断当前处理到哪一行呢?

#9


不是程序代码的行数,是你所处理的表格的行数,比如你的表有100行,你处理到第39行,那值就是39呀

#10


引用 8 楼 rgmcel 的回复:
8013你的想法,我也想过,就是不知道怎么来判断已经处理的行数啊?假如我的函数有50行,怎么能判断当前处理到哪一行呢?


无语..........

我看你不是“曾经的黄毛小子”,而是目前就是一个“黄毛小子”。
看楼上给你有解释吧。

#11


Sub Report_0()

    Range("A:AO").NumberFormatLocal = "@"
    Columns("L:N").NumberFormatLocal = "yyyy-mm-dd"
    Range("A:E,H:K").HorizontalAlignment = -4108&
    Range("L:AO").HorizontalAlignment = -4152&
    Range("O:O,R:R").HorizontalAlignment = -4108&
    Rows("1:1").RowHeight = 20#
    Rows("2:2").RowHeight = 29.3
    Rows("1:2").HorizontalAlignment = -4108&
    Rows("1:2").VerticalAlignment = -4108&
    Rows("1:2").Font.Size = 10
    Rows("1:2").Font.Bold = True
    Range("A1:A2").Select:  DoEvents
    Selection.Merge
    Columns("A:A").ColumnWidth = 6.3
    ActiveCell.FormulaR1C1 = "备注"
    Range("B1:B2").Select
    Selection.Merge
    Columns("B:B").ColumnWidth = 6.6
    ActiveCell.FormulaR1C1 = "使用" & vbLf & "单位"
    Range("C1:C2").Select
    Selection.Merge

    ...................

    ActiveWindow.FreezePanes = True
    labSumLine.Caption = mlPointPublic
    labOpeLine.Caption = "1"
     labGuage.Visible = True: labStaMsg.Font.Size = 9
    mlOpeLine = 2&: mlTempE = 1&
    For mlTempA = 1& To mlPointPublic
        labOpeLine.Caption = mlTempA
         labGuage.Width = 237.5 * mlTempA / mlPointPublic
        DoEvents
        mlOpeLine = mlOpeLine + 1&
        Range("A" & mlOpeLine).Select
        ActiveCell.Formula = msPubField(1&, mlTempA)
        Range("B" & mlOpeLine).Formula = msPubField(2&, mlTempA)
        Range("C" & mlOpeLine).Formula = msPubField(3&, mlTempA)
        Range("D" & mlOpeLine).Formula = msPubField(4&, mlTempA)
        Range("E" & mlOpeLine).Formula = msPubField(5&, mlTempA)
        Range("F" & mlOpeLine).Formula = msPubField(6&, mlTempA)
        Range("G" & mlOpeLine).Formula = msPubField(7&, mlTempA)
        Range("H" & mlOpeLine).Formula = msPubField(8&, mlTempA)
        Range("I" & mlOpeLine).Formula = msPubField(9&, mlTempA)
        Range("J" & mlOpeLine).Formula = msPubField(10&, mlTempA)
        Range("K" & mlOpeLine).Formula = msPubField(11&, mlTempA)
        Range("L" & mlOpeLine).Formula = CLng(msPubField(12&, mlTempA))
        If (msPubField(13&, mlTempA) > "") Then
            Range("M" & mlOpeLine).Formula = CLng(msPubField(13&, mlTempA))
        End If
        If (msPubField(14&, mlTempA) > "") Then
            Range("N" & mlOpeLine).Formula = CLng(msPubField(14&, mlTempA))
        End If
        Range("O" & mlOpeLine).Formula = msPubField(15&, mlTempA)
        Range("Q" & mlOpeLine).Formula = Format$(msPubField(16&, mlTempA), "0.00")
        Range("R" & mlOpeLine).Formula = msPubField(17&, mlTempA)
        Range("S" & mlOpeLine).Formula = Format$(msPubField(18&, mlTempA), "0.00")
        For mlTempD = 1& To 7&
            Range(Chr$(83& + mlTempD) & mlOpeLine).Formula = Format$(mgPubTime(mlTempD, mlTempA), "0.00")
        Next
        For mlTempD = 8& To 22&
            Range("A" & Chr$(57& + mlTempD) & mlOpeLine).Formula = Format$(mgPubTime(mlTempD, mlTempA), "0.00")
        Next
    Next
    Range("A1").Select
    Range("A:A").Insert Shift:=-4161&
    Range("A:A").ColumnWidth = 1.5
    Range("A:A").Font.ColorIndex = 3
    Range("A1:A2").Merge
    Range("A1").HorizontalAlignment = -4131&
    Range("A1").WrapText = True
    Range("A1").Formula = "是否完工"
    Range("A3").Select

End Sub

==============================
这是我的一个报表处理系统中的一小部分。
注意上面蓝色字体部分。
我是用一个标签来指示进度的,用进度条控件实质也是一回事(只是在我的那个具体的应用环境中,用标签更好)。

变量 mlTempA 的值代表已处理到哪条记录。
变量 mlPointPublic 的值就是这一次要处理的记录总数。

#12


引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算


哈哈.

顶这个.

#13


引用 12 楼 myjian 的回复:
引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算 
 

哈哈. 

顶这个.


老马又在灌水 ^_^

#14


他这个问题,只能得到程序运行以来,所经过的时间.

由于不知道MAX值(天知道程序要运行多久),那应该是无法使用进度条控件来显示了.

帮顶顶.

看看高手们有啥说法.

#15


其实我有一个方法,就是有一点不地道,就是在程序段中多设置几个断点,比如做10个断点,每当经过一个断点的时候就到10%,但是这么做,我倒认为不如不加了,简直是个累赘。但是程序运行有一定的时间,不能让人家一直在等吧,不明白的人还以为程序中断了,或者干脆结束任务了。

#16


回LS:

  难道你的表格是用一大堆的顺序语句来完成的(你在5楼说的处理一个表格)?
  不可能是这样的吧?
  你某次调用“这个函数”时,要处理的表格有多少行都不知道?

  你看一下我在11楼的代码,我再把它“浓缩”一下:
    labGuage.Visible = True       '使我的“进度条”显示出来 
    mlOpeLine = 2&: mlTempE = 1& 
    For mlTempA = 1& To mlPointPublic 'mlPointPublic的值是要处理的记录总数
        labOpeLine.Caption = mlTempA  '在窗体的一个标签上显示处理到了第几条
        labGuage.Width = 237.5 * mlTempA / mlPointPublic '计算“进度”
        DoEvents             '使窗口刷新
      ..............

    Next 

  当处理到最后一条记录时,mlTempA = mlPiontPublic
  这时我用的“进度条”labGuage.Width = 237.5 ,从窗口上看来,这个“进度”就是100%了。

  这只是其中一张报表的。窗体上会显示正在处理哪张报表。

  我不明白你在楼上说的什么“设置断点”是什么意思。“处理进度”跟断点、程序执行到函数中的哪句有什么关系呀?

  我在四楼的回复,你究竟看过没有?
  如果你还弄不明白的话,我实在无话可说了。 -_-!

#17


8013:您说的很对,我就是用一大堆顺序语句来执行的。
其实我这个过程也没有什么。
就是把上面发来的电子表格筛选出来(每一次发的表格都是一样的),然后删除一些没有用的数据,把有用的数据保存在一个新表中。不知道为什么运行的速度为什么这么慢,是不是我的代码有问题呢?下面是代码(vba):

sub init()
  Application.ScreenUpdating = False'传说可以提高运行速度
  School = "jrsz"
  If Range("A1") = "" Then     '删除表格的表头。
     Rows("1:1").Delete Shift:=xlUp
  End If
     ActiveWindow.FreezePanes = False '解冻
     Sheets(1).Range("C1").AutoFilter _
     field:=3, _
     Criteria1:=School
     Cells.Copy
   
Set newbook = Workbooks.Add
Set NewSheet = Worksheets.Add  '创建新表
NewSheet.Name = School & "成绩表"
 NewSheet.Paste
     Range("A:D,H:H,L:L,J:J,U:U").Delete
Set mysheet = Application.ActiveSheet
mysheet.Columns.AutoFit
 Application.DisplayAlerts = False '关闭excel提示框
 newbook.SaveAs Filename:="d:\" & School, accessmode:=xlExclusive
 newbook.Close
Application.DisplayAlerts = True ' 打开excel提示框
Application.ScreenUpdating = True '打开屏幕更新

End Sub

#18


最好是提高运行速度,不去耽误用户时间
引用 15 楼 rgmcel 的回复:
其实我有一个方法,就是有一点不地道,就是在程序段中多设置几个断点,比如做10个断点,每当经过一个断点的时候就到10%,但是这么做,我倒认为不如不加了,简直是个累赘。但是程序运行有一定的时间,不能让人家一直在等吧,不明白的人还以为程序中断了,或者干脆结束任务了。

#19


...........搞了半天,是想把处理进度报告给用户????

我服~~~~~~路过.

#20


自己手动把程序分为几段,在分段的地方加上进度条控制代码

#21


若是这样的话,只能用另一种方法,即一个滚动条从左往右不断滚动,并显示“处理中,请稍候”这样的字样,没有具体进度,但是让用户知道程序不是死掉,而是在处理,很多程序都是这样干的。

#22


顶21楼的意见,还是用“处理中,请稍候”这样的字较好

#23


同意,同时也感谢,8013,老马,泰山,东方之珠等人,谢谢你们无私的奉献!结贴中……

#1


这个不难吧.可以用ProgressBar1控件,也可用picture控件画图:
给你一个例子参考:http://blog.csdn.net/chenjl1031/archive/2007/12/24/1964909.aspx

#2


和程序的运行时间相同?天知道程序要运行多久,max怎么算

#3


程序的运行时间是什么意思?

#4


问题的关键是:你在某一个操作之前(需要显示进度的操作),能够确定它需要的时间吗?
    或者在操作过程中,能够“及时”的知道“当前进度”(现在完成的百分比)吗?

如果能做到上面的任一点,你的“进度”要求就太容易实现了。
如果哪一点都做不到,恐怕你的希望有点渺茫。

#5


打个比方来说,就像我们平时复制文件的那个进度条一样,文件复制结束了,进度条就到100了。我在模块中定义了一个函数是来处理表格的,大概有一定的时间来完成,我就是想让它运行的时候来显示进度条啊。

#6


那你那个“函数”每次要处理的总行数(或记录总数)应该积知道吧?

简单的方法:
1. 在窗体中添加一下进度条控件。
2. 设置控件的最大值为100,最小值为0
3. 刚进入函数的时候,设置控件的Value为0。
4. 循环处理过程中,设置控件的Value = 已处理行数÷待处理总行数×100。

#7


引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算


楼主熬通宵,max=24小时

#8


8013你的想法,我也想过,就是不知道怎么来判断已经处理的行数啊?假如我的函数有50行,怎么能判断当前处理到哪一行呢?

#9


不是程序代码的行数,是你所处理的表格的行数,比如你的表有100行,你处理到第39行,那值就是39呀

#10


引用 8 楼 rgmcel 的回复:
8013你的想法,我也想过,就是不知道怎么来判断已经处理的行数啊?假如我的函数有50行,怎么能判断当前处理到哪一行呢?


无语..........

我看你不是“曾经的黄毛小子”,而是目前就是一个“黄毛小子”。
看楼上给你有解释吧。

#11


Sub Report_0()

    Range("A:AO").NumberFormatLocal = "@"
    Columns("L:N").NumberFormatLocal = "yyyy-mm-dd"
    Range("A:E,H:K").HorizontalAlignment = -4108&
    Range("L:AO").HorizontalAlignment = -4152&
    Range("O:O,R:R").HorizontalAlignment = -4108&
    Rows("1:1").RowHeight = 20#
    Rows("2:2").RowHeight = 29.3
    Rows("1:2").HorizontalAlignment = -4108&
    Rows("1:2").VerticalAlignment = -4108&
    Rows("1:2").Font.Size = 10
    Rows("1:2").Font.Bold = True
    Range("A1:A2").Select:  DoEvents
    Selection.Merge
    Columns("A:A").ColumnWidth = 6.3
    ActiveCell.FormulaR1C1 = "备注"
    Range("B1:B2").Select
    Selection.Merge
    Columns("B:B").ColumnWidth = 6.6
    ActiveCell.FormulaR1C1 = "使用" & vbLf & "单位"
    Range("C1:C2").Select
    Selection.Merge

    ...................

    ActiveWindow.FreezePanes = True
    labSumLine.Caption = mlPointPublic
    labOpeLine.Caption = "1"
     labGuage.Visible = True: labStaMsg.Font.Size = 9
    mlOpeLine = 2&: mlTempE = 1&
    For mlTempA = 1& To mlPointPublic
        labOpeLine.Caption = mlTempA
         labGuage.Width = 237.5 * mlTempA / mlPointPublic
        DoEvents
        mlOpeLine = mlOpeLine + 1&
        Range("A" & mlOpeLine).Select
        ActiveCell.Formula = msPubField(1&, mlTempA)
        Range("B" & mlOpeLine).Formula = msPubField(2&, mlTempA)
        Range("C" & mlOpeLine).Formula = msPubField(3&, mlTempA)
        Range("D" & mlOpeLine).Formula = msPubField(4&, mlTempA)
        Range("E" & mlOpeLine).Formula = msPubField(5&, mlTempA)
        Range("F" & mlOpeLine).Formula = msPubField(6&, mlTempA)
        Range("G" & mlOpeLine).Formula = msPubField(7&, mlTempA)
        Range("H" & mlOpeLine).Formula = msPubField(8&, mlTempA)
        Range("I" & mlOpeLine).Formula = msPubField(9&, mlTempA)
        Range("J" & mlOpeLine).Formula = msPubField(10&, mlTempA)
        Range("K" & mlOpeLine).Formula = msPubField(11&, mlTempA)
        Range("L" & mlOpeLine).Formula = CLng(msPubField(12&, mlTempA))
        If (msPubField(13&, mlTempA) > "") Then
            Range("M" & mlOpeLine).Formula = CLng(msPubField(13&, mlTempA))
        End If
        If (msPubField(14&, mlTempA) > "") Then
            Range("N" & mlOpeLine).Formula = CLng(msPubField(14&, mlTempA))
        End If
        Range("O" & mlOpeLine).Formula = msPubField(15&, mlTempA)
        Range("Q" & mlOpeLine).Formula = Format$(msPubField(16&, mlTempA), "0.00")
        Range("R" & mlOpeLine).Formula = msPubField(17&, mlTempA)
        Range("S" & mlOpeLine).Formula = Format$(msPubField(18&, mlTempA), "0.00")
        For mlTempD = 1& To 7&
            Range(Chr$(83& + mlTempD) & mlOpeLine).Formula = Format$(mgPubTime(mlTempD, mlTempA), "0.00")
        Next
        For mlTempD = 8& To 22&
            Range("A" & Chr$(57& + mlTempD) & mlOpeLine).Formula = Format$(mgPubTime(mlTempD, mlTempA), "0.00")
        Next
    Next
    Range("A1").Select
    Range("A:A").Insert Shift:=-4161&
    Range("A:A").ColumnWidth = 1.5
    Range("A:A").Font.ColorIndex = 3
    Range("A1:A2").Merge
    Range("A1").HorizontalAlignment = -4131&
    Range("A1").WrapText = True
    Range("A1").Formula = "是否完工"
    Range("A3").Select

End Sub

==============================
这是我的一个报表处理系统中的一小部分。
注意上面蓝色字体部分。
我是用一个标签来指示进度的,用进度条控件实质也是一回事(只是在我的那个具体的应用环境中,用标签更好)。

变量 mlTempA 的值代表已处理到哪条记录。
变量 mlPointPublic 的值就是这一次要处理的记录总数。

#12


引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算


哈哈.

顶这个.

#13


引用 12 楼 myjian 的回复:
引用 2 楼 alifriend 的回复:
和程序的运行时间相同?天知道程序要运行多久,max怎么算 
 

哈哈. 

顶这个.


老马又在灌水 ^_^

#14


他这个问题,只能得到程序运行以来,所经过的时间.

由于不知道MAX值(天知道程序要运行多久),那应该是无法使用进度条控件来显示了.

帮顶顶.

看看高手们有啥说法.

#15


其实我有一个方法,就是有一点不地道,就是在程序段中多设置几个断点,比如做10个断点,每当经过一个断点的时候就到10%,但是这么做,我倒认为不如不加了,简直是个累赘。但是程序运行有一定的时间,不能让人家一直在等吧,不明白的人还以为程序中断了,或者干脆结束任务了。

#16


回LS:

  难道你的表格是用一大堆的顺序语句来完成的(你在5楼说的处理一个表格)?
  不可能是这样的吧?
  你某次调用“这个函数”时,要处理的表格有多少行都不知道?

  你看一下我在11楼的代码,我再把它“浓缩”一下:
    labGuage.Visible = True       '使我的“进度条”显示出来 
    mlOpeLine = 2&: mlTempE = 1& 
    For mlTempA = 1& To mlPointPublic 'mlPointPublic的值是要处理的记录总数
        labOpeLine.Caption = mlTempA  '在窗体的一个标签上显示处理到了第几条
        labGuage.Width = 237.5 * mlTempA / mlPointPublic '计算“进度”
        DoEvents             '使窗口刷新
      ..............

    Next 

  当处理到最后一条记录时,mlTempA = mlPiontPublic
  这时我用的“进度条”labGuage.Width = 237.5 ,从窗口上看来,这个“进度”就是100%了。

  这只是其中一张报表的。窗体上会显示正在处理哪张报表。

  我不明白你在楼上说的什么“设置断点”是什么意思。“处理进度”跟断点、程序执行到函数中的哪句有什么关系呀?

  我在四楼的回复,你究竟看过没有?
  如果你还弄不明白的话,我实在无话可说了。 -_-!

#17


8013:您说的很对,我就是用一大堆顺序语句来执行的。
其实我这个过程也没有什么。
就是把上面发来的电子表格筛选出来(每一次发的表格都是一样的),然后删除一些没有用的数据,把有用的数据保存在一个新表中。不知道为什么运行的速度为什么这么慢,是不是我的代码有问题呢?下面是代码(vba):

sub init()
  Application.ScreenUpdating = False'传说可以提高运行速度
  School = "jrsz"
  If Range("A1") = "" Then     '删除表格的表头。
     Rows("1:1").Delete Shift:=xlUp
  End If
     ActiveWindow.FreezePanes = False '解冻
     Sheets(1).Range("C1").AutoFilter _
     field:=3, _
     Criteria1:=School
     Cells.Copy
   
Set newbook = Workbooks.Add
Set NewSheet = Worksheets.Add  '创建新表
NewSheet.Name = School & "成绩表"
 NewSheet.Paste
     Range("A:D,H:H,L:L,J:J,U:U").Delete
Set mysheet = Application.ActiveSheet
mysheet.Columns.AutoFit
 Application.DisplayAlerts = False '关闭excel提示框
 newbook.SaveAs Filename:="d:\" & School, accessmode:=xlExclusive
 newbook.Close
Application.DisplayAlerts = True ' 打开excel提示框
Application.ScreenUpdating = True '打开屏幕更新

End Sub

#18


最好是提高运行速度,不去耽误用户时间
引用 15 楼 rgmcel 的回复:
其实我有一个方法,就是有一点不地道,就是在程序段中多设置几个断点,比如做10个断点,每当经过一个断点的时候就到10%,但是这么做,我倒认为不如不加了,简直是个累赘。但是程序运行有一定的时间,不能让人家一直在等吧,不明白的人还以为程序中断了,或者干脆结束任务了。

#19


...........搞了半天,是想把处理进度报告给用户????

我服~~~~~~路过.

#20


自己手动把程序分为几段,在分段的地方加上进度条控制代码

#21


若是这样的话,只能用另一种方法,即一个滚动条从左往右不断滚动,并显示“处理中,请稍候”这样的字样,没有具体进度,但是让用户知道程序不是死掉,而是在处理,很多程序都是这样干的。

#22


顶21楼的意见,还是用“处理中,请稍候”这样的字较好

#23


同意,同时也感谢,8013,老马,泰山,东方之珠等人,谢谢你们无私的奉献!结贴中……