Vba 用户窗体的嵌套IF语句

Vba 用户窗体的嵌套IF语句,vba,excel,userform,Vba,Excel,Userform,我的用户表单为用户提供了3种颜色[红、绿、蓝]的选项,分别表示“高值”和“低值”。但是,用户必须为每种颜色选择一种颜色,当然,高值和低值的颜色不相同。这些颜色高亮显示数据中的低值和高值,以区分它们。我已经附上了我的用户表单的图片和我的代码部分,我无法分配不同的选项不同的颜色,以便它的工作。如果您能帮助我纠正IF逻辑,我们将不胜感激 Public Function ShowInputsDialog(LowColor As Long, HighValue As Single, High

我的用户表单为用户提供了3种颜色[红、绿、蓝]的选项,分别表示“高值”和“低值”。但是,用户必须为每种颜色选择一种颜色,当然,高值和低值的颜色不相同。这些颜色高亮显示数据中的低值和高值,以区分它们。我已经附上了我的用户表单的图片和我的代码部分,我无法分配不同的选项不同的颜色,以便它的工作。如果您能帮助我纠正IF逻辑,我们将不胜感激

       Public Function ShowInputsDialog(LowColor As Long, HighValue As Single, HighColor As Long, LowValue As Single)
Call Initialize
Me.Show
If Not Cancel Then
    If optRed1.Value Then '<-- Assigning the 3 colors to the Low Values
    LowColor = vbRed
    ElseIf optGreen1.Value Then
    LowColor = vbGreen
    Else
    LowColor = vbBlue
    End If
    If optRed2.Value Then HighColor = vbRed  '<-- Assigning the 3 colors to the High Values
    ElseIf optGreen2.Value Then HighColor = vbGreen
    Else
    HighColor = vbBlue
    End If
 End If
    HighValue = txtHigher.Value
    LowValue = txtLower.Value
ShowInputsDialog = Not Cancel
Unload Me
End Function
公共函数ShowInputsDialog(LowColor为长,HighValue为单,HighColor为长,LowValue为单)
调用初始化
给我看
如果不取消的话
如果optRed1.Value,那么'I将如下所示:

  • 为每个单选按钮添加
    BeforeUpdate()
    事件

  • 让事件处理程序让控件假设用户输入值(如果与“对应”控件兼容)

    这是通过检查主动控制值与“对应”值的sub实现的

例如,您可以在用户表单代码窗格中添加以下代码:

Private Sub optBlue1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub optBlue2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptGreen1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptGreen2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptRed1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptRed2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub CrossCheck()
    Dim optNr As String, optName As String

    With Me
        If .ActiveControl.ActiveControl.Value Then
            optName = .ActiveControl.ActiveControl.name
            optNr = Mid(optName, Len(optName), 1)
            .ActiveControl.ActiveControl.Value = Not (.ActiveControl.ActiveControl.Value = .Controls(Replace(optName, optNr, IIf(optNr = "1", "2", "1"))).Value)
        End If
    End With
End Sub
当然,
方法可以减轻编写所有这些
私有子optXXXX_BeforeUpdate()
事件处理程序的负担,并为当前的编码和未来的代码增强提供更大的灵活性,但是如果您坚持只使用三个单选按钮,可能会有点过头

顺便说一句,以上所有内容意味着您的
ShowInputsDialog()
子组件必须不关心选项按钮的兼容性,并且可以执行其普通值赋值工作,为此,我将使用选择大小写语法,而不是
If-Then-Else If-End If
one:

If Not Cancel Then
    Select Case True
        Case OptRed1.Value
            LowColor = vbRed
        Case OptGreen1.Value
            LowColor = vbGreen
        Case Else
            LowColor = vbBlue
    End Select

    Select Case True
        Case OptRed2.Value
            HighColor = vbRed
        Case OptGreen2.Value
            HighColor = vbGreen
        Case Else
            HighColor = vbBlue
    End Select
End If
或者,您可以使用帮助器函数:

Function GetColor(opt1 As MSForms.OptionButton, opt2 As MSForms.OptionButton) As Long
    Select Case True
        Case opt1.Value
            GetColor = vbRed
        Case opt2.Value
            GetColor = vbGreen
        Case Else
            GetColor = vbBlue
    End Select
End Function
然后简单地写

If Not Cancel Then        
    LowColor = GetColor(OptRed1, OptGreen1)
    HighColor = GetColor(OptRed2, OptGreen2)        
End If
我会这样说:

  • 为每个单选按钮添加
    BeforeUpdate()
    事件

  • 让事件处理程序让控件假设用户输入值(如果与“对应”控件兼容)

    这是通过检查主动控制值与“对应”值的sub实现的

例如,您可以在用户表单代码窗格中添加以下代码:

Private Sub optBlue1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub optBlue2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptGreen1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptGreen2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptRed1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub OptRed2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    CrossCheck
End Sub

Private Sub CrossCheck()
    Dim optNr As String, optName As String

    With Me
        If .ActiveControl.ActiveControl.Value Then
            optName = .ActiveControl.ActiveControl.name
            optNr = Mid(optName, Len(optName), 1)
            .ActiveControl.ActiveControl.Value = Not (.ActiveControl.ActiveControl.Value = .Controls(Replace(optName, optNr, IIf(optNr = "1", "2", "1"))).Value)
        End If
    End With
End Sub
当然,
方法可以减轻编写所有这些
私有子optXXXX_BeforeUpdate()
事件处理程序的负担,并为当前的编码和未来的代码增强提供更大的灵活性,但是如果您坚持只使用三个单选按钮,可能会有点过头

顺便说一句,以上所有内容意味着您的
ShowInputsDialog()
子组件必须不关心选项按钮的兼容性,并且可以执行其普通值赋值工作,为此,我将使用选择大小写语法,而不是
If-Then-Else If-End If
one:

If Not Cancel Then
    Select Case True
        Case OptRed1.Value
            LowColor = vbRed
        Case OptGreen1.Value
            LowColor = vbGreen
        Case Else
            LowColor = vbBlue
    End Select

    Select Case True
        Case OptRed2.Value
            HighColor = vbRed
        Case OptGreen2.Value
            HighColor = vbGreen
        Case Else
            HighColor = vbBlue
    End Select
End If
或者,您可以使用帮助器函数:

Function GetColor(opt1 As MSForms.OptionButton, opt2 As MSForms.OptionButton) As Long
    Select Case True
        Case opt1.Value
            GetColor = vbRed
        Case opt2.Value
            GetColor = vbGreen
        Case Else
            GetColor = vbBlue
    End Select
End Function
然后简单地写

If Not Cancel Then        
    LowColor = GetColor(OptRed1, OptGreen1)
    HighColor = GetColor(OptRed2, OptGreen2)        
End If