如果VBA中的循环忽略Else参数

时间:2014-08-29 23:48:00

标签: excel-vba vba excel

我正在VBA中进行赌博模拟,以确定赢/输概率的变化将如何影响我的结果的标准偏差。在运行我的代码几次后,我注意到我的Else参数被跳过,因此numtries总是等于1. Fail,win和tryagain都表示总和为1的数字(失败< 1,失败+胜利< 1,失败+赢+ TRYAGAIN = 1)

这是我的代码。

Sub game()
Dim win, tryagain, prize, fail, numtries, winnings, roll As Integer

prize = Sheets("Game 1").Cells(3, 1).Value
win = Sheets("Game 1").Cells(5, 1).Value
tryagain = Sheets("Game 1").Cells(7, 1).Value
fail = Sheets("Game 1").Cells(9, 1).Value

  winnings = 0
  numtries = 1

For i = 1 To 9999

roll = Rnd()

     If roll <= fail Then
     winnings = 0
  Exit For

     ElseIf fail <= roll <= fail + win Then
     winnings = prize * numtries
  Exit For

     Else
     numtries = numtries + 1
  End If

   Next i

Sheets("Game 1").Cells(15, 3).Value = winnings
Sheets("Game 1").Cells(15, 4).Value = numtries

End Sub

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过调试应用程序找到此信息(使用F8键逐步执行VBA代码)。对于调试帮助,您真的应该为代码中的所有变量指定值,您正在使用的值以及您认为正确输出应该的值,以及输出

您将roll定义为整数,然后设置roll=Rnd(),但Rnd()float并返回小于1的数字。这有效地表示roll=1一直以来。

我怀疑fail被定义为百分比(或十进制),它是&lt;这意味着你的状况

If roll <= fail始终为FALSE

fail <= roll <= fail + win始终为TRUE

其他问题,你应该可以从这里解决。这有帮助吗?

<强>更新 这是一个实现和一个辅助函数,它使事情变得更加清晰。特别是,for i=1 to 9999循环已被激活,因为之前没有运行(设置runs以更改循环次数)。

第一个子函数是辅助函数PrintArray,用于将数组的内容打印到工作表。将两个程序复制到您的VBA中。

Sub PrintArray(Data As Variant, Cl As Range)
    Cl.Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub

game2()是对您的代码的轻微更新:

Sub game2()
Dim win, tryagain, prize, fail, winnings, roll As Double
Dim ans() As Double
Dim numtries, runs As Long

'set variables start
prize = Sheets("Game 1").Cells(3, 1).Value
win = Sheets("Game 1").Cells(5, 1).Value
tryagain = Sheets("Game 1").Cells(7, 1).Value
fail = Sheets("Game 1").Cells(9, 1).Value
runs = 99 'the number of loops
'set variables finish

ReDim ans(runs, 2)

  winnings = 0
  numtries = 1

For i = 1 To runs

    roll = Rnd()

    Select Case roll
        Case 0 To fail
            winnings = 0
        Case fail To (fail + win)
            winnings = prize * numtries
        Case Else
            numtries = numtries + 1 'numtries only gets updated here..
    End Select

    ans(i - 1, 0) = winnings
    ans(i - 1, 1) = numtries
 Next i

PrintArray ans, ActiveWorkbook.Worksheets("Game 1").[C15]

End Sub