VBA for循环结束早

时间:2015-08-19 18:07:27

标签: excel vba excel-vba loops for-loop

如果我正在迭代k = 1到100,如果没有满足条件,我有时需要重新开始迭代。在这种情况下,我创建一个介于1和100之间的随机数,但如果该数字低于51,我希望迭代重新开始。

现在代码返回的是可变数量的值。有时1,有时90.

任何想法为什么?

Public k as long
Sub Example()

For k = 1 To 100
    Call ExampleExtended
Next k

End Sub


Sub ExampleExtended()
Dim Val As Integer

Val = Int((100 - 1 + 1) * Rnd)

If Val < 51 Then
    k = k - 1
    Exit Sub
End If

Debug.Print Val

End Sub

4 个答案:

答案 0 :(得分:4)

在您的示例中,

k被视为两个潜艇的局部变量,因此您不会像您认为的那样更新k。要么增加k的范围(我不推荐),要么使ExampelExtended()成为一个函数,返回你可以在调用子中使用的东西。

这是一种方法。显然这个函数有点矫枉过正,但试图展示如何使用函数将值返回给调用子函数:

    Sub Example()
    Dim counter     As Integer, _
        randNumber   As Integer

    For counter = 1 To 100

        randNumber = RandomBetween(50, 100)
        Debug.Print randNumber

    Next counter

    End Sub


    Function RandomBetween(lowerBound As Integer, upperBound As Integer) As Integer
        RandomBetween = Application.WorksheetFunction.RandBetween(lowerBound, upperBound)
    End Function

这更接近吗?

Option Explicit

Sub Example()
Dim counter     As Integer, _
    randNumber   As Integer

For counter = 1 To 100

    randNumber = RandomBetween(1, 100)


    If randNumber < 50 Then
        counter = counter - 1
    Else ' this is here just as a check...should only print 100 numbers
        Debug.Print randNumber
    End If

Next counter

End Sub

答案 1 :(得分:2)

使用Do While循环看起来更适合这种情况。 Do While循环不确定直到满足条件 - 在这种情况下,直到随机数为&gt; 51.像这样:

val = 1
Do While val < 51
    Val = Int((100 - 1 + 1) * Rnd)
Loop

虽然在你的情况下,可以通过强制随机数在51和15之间来进一步简化。 100,像这样[取自这里:http://www.cpearson.com/excel/randomNumbers.aspx

Dim Low As Double
Dim High As Double
Low = 51 '<<< CHANGE AS DESIRED
High = 100 '<<< CHANGE AS DESIRED
val = Int((High - Low + 1) * Rnd() + Low)

答案 2 :(得分:1)

你的循环至少有100次迭代,平均150次迭代!

但是,Debug.Print Val平均被称为50次。 因此,您几乎总是在控制台窗口中看到少于100个值。

2^(-100)有机会在控制台窗口中看到100行

如果您将代码更改为:

Public k as long
Sub Example()

For k = 1 To 100
    Call ExampleExtended
Next k

End Sub


Sub ExampleExtended()
Dim Val As Integer

Val = Int((100 - 1 + 1) * Rnd)

Debug.Print Val

If Val < 51 Then
    k = k - 1
    Exit Sub
End If

End Sub

循环执行的时间与控制台中的行数相同

答案 3 :(得分:0)

您可以使用转到:

Sub Example()

For k = 1 To 100

Call ExampleExtended

Next k

End Sub


Sub ExampleExtended()
Dim Val As Integer
start:
Val = Int((100 - 1 + 1) * Rnd)

If Val < 51 Then
goto start
k = k - 1
Exit Sub
End If

Debug.Print Val

End Sub

看看它是否有效