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