Nest Do While循环在VBA中没有结束

不知道为什么下面的代码不会退出,当它是'假设'。 任何帮助赞赏。 问题是一旦RF值达到0,Parent Do While循环没有结束循环。

我把这个完全搞错了吗? 不太熟悉VBA,几年以来没有用任何语言编写程序,所以我很生疏。

提前感谢您的任何见解!


 Private Sub CalculateButton_Click() 'Assigning Variables Dim cid As Currency Dim tip As Currency Dim cha As Currency Dim A1 As Currency Dim R1 As Currency Dim B1 As Boolean Dim A5 As Currency Dim R5 As Currency Dim B5 As Boolean Dim A10 As Currency Dim R10 As Currency Dim B10 As Boolean Dim A20 As Currency Dim R20 As Currency Dim B20 As Boolean Dim A50 As Currency Dim R50 As Currency Dim A100 As Currency Dim R100 As Currency Dim B100 As Boolean Dim tipCalc As Double Dim RF As Currency 'Setting Boolean as false B1 = False B5 = False B10 = False B20 = False B100 = False 'Setting Variables values cid = 587.87 tip = 16 cha = 13 A1 = 36 R1 = 0 A5 = 85 R5 = 0 A10 = 50 R10 = 0 A20 = 420 R20 = 0 A50 = 0 R50 = 0 A100 = 0 R100 = 0 RF = 175 If A1 + A5 + A10 + A20 + A50 + A100 < RF Then MsgBox "Not Enough Money In Register" Exit Sub End If 'Grabbing decimal from CID to calculate tip rounding next tipCalc = cid - Int(cid) 'Calculating tip and entering into the excel sheet 'Removed for simplification RF = RF - cha Do While RF > 0 Do While B1 = False 'This is for the 1 dollar bills If CheckWhole(RF, 5) And A1 < 5 Then B1 = True MsgBox "1 dollar done " & RF Else RF = RF - 1 A1 = A1 - 1 R1 = R1 + 1 End If Loop MsgBox RF > 0 Do While B5 = False '5 dollar bills If CheckWhole(RF, 10) And A5 < 10 Then B5 = True MsgBox "5 dollar done " & RF Else RF = RF - 5 A5 = A5 - 5 R5 = R5 + 5 End If Loop MsgBox RF > 0 Do While B10 = False '10 dollar bills If CheckWhole(RF, 20) And A10 < 20 Then B10 = True MsgBox "10 dollar done " & RF Else RF = RF - 10 A10 = A10 - 10 R10 = R10 + 10 End If Loop MsgBox RF > 0 Do While B20 = False '20 dollar bills If CheckWhole(RF, 100) And A20 < 100 Then B20 = True MsgBox "20 dollar done " & RF Else RF = RF - 20 A20 = A20 - 20 R20 = R20 + 20 MsgBox "20 dollar working " & RF End If Loop MsgBox "a20 " & RF > 0 Loop 'Output goes here, inputs data into cells on spreadsheet. End Sub Function CheckWhole(x As Currency, y As Currency) As Boolean If Int(x / y) = (x / y) Then CheckWhole = True Else CheckWhole = False End If End Function 

请注意,我编辑了一些正在工作的代码,并不涉及到手头的问题。

是的,我有很多变数。 我知道可能有更简单的方法来编码我正在尝试做的事情。

埃里克,如果我理解你的话,你希望执行进入内部循环,如果RF是积极的。 一个简单的方法就是将这个要求明确地添加到所有的内部循环中。 第一个内部循环会看起来像这样开始:

 Do While RF > 0 And B1 = False'This is for the 1 dollar bills 

如果您对其他三个内部循环进行类似的编辑,可能会按照我的想法操作。 问候,垫子

如果您希望在处理过程中停止循环,您需要在每次新的Do While之前进行检查, Do While检查RF是否等于或小于0

 if RF <= 0 then exit Do 

DragonSamu是正确的; if RF <= 0 then exit Do应该添加if RF <= 0 then exit Do在每个内部循环之前if RF <= 0 then exit Do

  • 做什么时候:如果条件满足,将启动循环
  • 循环直到:将重新启动循环,直到满足条件

在这里我创build了一个Function TransferFunds来处理内部循环。 TransferFunds的参数使用ByRef从主代码修改原始variables。

在这里输入图像说明

 Sub CheckRegister() Dim A1 As Currency, A5 As Currency, A10 As Currency, A20 As Currency, A50 As Currency, A100 As Currency Dim R1 As Currency, R5 As Currency, R10 As Currency, R20 As Currency, R50 As Currency, R100 As Currency Dim rf As Currency A1 = 36 A5 = 85 A10 = 50 A20 = 420 A100 = 0 rf = 175 TransferFunds rf, R1, A1, 1 TransferFunds rf, R5, A5, 5 TransferFunds rf, R10, A10, 10 TransferFunds rf, R20, A20, 20 TransferFunds rf, R50, A50, 50 TransferFunds rf, R100, A100, 100 RefundMessage "Refund Due", R1, "Ones", R5, "Fives", R10, "Tens", R20, "Twenties", R50, "Fifties", R100, "Hundreds" RefundMessage "Remaining Register", A1, "Ones", A5, "Fives", A10, "Tens", A20, "Twenties", A50, "Fifties", A100, "Hundreds" End Sub Sub TransferFunds(ByRef rf As Currency, ByRef RValue, ByRef AValue As Currency, Denomination As Integer) Dim RefundAmount As Currency If rf > AValue Then RValue = AValue Else RValue = RValue Mod Denomination End If AValue = AValue - RValue rf = rf - RValue End Sub Sub RefundMessage(Title As String, ParamArray arValuePairs() As Variant) Dim msg As String, Denomination As String Dim i As Integer, cValue As Currency For i = 0 To UBound(arValuePairs) Step 2 cValue = arValuePairs(i) Denomination = arValuePairs(i + 1) If cValue > 0 Then msg = msg & FormatCurrency(cValue, 2) & " in " & Denomination & vbCrLf End If Next MsgBox msg, vbInformation, "Refund Due" End Sub 

首先。 外环将退出。 但只有当它达到代码中的相应“循环”点。 因此,RF将变为负值,内循环将在外循环检查下一个“循环”的条件之前全部完成。

除了这一行:

 MsgBox "a20 " & RF > 0 

你的代码会编译并运行,但可能并不如你所期望的那样。 所以,不要问为什么你的代码不工作,你应该也可以解释你想要达到什么。