我需要在一个for循环当中进行处理,因为循环估计要进行1千次以上的计算和处理,因此明显的是for的循环开始后的速度是需要控制的,比如控制到1秒钟进行一次循环。
假设循环如下Private Sub Command_Click()
for i=0 to 100
print "一秒钟显示一次"
next
End Sub
请问如何实现这样的控制呢?

解决方案 »

  1.   


    Option ExplicitPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Dim cCount As Long '保存运行的次数'答案有二种
    '第一种 用API
    Private Sub Command1_Click()
     Dim i As Long
    For i = 0 To 100 '运行100次
       Me.Print "一秒钟显示一次" & i
       Sleep 1000 '暂停1秒
       DoEvents
    Next
    End Sub
    '第二种 增加一个 Timer 控件Private Sub Form_Load()
      Timer1.Enabled = True
     'Timer1.Interval = 1000 '一秒一次
      cCount = 0
    End SubPrivate Sub Timer1_Timer()
     If cCount < 100 Then '运行100次
       Me.Print "一秒钟显示一次"
     Else
       Timer1.Enabled = False
     End If
    End Sub
      

  2.   

    Private Sub Form_Load()
    Timer1.Interval = 1000
    End SubPrivate Sub Timer1_Timer()
    Print "一秒钟显示一次"End Sub
      

  3.   

    还要计数
    Dim I As IntegerPrivate Sub Form_Load()
    Timer1.Interval = 1000
    I = 1
    End SubPrivate Sub Timer1_Timer()
    If I > 1000 Then Timer1.Enabled = False: Exit Sub
    Print "一秒钟显示一次"
    I = I + 1
    End Sub
    要计数:
      

  4.   

    另外需要说明的是这个循环不能在时间控件当中运行,是在按钮当中运行的
    Dim I As IntegerPrivate Sub Command1_Click()
    If I > 1000 Then Timer1.Enabled = False: Exit Sub
    Print "一秒钟显示一次"
    I = I + 1
    End SubPrivate Sub Form_Load()
    Timer1.Interval = 1000
    I = 1
    End SubPrivate Sub Timer1_Timer()
    Call Command1_Click
    End Sub
      

  5.   

    Dim cCount
    Private Sub Command1_Click()
      Timer1.Enabled = True
     'Timer1.Interval = 1000 '一秒一次
      cCount = 0
    End SubPrivate Sub Timer1_Timer()
     If cCount < 10 Then '运行100次
       Me.Print "一秒钟显示一次"
     Else
       Timer1.Enabled = False
     End If
     cCount = cCount + 1
    End Sub
      

  6.   

    谢谢各位参与,我需要的是控制for循环,不是其他的,是以时间来控制for循环的循环速度,而且不能将for循环放在时间控件里面。
      

  7.   

    '改善版本.
    '但是还是有点问题.
    '如果产用这种方式,还是会多占用系统资源的.Option ExplicitPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Dim isLoad As Boolean   '保存是否在运行
    Dim i As Long'第一种 用API
    Private Sub Command1_Click()
      If Not isLoad Then
         isLoad = True
         For i = 0 To 100 '运行100次
            doevents
            Me.Print "一秒钟显示一次" & i
            Sleep 1000 '暂停1秒
            DoEvents
         Next
         isLoad = False
      End If
    End SubPrivate Sub Form_Load()
      isLoad = False
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       If isLoad Then
         If MsgBox("要退出吗?", vbYesNo) = vbYes Then
           i = 100
         Else
           Cancel = 1
         End If
       End If
    End Sub
      

  8.   

    这样来描述,事实上是要延迟for循环的循环速度,让for循环按照指定的时间延迟循环
      

  9.   

    我想起了一种方法,根本就不用时间控件,测量系统时间,每增加一秒,就Print1次
      

  10.   


    谢谢,也许是列子导致出现呢误解,事实上不是要控制显示 print,而是要延迟for循环的循环速度
      

  11.   

    不要用For循环,也不要用DoEvents,用一个计数变量即可,不影响鼠标响应其他事件:Option Explicit
    Private LoopCount As LongPrivate Sub Form_Load()
            Timer1.Enabled = True
            Timer1.Interval = 1000
            LoopCount = 0
    End SubPrivate Sub Timer1_Timer()
            LoopCount = LoopCount + 1
            If LoopCount < 100 Then
               Me.Print "一秒钟显示一次"
            Else
               Timer1.Enabled = False
            End If
    End Sub
      

  12.   

    延迟的思路很简单,在循环内建立一个函数,循环时执行这个函数,控制函数的执行返回值时间,就可以了,因为是在循环内调用的函数,所以只有执行完这个函数,循环才可以进行下去。下面是实现这个延迟思路的代码,从网上搜索到的。我改了一下。Private Sub time_delay(ByVal nSecond As Long)
    Dim nowtime As Datenowtime = Time()Do While TrueIf DateDiff("s", nowtime, Time()) = nSecond Then
    Exit Do
    End If
    DoEvents
    LoopEnd SubPrivate Sub Command1_Click()
    For i = 1 To 30
    Call time_delay(1) '单位是秒
    Print "一秒钟显示一次"
    Next iEnd Sub
      

  13.   

    我仔细比较了一下你这个代码,跟我15楼那个代码差不多。
    但是,你这个代码有2个缺点:
    1、不够简洁。调用函数是要付出代价的,你的问题本身很简单,而用Timer计时器,本身比你这个快,再加上一秒一次,也不影其他响鼠标事响应。
    2、不是匀速显示,有时快,有时慢。而用Timer计时器,则没有这个缺点。所以,我还是推荐 fvflove 的第二钟方法,只不过我加了一个窗体变量LoopCount 来控制循环。
      

  14.   


    很明显,第二种想使用到for循环当中是有难度的,这是没有选择第二种的原因,事实上我的要求是控制for循环,而不是显示,这里的显示这是作为演示。因此第二种就不符合要求了。
    我的要求是延迟的目的是控制for循环的循环速度,而且这个循环可能使用在任何地方,如按钮控件,其他函数以及过程,更加有可能在类和模块当中使用。因此无论是前面的第一种和第二种都是有困难的。
      

  15.   


    可以写一个出来吗?要求可以自定义延迟时间,不使用API和时间控件,可以灵活使用在任何地方,包括模块,类,可以灵活引用。