Vba 基于多个文本框值执行任务
我正在学习VBA。两件事:Vba 基于多个文本框值执行任务,vba,excel,Vba,Excel,我正在学习VBA。两件事: 还有什么比那长的更有效的吗 命令(我正在尝试查找最低的文本框值) 形状显示在我的Excel工作表中,基于最低文本框值。这 工作,但只有当我改变NBInv文本框,这是有意义的。 然而,这不是我想要我的程序做的。我想要它 不断监视每个文本框的值,并找出最低值 一个 示例代码: Private Sub NBInv_Change() If NBInv.Text = "0" Or NBInv.Text = "" Then ActiveSheet.Sha
Private Sub NBInv_Change()
If NBInv.Text = "0" Or NBInv.Text = "" Then
ActiveSheet.Shapes("NFlow").Visible = False
ElseIf NBInv.Value < NEBInv.Text And NBInv.Text < NEBInv.Text _
And NBInv.Text < EBInv.Text And NBInv.Text < SEBInv.Text _
And NBInv.Text < SBInv.Text And NBInv.Text < SWBInv.Text _
And NBInv.Text < WBInv.Text And NBInv.Text < NWBInv.Text Then
ActiveSheet.Shapes("NFlow").Visible = True
ActiveSheet.Shapes("FlowNFalse").Visible = False
End If
End Sub
Private Sub NBInv_Change()
如果NBInv.Text=“0”或NBInv.Text=”“,则
ActiveSheet.Shapes(“NFlow”).Visible=False
其他输入值<输入文本,输入文本<输入文本_
和NBInv.Text
可以使用此代码查找最小值
Private Sub NBInv_Change()
If NBInv.Text = "0" Or NBInv.Text = "" Then
ActiveSheet.Shapes("NFlow").Visible = False
ElseIf Val(NBInv.Value) = Min(Val(txt1.value),Val(txt2.value),Val(txt3.value),Val(txt4.value)) Then
ActiveSheet.Shapes("NFlow").Visible = True
ActiveSheet.Shapes("FlowNFalse").Visible = False
End If
End Sub
可以使用此代码查找最小值
Private Sub NBInv_Change()
If NBInv.Text = "0" Or NBInv.Text = "" Then
ActiveSheet.Shapes("NFlow").Visible = False
ElseIf Val(NBInv.Value) = Min(Val(txt1.value),Val(txt2.value),Val(txt3.value),Val(txt4.value)) Then
ActiveSheet.Shapes("NFlow").Visible = True
ActiveSheet.Shapes("FlowNFalse").Visible = False
End If
End Sub
您可以简化代码中可见属性的设置。Val(NBInv.Value)将为所有非数值返回0,数字为0。CBool()将0转换为False,将所有其他值转换为True
Private Sub Solution()
Dim HasValue As Boolean
HasValue = CBool(Val(NBInv.Value))
ActiveSheet.Shapes("NFlow").Visible = HasValue
ActiveSheet.Shapes("FlowNFalse").Visible = Not HasValue
End Sub
以下函数将返回列出的所有控件中值最低的控件
私有函数
Dim Fun作为变体
Dim Tmp作为变体
Dim Inv()作为字符串
作为整数的Dim i
投资=分割(“NBInv NEBInv EBInv SEBInv SBInv SWBInv WBInv NWBInv”)
乐趣=10^6
对于i=0到uBond(Inv)
Tmp=Val(ActiveSheet.OLEObjects(Inv(i)).Object.Value)
如果Tmp
端函数
变量Fun必须设置为大于您在文本框中预期遇到的任何值。我选择了10^6。您可以简化代码中可见属性的设置。Val(NBInv.Value)将为所有非数值返回0,数字为0。CBool()将0转换为False,将所有其他值转换为True
Private Sub Solution()
Dim HasValue As Boolean
HasValue = CBool(Val(NBInv.Value))
ActiveSheet.Shapes("NFlow").Visible = HasValue
ActiveSheet.Shapes("FlowNFalse").Visible = Not HasValue
End Sub
以下函数将返回列出的所有控件中值最低的控件
私有函数
Dim Fun作为变体
Dim Tmp作为变体
Dim Inv()作为字符串
作为整数的Dim i
投资=分割(“NBInv NEBInv EBInv SEBInv SBInv SWBInv WBInv NWBInv”)
乐趣=10^6
对于i=0到uBond(Inv)
Tmp=Val(ActiveSheet.OLEObjects(Inv(i)).Object.Value)
如果Tmp
端函数
变量Fun必须设置为大于您在文本框中预期遇到的任何值。我选择了10^6。我会在相关的工作表代码窗格中输入以下代码:
Option Explicit
Const tbNames As String = "NBInv NEBInv EBInv SEBInv SBInv SWBInv WBInv NWBInv" '<--| list all your relevant XBInv textboxes names
Const shpXFlowNames As String = "NFlow NEFlow EFlow SEFlow SFlow SWFlow WFlow NWFlow" '<--| list all "XFlow" shapes names corresponding to each XBInv textboxe
Const shpFlowXFalseNames As String = "FlowNFalse FlowNEFalse FlowEFalse FlowSEFalse FlowSFalse FlowSWFalse FlowWFalse FlowNWFalse" '<--| list all "FlowXFalse" shapes names corresponding to each XBInv textboxe
Dim tbs As Variant, shpXFlows As Variant, shpFlowXFalses As Variant
Sub CheckTB()
Dim minVal As Long
Dim iShp As Long
Dim iTbMin As Long
tbs = Split(tbNames) '<--| fill the array with textboxes names
shpXFlows = Split(shpXFlowNames) '<--| fill the array with "XFlow" shapes names
shpFlowXFalses = Split(shpFlowXFalseNames) '<--| fill the array with "FlowXFalse" shapes names
minVal = GetMinVal(iTbMin)
For iShp = 0 To UBound(shpXFlows) '<--| loop through shapes to hide all "XFlow"s and unhide all "FlowXFalse"s
Shapes(shpXFlows(iShp)).Visible = False
Shapes(shpFlowXFalses(iShp)).Visible = True
Next
Shapes(shpXFlows(iTbMin)).Visible = True '<--| unhide "XFlow" shape with minimum value
Shapes(shpFlowXFalses(iTbMin)).Visible = False '<--| hide "FlowXFalse" shape with minimum value
End Sub
Function GetMinVal(iTbMin As Long) As Long
Dim iTb As Long
iTbMin = 0 '<--|initialize textbox index with minimum value to the first one
GetMinVal = OLEObjects(tbs(iTbMin)).Object.Value '<--|initialize textbox with minimum value to the first one
For iTb = 0 To UBound(tbs)
If CLng(OLEObjects(tbs(iTb)).Object.Value) < GetMinVal Then
GetMinVal = CLng(OLEObjects(tbs(iTb)).Object.Value)
iTbMin = iTb
End If
Next
End Function
Private Sub EBInv_Change()
CheckTB
End Sub
Private Sub NEBInv_Change()
CheckTB
End Sub
Private Sub NBInv_Change()
CheckTB
End Sub
Private Sub NWBInv_Change()
CheckTB
End Sub
Private Sub SBInv_Change()
CheckTB
End Sub
Private Sub SEBInv_Change()
CheckTB
End Sub
Private Sub SWBInv_Change()
CheckTB
End Sub
Private Sub WBInv_Change()
CheckTB
End Sub
选项显式
Const tbNames As String=“NBInv NEBIV EBInv SEBInv SBInv SWBInv WBInv NWBInv”我将在相关工作表代码窗格中输入以下代码:
Option Explicit
Const tbNames As String = "NBInv NEBInv EBInv SEBInv SBInv SWBInv WBInv NWBInv" '<--| list all your relevant XBInv textboxes names
Const shpXFlowNames As String = "NFlow NEFlow EFlow SEFlow SFlow SWFlow WFlow NWFlow" '<--| list all "XFlow" shapes names corresponding to each XBInv textboxe
Const shpFlowXFalseNames As String = "FlowNFalse FlowNEFalse FlowEFalse FlowSEFalse FlowSFalse FlowSWFalse FlowWFalse FlowNWFalse" '<--| list all "FlowXFalse" shapes names corresponding to each XBInv textboxe
Dim tbs As Variant, shpXFlows As Variant, shpFlowXFalses As Variant
Sub CheckTB()
Dim minVal As Long
Dim iShp As Long
Dim iTbMin As Long
tbs = Split(tbNames) '<--| fill the array with textboxes names
shpXFlows = Split(shpXFlowNames) '<--| fill the array with "XFlow" shapes names
shpFlowXFalses = Split(shpFlowXFalseNames) '<--| fill the array with "FlowXFalse" shapes names
minVal = GetMinVal(iTbMin)
For iShp = 0 To UBound(shpXFlows) '<--| loop through shapes to hide all "XFlow"s and unhide all "FlowXFalse"s
Shapes(shpXFlows(iShp)).Visible = False
Shapes(shpFlowXFalses(iShp)).Visible = True
Next
Shapes(shpXFlows(iTbMin)).Visible = True '<--| unhide "XFlow" shape with minimum value
Shapes(shpFlowXFalses(iTbMin)).Visible = False '<--| hide "FlowXFalse" shape with minimum value
End Sub
Function GetMinVal(iTbMin As Long) As Long
Dim iTb As Long
iTbMin = 0 '<--|initialize textbox index with minimum value to the first one
GetMinVal = OLEObjects(tbs(iTbMin)).Object.Value '<--|initialize textbox with minimum value to the first one
For iTb = 0 To UBound(tbs)
If CLng(OLEObjects(tbs(iTb)).Object.Value) < GetMinVal Then
GetMinVal = CLng(OLEObjects(tbs(iTb)).Object.Value)
iTbMin = iTb
End If
Next
End Function
Private Sub EBInv_Change()
CheckTB
End Sub
Private Sub NEBInv_Change()
CheckTB
End Sub
Private Sub NBInv_Change()
CheckTB
End Sub
Private Sub NWBInv_Change()
CheckTB
End Sub
Private Sub SBInv_Change()
CheckTB
End Sub
Private Sub SEBInv_Change()
CheckTB
End Sub
Private Sub SWBInv_Change()
CheckTB
End Sub
Private Sub WBInv_Change()
CheckTB
End Sub
选项显式
Const tbNames As String=“NBInv NEBIV EBInv SEBInv SBInv SWBInv WBInv NWBInv”'因此每个文本框对应的形状不同?您可以使用Select Case
语句代替IF ElseIf
语句。但在您的示例中,我认为更合适的做法是使用循环(例如,For loop
)文本框是否只包含数字?旁注:TextBox。文本
值始终是字符串,即使它看起来像数字。无论您选择何种解决方案,都可以使用CLng
或CDbl
将文本转换为数字,这样每个文本框都有不同的形状?您可以使用Select Case
语句代替IF ElseIf
语句。但在您的示例中,我认为更合适的做法是使用循环(例如,For loop
)文本框是否只包含数字?旁注:TextBox。文本
值始终是字符串,即使它看起来像数字。无论您选择何种解决方案,请使用CLng
或CDbl
将.Text
转换为数字,因此我正在尝试您提到的Variatus代码。这对我来说很有意义,但是我遇到了一个奇怪的结果。如果我保持“If Tmp以使其具有最大的工作值,那么代码就会工作。因此,Tmp不小于1000。检查Tmp。对于这一点,也要看看乐趣。它可能不是数字。尝试Tmp=Val(ActiveSheet.OLEObjects(Inv(i)).Object.Value),所以我正在尝试您提到的Variatus代码。这对我来说很有意义,但是我遇到了一个奇怪的结果。如果我保持“If Tmp以使其具有最大的工作值,那么代码就会工作。因此,Tmp不小于1000。检查Tmp。对于这一点,也要看看乐趣。它可能不是数字。尝试Tmp=Val(ActiveSheet.OLEObjects(Inv(i)).Object.Value)。