VBA-无限计算循环中具有多个文本框的用户窗体
我有一个带有5个文本框的用户表单,每次更新一个文本框时,我都会重新计算其他文本框 但是如何避免“无限循环”因为第一个循环将重新计算第二个循环,而第二个循环将重新计算第一个循环,依此类推 以下是我的UserForm代码的一部分,仅文本框更改: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,“,”)) '重新计算值 如果正确
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