用户窗体的嵌套 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
我的 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