我有一个访问数据库,该数据库跟踪我们对员工的内部质量保证检查。它们有8个项目,我们对其进行跟踪,并且每个项目都有4个可能的值:
通过(1)
不及格(2)
仅供参考(3)
NP&FYI(4)。
您可以在“ CPT”顶部的左侧看到这4组。 [1]。我想发生的是,如果这8个字段中的任何一个都是FYI(ID 3),它将FYI复选框设置为true。如果ANY为不合格(ID 2),则将合格复选框设置为false。如果任何字段为NP&FYI(ID 4),我希望将两个复选框设置为不及格和FYI。我正在尝试的代码是:
Private Sub Form_AfterUpdate()
If (Me.Diagnosis And Me.CPT And Me.DOS And Me.UpDownCode And
Me.ChargeCorrections And Me.ChurnEsc And Me.Protocol And Me.BillServProv)
= 1 Then
Me.FYI = 0
Me.QAFail = -1
End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or
Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 2
Then
Me.QAFail = 0
End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or
Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 3
Then
Me.FYI = -1
End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or
Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 4
Then
Me.FYI = -1
Me.QAFail = 0
End If
End Sub
不幸的是,我得到的结果不一致。如果我将CPT之类的字段设置为不通过,则FYI复选框tic和QAFail框不会清除。如果将其他字段设置为其他值,则会得到各种不同的结果。我之所以假设它是因为连续的If语句解释的字段的可能值之间存在混淆。我曾考虑过使用CASE,但是我不知道如何根据8个不同的字段设置大小写值。我是VBA的新手,有人可以向我指出正确的方向吗?
6月7日的替代代码(有效)
Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis & .CPT & .DOS & .UpDownCode & _
.ChargeCorrections & .ChurnEsc & .Protocol & .BillServProv, "")
End With
If InStr(strCodes, 2) > 0 Then
Me.QAFail = 0
ElseIf InStr(strCodes, 3) > 0 Then
Me.txtFYI = -1
ElseIf InStr(strCodes, 4) > 0 Then
Me.txtFYI = -1
Me.QAFail = 0
ElseIf strCodes <> "" Then
Me.txtFYI = 0
Me.QAFail = -1
End If
End Sub
答案 0 :(得分:1)
If
条件返回True或False(-1或0)而不是要测试的1、2、3、4。每个If
块都会执行,因此最后一个符合条件的块将返回结果。使用ElseIf
,然后只使用一个End If
。使用With Me
块,而不必重复Me
限定词。为什么发布的代码不显示换行符?代码假定每个字段都有一个值。如果任何字段为Null或为空字符串,则ID 1的测试将始终返回False,即使其他7个字段的值为1。
With Me
If (.Diagnosis = 1 And .CPT = 1 And .DOS = 1 And .UpDownCode = 1 And _
.ChargeCorrections = 1 And .ChurnEsc = 1 And .Protocol = 1 And .BillServProv = 1) Then
...
ElseIf (...) Then
...
ElseIf (...) Then
...
ElseIf (...) Then
...
End If
End With
使用ElseIf
运算符对Or
表达式使用相同的语法。
确保测试值按优先级顺序排列。如果ID 3的优先级高于2和4,则首先测试3。我认为2优先,但您的叙述矛盾。
考虑备用代码:
Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis & .CPT & .DOS & .UpDownCode & _
.ChargeCorrections & .ChurnEsc & .Protocol & .BillServProv, "")
End With
If InStr(strCodes, 2) > 0 Then
...
ElseIf InStr(strCodes, 3) > 0 Then
...
ElseIf InStr(strCodes, 4) > 0 Then
...
ElseIf strCodes <> "" Then
...
End If