用户窗体的嵌套 IF 语句

Nested IF statements for a User Form

我的 User-Form 为 "High Values" 和 "Low Values" 提供了 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

我会按如下方式进行:

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

  • 如果兼容与其"counterpart"控件一

    ,则让事件处理程序让控件假定用户输入值

    这个,通过一个 sub 来对照它的 "counterpart" one

  • 检查活动控制值

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

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

当然,Class 方法可以减轻编写所有这些 Private Sub optXXXX_BeforeUpdate() 事件处理程序的负担,并为当前编码和未来代码增强提供更大的灵活性,但如果您只坚持有三个单选按钮可能有点矫枉过正

顺便说一句,以上所有内容意味着您的 ShowInputsDialog() 潜艇不必关心选项按钮 兼容性 并且可以进行简单的 值分配 工作,为此我将使用 Select Case 语法而不是 If Then - Else If Then - End If 语法:

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