VBA - UserForm with multiples TextBoxes in infinite calculation loop

自作多情 提交于 2019-12-11 20:35:21

问题


I have an UserForm with 5 TextBoxes, and each time one is updated I recalculate the others.

But how do I avoid a "infinite loop" as the first will recalculate second which will recalculate the first and so on...

Here is a part of my UserForm's code, only the TextBox_Change(s) :

Private Sub TxtNewVal_Change()
If InStr(1, Me.TxtNewVal.Value, ",") Then Me.TxtNewVal.Value = Val(Replace(Me.TxtNewVal.Value, ",", "."))

'recalculate values
If Right(Me.TxtNewVal.Value, 1) <> "." Then
    Me.TxtValEUR.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxEUR.Value)
    Me.TxtValUSD.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxUSD.Value)
End If
End Sub


Private Sub TxtTxEUR_Change()
If InStr(1, Me.TxtTxEUR.Value, ",") Then Me.TxtTxEUR.Value = Val(Replace(Me.TxtTxEUR.Value, ",", "."))
If Val(Me.TxtTxEUR.Value) = 0 Then Me.TxtTxEUR.Value = TxEur
'recalculate values =
If Right(Me.TxtTxEUR.Value, 1) <> "." Then Me.TxtValEUR.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxEUR.Value)
'Me.TxtValUSD.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxUSD.Value)
End Sub


Private Sub TxtTxUSD_Change()
If InStr(1, Me.TxtTxUSD.Value, ",") Then Me.TxtTxUSD.Value = Val(Replace(Me.TxtTxUSD.Value, ",", "."))
If Val(Me.TxtTxUSD.Value) = 0 Then Me.TxtTxUSD.Value = TxUsd
'recalculate values =
'Me.TxtValEUR.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxEUR.Value)
If Right(Me.TxtTxUSD.Value, 1) <> "." Then Me.TxtValUSD.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxUSD.Value)
End Sub


Private Sub TxtValEUR_Change()
    If InStr(1, Me.TxtValEUR.Value, ",") Then Me.TxtValEUR.Value = Val(Replace(Me.TxtValEUR.Value, ",", "."))
'recalculate values =
'Me.TxtValEUR.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxEUR.Value)

If Val(Me.TxtTxEUR.Value) <> 0 And Right(Me.TxtValEUR.Value, 1) <> "." Then _
    Me.TxtNewVal.Value = Val(Me.TxtValEUR.Value) / Val(Me.TxtTxEUR.Value)
'Me.TxtValUSD.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxUSD.Value)
End Sub



Private Sub TxtValUSD_Change()
    If InStr(1, Me.TxtValUSD.Value, ",") Then Me.TxtValUSD.Value = Val(Replace(Me.TxtValUSD.Value, ",", "."))
'recalculate values =
If Val(Me.TxtTxUSD.Value) <> 0 And Right(Me.TxtValUSD.Value, 1) <> "." Then _
    Me.TxtNewVal.Value = Val(Me.TxtValUSD.Value) / Val(Me.TxtTxUSD.Value)
'Me.TxtValEUR.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxEUR.Value)
'Me.TxtValUSD.Value = Val(Me.TxtNewVal.Value) * Val(Me.TxtTxUSD.Value)
End Sub

回答1:


Something like this:

Private bIsUpdating As Boolean


Private Sub TxtNewVal_Change()
    If bIsUpdating Then Exit Sub
    bIsUpdating = True
    ... update other text boxes
    bIsUpdating = False
End Sub

Private Sub TxtValEUR_Change()
    If bIsUpdating Then Exit Sub
    bIsUpdating = True
    ... update other text boxes
    bIsUpdating = False
End Sub

... etc ...



回答2:


I'd use the Tag property of a control

Private Sub TxtNewVal_Change()
   TxtNewVal.Value = Val(Replace(Me.TxtNewVal.Value, ",", "."))

   'recalculate values
    txtnewval.tag=" "
    TxtValEUR.Value = Val(TxtNewVal) * Val(TxtTxEUR)
    TxtValUSD.Value = Val(TxtNewVal) * Val(TxtTxUSD)
    txtnewval.tag=""
  End If
end sub

Private Sub TxtTxEUR_Change()
  if txtnewval.tag=" " then exit sub
  '    - - - - - 
end sub

Private Sub TxtTxUSD_Change()
  if txtnewval.tag=" " then exit sub
  '    - - - - - 
end sub

End Sub



来源:https://stackoverflow.com/questions/30578093/vba-userform-with-multiples-textboxes-in-infinite-calculation-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!