Vba 基于多个文本框值执行任务

Vba 基于多个文本框值执行任务,vba,excel,Vba,Excel,我正在学习VBA。两件事: 还有什么比那长的更有效的吗 命令(我正在尝试查找最低的文本框值) 形状显示在我的Excel工作表中,基于最低文本框值。这 工作,但只有当我改变NBInv文本框,这是有意义的。 然而,这不是我想要我的程序做的。我想要它 不断监视每个文本框的值,并找出最低值 一个 示例代码: Private Sub NBInv_Change() If NBInv.Text = "0" Or NBInv.Text = "" Then ActiveSheet.Sha

我正在学习VBA。两件事:

  • 还有什么比那长的更有效的吗 命令(我正在尝试查找最低的文本框值)
  • 形状显示在我的Excel工作表中,基于最低文本框值。这 工作,但只有当我改变NBInv文本框,这是有意义的。 然而,这不是我想要我的程序做的。我想要它 不断监视每个文本框的值,并找出最低值 一个
  • 示例代码:

    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)。