用vb如何制作进度条
有以下循环,用进度条显示进度,请问进度条该如何制作?
Do While xlsApp.ActiveWorkbook.Sheets("sheet1").Cells(i, 1) <> ""--------------------编程问答-------------------- 你这段代码中,又无法看出 i 的终止值,如何能表示“进度”???
Text1.Text = Text1.Text & xlsApp.ActiveWorkbook.Sheets("sheet1").Cells(i, 1).Value & "," & xlsApp.ActiveWorkbook.Sheets("sheet1").Cells(i, 3).Value & "," & xlsApp.ActiveWorkbook.Sheets("sheet1").Cells(i, 34).Value & vbCrLf
i = i + 1
Loop
你自己的方法有问题。
在处理数据之前,是能够确定需要处理多少行的。
除非,用“滚动进度条”,表示在数据处理过程中。
前几年,有人问过这个代码。
他那个是在Excel /VBA 中的应用。
你是在VB中,处理这个事情就更简单了。
--------------------编程问答-------------------- 那如果用“滚动进度条”,表示在数据处理过程中,该如何实现? --------------------编程问答-------------------- 搞个gif动画一直在那里动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊动啊 --------------------编程问答-------------------- 我早已不用进度条了,用gif图片是合理的办法 --------------------编程问答-------------------- 进度条使用方法错误,方案错误,字符串连接方式错误,一个一个说吧.
首先说进度条的使用条件.
要使用进度条,就必须知道开始值,结束值,以及当前值.
在你现在的情况里,只知道开始值(假设你循环外已定义好了变量I的值),以及当前值(累加中的I),却不知道结束值.
那么,当前值到了多少,进度条才算走到100%呢?
这个值可以使用xlsApp.ActiveWorkbook.Sheets("sheet1").UsedRange.Rows.Count来得到,即已使用区域的行数.
这样,使用进度条的方式就可以工作了.
但是,为什么又说你方案错误呢,因为EXCEL对象可以直接从Range到数组,你只需要指定三个Range对象(即你代码里的第1,第3,以及第34列),并分别用三行代码将它们内的数据填充到三个数组中即可,1万条数据可以做到1秒左右,三个区域总共也就3秒,几乎可以不使用进度条了.
然后,数据读到VB里面后,再处理就比EXCEL里快多了,但是字符串连接本来就是比较耗时的,因为要不断复制内存;但是做得好的话,这3万条字符串的连接那也是在1秒以内.
可是你代码里最要命的是频繁使用控件接口,也就是那句Text1.Text = Text1.Text & XXXXX
就这样一句代码,会让你的程序慢至少100倍.....
要改进也很简单,再定义一个字符串数组,然后让每次连接出来的结果放到其中一个成员内,最后再用Join函数将这个数组连接成一个字符串,并赋值给文本框. --------------------编程问答-------------------- 补一个字符串连接+显示的性能测试代码:
能看得出,这种情况下的性能差达到了1000倍以上.....
以前看见别人说使用控件属性会有100倍的性能差,现在看来那人是没遇到这种情况吧.
也许这就是不懂VB的人说VB慢的一大原因,哈哈.
Option Explicit--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 用pictureBox,在上面画矩形就行了 --------------------编程问答-------------------- 你需要我可以给你发一个源程序!!
'字符串连接并显示的方式的速度差别
'
'工程里加入一个文本框,MultiLine=True,ScrollBars=2,再加入一个按钮
'
'By 嗷嗷叫的老马
'http://www.m5home.com/
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private Sub Command1_Click()
Dim I As Long, J As Long, K As Long, L As Long
Dim Arr1() As String, Arr2() As String, Arr3() As String
Dim buffArr() As String
Dim STT As Long
Text1.Font = "宋体"
Text1.Font.Size = 9
STT = GetTickCount
J = 65
K = 66
L = 67
ReDim Arr1(10000)
ReDim Arr2(10000)
ReDim Arr3(10000)
For I = 0 To 10000
Arr1(I) = String(5, Chr(J))
Arr2(I) = String(5, Chr(K))
Arr3(I) = String(5, Chr(L))
If J = 90 Then
J = 65
Else
J = J + 1
End If
If K = 90 Then
K = 65
Else
K = K + 1
End If
If L = 90 Then
L = 65
Else
L = L + 1
End If
Next
Debug.Print "生成数组时间(ms) ="; GetTickCount - STT
MsgBox "OK1"
STT = GetTickCount
ReDim buffArr(10000)
For I = 0 To 10000
buffArr(I) = Arr1(I) & "," & Arr2(I) & "," & Arr3(I) '中间结果保存到一个字符串数组
Next
Text1.Text = Join(buffArr(), vbCrLf) '使用join一次性连接,并赋值给文本框
Debug.Print "使用中间变量保存并使用Join一次性填充时间(ms) ="; GetTickCount - STT
MsgBox "OK2"
Text1.Text = ""
STT = GetTickCount
For I = 0 To 10000
Text1.Text = Text1.Text & Arr1(I) & "," & Arr2(I) & "," & Arr3(I) & vbCrLf
Next
Debug.Print "使用控件属性直接填充时间(ms) ="; GetTickCount - STT
MsgBox "OK3"
End Sub
补充:VB , 基础类