VBA for循环结束提前

如果我正在迭代k = 1到100,我有时需要重新启动迭代,如果不符合标准。 在这种情况下,我创build一个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 

在你的例子中k被认为是一个局部variables,所以你没有像你认为的那样更新k。 或者增加k的范围(我不推荐),或者让ExampelExtended()函数返回可以在调用子中使用的东西。

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

  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 

看起来这将更适合于使用Do While循环。 做直到一个条件得到满足的循环不确定 – 在这种情况下,直到一个随机数> 51。像这样:

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

虽然在你的情况下,这可以进一步简化,只是迫使随机数在51和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) 

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

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

(在控制台窗口中看到100行的概率是2^(-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 

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

你可以使用goto:

 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 

看看它是否有效