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
看看它是否有效