Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-无限计算循环中具有多个文本框的用户窗体_Vba_Excel_Infinite Loop_Userform - Fatal编程技术网

VBA-无限计算循环中具有多个文本框的用户窗体

VBA-无限计算循环中具有多个文本框的用户窗体,vba,excel,infinite-loop,userform,Vba,Excel,Infinite Loop,Userform,我有一个带有5个文本框的用户表单,每次更新一个文本框时,我都会重新计算其他文本框 但是如何避免“无限循环”因为第一个循环将重新计算第二个循环,而第二个循环将重新计算第一个循环,依此类推 以下是我的UserForm代码的一部分,仅文本框更改: Private Sub TxtNewVal_Change() 如果InStr(1,Me.TxtNewVal.Value,“,”),则Me.TxtNewVal.Value=Val(替换为(Me.TxtNewVal.Value,“,”)) '重新计算值 如果正确

我有一个带有5个文本框的用户表单,每次更新一个文本框时,我都会重新计算其他文本框

但是如何避免“无限循环”因为第一个循环将重新计算第二个循环,而第二个循环将重新计算第一个循环,依此类推

以下是我的UserForm代码的一部分,仅文本框更改:

Private Sub TxtNewVal_Change()
如果InStr(1,Me.TxtNewVal.Value,“,”),则Me.TxtNewVal.Value=Val(替换为(Me.TxtNewVal.Value,“,”))
'重新计算值
如果正确(Me.TxtNewVal.Value,1)”,则
Me.TxtValEUR.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtXeur.Value)
Me.TxtValUSD.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxusd.Value)
如果结束
端接头
私有子TXTXEUR_变更()
如果InStr(1,Me.txtxeur.Value,“,”),则Me.txtxeur.Value=Val(替换(Me.txtxeur.Value,“,”))
如果Val(Me.txtxeur.Value)=0,则Me.txtxeur.Value=TxEur
'重新计算值=
如果正确(Me.txtxeur.Value,1)”,则Me.TxtValEUR.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxeur.Value)
'Me.TxtValUSD.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxusd.Value)
端接头
私有子TXTXUSD_变更()
如果InStr(1,Me.txtxusd.Value,“,”),则Me.txtxusd.Value=Val(替换(Me.txtxusd.Value,“,”))
如果Val(Me.txtxusd.Value)=0,则Me.txtxusd.Value=TxUsd
'重新计算值=
'Me.TxtValEUR.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtXeur.Value)
如果正确(Me.txtxusd.Value,1)”,则Me.TxtValUSD.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxusd.Value)
端接头
私有子公司TxtValEUR_变更()
如果InStr(1,Me.TxtValEUR.Value,“,”),则Me.TxtValEUR.Value=Val(替换为(Me.TxtValEUR.Value,“,”))
'重新计算值=
'Me.TxtValEUR.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtXeur.Value)
如果Val(Me.txtxeur.Value)为0,而Right(Me.TxtValEUR.Value,1)“,则_
Me.TxtNewVal.Value=Val(Me.TxtValEUR.Value)/Val(Me.TxtTxEUR.Value)
'Me.TxtValUSD.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxusd.Value)
端接头
私人分公司TxtValUSD_变更()
如果InStr(1,Me.TxtValUSD.Value,“,”),则Me.TxtValUSD.Value=Val(替换(Me.TxtValUSD.Value,“,”,“))
'重新计算值=
如果Val(Me.txtxusd.Value)为0,而Right(Me.TxtValUSD.Value,1)“,则_
Me.TxtNewVal.Value=Val(Me.TxtValUSD.Value)/Val(Me.txtxusd.Value)
'Me.TxtValEUR.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtXeur.Value)
'Me.TxtValUSD.Value=Val(Me.TxtNewVal.Value)*Val(Me.txtxusd.Value)
端接头
类似这样的内容:

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 ...

我将使用控件的Tag属性

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

使用布尔变量结束Sub?我想了想,但不知道怎么做(更不恰当的是…),我赶火车,所以我没有在OP中扩展这个想法…啊,太好了!我没想到会用这样的布尔值!我倾向于你的回答,潜艇是平行运行的!那应该很好用!我会尽快让你知道并确认!Thx正是我所需要的,在阅读你的答案之前,我就是不知道如何使用布尔值!太多了!我不知道标签属性,但这确实很方便!我更喜欢另一种解决方案,因为它只需要一个变量就可以签入每个子项,但感谢您的贡献!
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