在VBA MS Access中嵌套If/Then
我有一个包含7个不同里程碑的表格,包括每个里程碑的ACD和状态。我试图编写代码来创建一个总体状态,方法是从最后一个里程碑开始编写if/then to,检查ACD字段中的日期,并返回相应的状态。如果里程碑7有日期,则返回里程碑状态7。如果没有日期,那么它将检查milestone6acd是否有日期,如果有,则返回milestonestatus7。如果没有,它将检查milestone5 acd,如果有日期,则返回milestone6状态 这就是我所拥有的,而且效果很好在VBA MS Access中嵌套If/Then,vba,ms-access,Vba,Ms Access,我有一个包含7个不同里程碑的表格,包括每个里程碑的ACD和状态。我试图编写代码来创建一个总体状态,方法是从最后一个里程碑开始编写if/then to,检查ACD字段中的日期,并返回相应的状态。如果里程碑7有日期,则返回里程碑状态7。如果没有日期,那么它将检查milestone6acd是否有日期,如果有,则返回milestonestatus7。如果没有,它将检查milestone5 acd,如果有日期,则返回milestone6状态 这就是我所拥有的,而且效果很好 If Not LaunchAnd
If Not LaunchAndReportingACD Then
Me.OverallInitiativeStatus = "Complete"
ElseIf Not FinalTargetingACD Then
Me.OverallInitiativeStatus = LaunchAndReportingStatus
ElseIf Not CommunicationsApprovalACD Then
Me.OverallInitiativeStatus = FinalTargetingStatus
ElseIf Not CommunicationsDevelopmentACD Then
Me.OverallInitiativeStatus = CommunicationsApprovalStatus
ElseIf Not VendorContractedACD Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not DesignApprovalACD Then
Me.OverallInitiativeStatus = VendorContractedStatus
ElseIf Not InitiativeDesignACD Then
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
我的问题是,其中两个里程碑可能不适用,我需要将它们传递过去,因为我不想报告不适用的总体状态。我单独编写代码来处理这个问题;但是,我无法将它与上面的代码完全合并在一起
If VendorContractedStatus = "Not Applicable" Then
If Not DesignApprovalACD Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not InitiativeDesignACD Then
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
End If
If VendorContractedStatus <> "Not Applicable" Then
If Not VendorContractedACD Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not DesignApprovalACD Then
Me.OverallInitiativeStatus = VendorContractedStatus
ElseIf Not InitiativeDesignACD Then
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
End If
如果卖方合同状态=“不适用”,则
如果未指定,则
Me.OverallInitiativeStatus=通信发展状态
否则,如果不是主动设计的话
Me.OVERALINITIVESTATUS=设计许可状态
其他的
Me.OverallInitiativeStatus=初始设计状态
如果结束
如果结束
如果卖方合同状态为“不适用”,则
如果不是卖方或承包商,则
Me.OverallInitiativeStatus=通信发展状态
否则,请不要指定Approvalac
Me.OVERALINITIVESTATUS=卖方合同状态
否则,如果不是主动设计的话
Me.OVERALINITIVESTATUS=设计许可状态
其他的
Me.OverallInitiativeStatus=初始设计状态
如果结束
如果结束
最终目标和卖方合同都可能不适用。如果它们中的任何一个是,我想继续编写代码来读取之前的里程碑,如果有acd,则返回之后的里程碑状态(如果Vendor Contracted Status不适用,我想检查DesignApprovalCD是否有日期,如果有,我想返回Communications Development Status作为我的总体状态,如果没有日期,我想检查InitiativeDesignCD是否有日期,如果有,返回DesignApproval Status作为总体状态,如果没有,返回Ini。)设计状态为总体状态)
我面临的问题是如何将所有信息流到一起。有没有更好的方法,或者创建if/then/elseif的最佳方法的建议
我还尝试了Select Case,执行单独的If/Then/End If语句,但未能使其返回正确的结果。在喝了早上的咖啡(并在代码中添加了大量注释)后,我想我已经能够了解您试图实现的目标 您应该能够将额外的条件添加到现有的
If
语句中:
If Not LaunchAndReportingACD Then
'If LaunchAndReportingACD is not Null, then project is Complete
Me.OverallInitiativeStatus = "Complete"
ElseIf Not FinalTargetingACD Then
'If FinalTargetingACD is not Null, we are in the LaunchAndReporting phase
Me.OverallInitiativeStatus = LaunchAndReportingStatus
ElseIf Not CommunicationsApprovalACD Then
'If CommunicationsApprovalACD is not Null, we are in the FinalTargeting phase,
' or the LaunchAndReporting phase (if there is no FinalTargeting phase)
If FinalTargetingStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = LaunchAndReportingStatus
Else
Me.OverallInitiativeStatus = FinalTargetingStatus
End If
ElseIf Not CommunicationsDevelopmentACD Then
'If CommunicationsDevelopmentACD is not Null, we are in the CommunicationsApproval phase
Me.OverallInitiativeStatus = CommunicationsApprovalStatus
ElseIf Not VendorContractedACD Then
'If VendorContractedACD is not Null, we are in the CommunicationsDevelopment phase
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not DesignApprovalACD Then
'If DesignApprovalACD is not Null, we are in the VendorContracted phase,
' or the CommunicationsDevelopment phase (if there is no VendorContracted phase)
If VendorContractedStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
Else
Me.OverallInitiativeStatus = VendorContractedStatus
End If
ElseIf Not InitiativeDesignACD Then
'If InitiativeDesignACD is not Null, we are in the DesignApproval phase
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
'We must be in the InitiativeDesign phase
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
注意:我输入了很多变量名,不仅仅是复制/粘贴,所以请检查以确保我没有引入任何意外的输入错误
另外,使用诸如
Not LaunchAndReportingACD
之类的代码作为测试非空值的方法(如果LaunchAndReportingACD
是一个Date
,我假设你就是这么做的)是令人困惑的。当然,这是可行的,但如果你说Not IsNull(LaunchAndReportingACD>,这会更容易理解
。对于那些在你换工作后不得不维护你的代码的人来说,混淆代码会让他们头疼。(同时也会让那些试图在早上6:00帮助回答SO问题的人感到困惑!)在我喝了早上的咖啡(并在代码中添加了很多注释)之后,我想我已经能够了解你想要实现的目标了
您应该能够将额外的条件添加到现有的If
语句中:
If Not LaunchAndReportingACD Then
'If LaunchAndReportingACD is not Null, then project is Complete
Me.OverallInitiativeStatus = "Complete"
ElseIf Not FinalTargetingACD Then
'If FinalTargetingACD is not Null, we are in the LaunchAndReporting phase
Me.OverallInitiativeStatus = LaunchAndReportingStatus
ElseIf Not CommunicationsApprovalACD Then
'If CommunicationsApprovalACD is not Null, we are in the FinalTargeting phase,
' or the LaunchAndReporting phase (if there is no FinalTargeting phase)
If FinalTargetingStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = LaunchAndReportingStatus
Else
Me.OverallInitiativeStatus = FinalTargetingStatus
End If
ElseIf Not CommunicationsDevelopmentACD Then
'If CommunicationsDevelopmentACD is not Null, we are in the CommunicationsApproval phase
Me.OverallInitiativeStatus = CommunicationsApprovalStatus
ElseIf Not VendorContractedACD Then
'If VendorContractedACD is not Null, we are in the CommunicationsDevelopment phase
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not DesignApprovalACD Then
'If DesignApprovalACD is not Null, we are in the VendorContracted phase,
' or the CommunicationsDevelopment phase (if there is no VendorContracted phase)
If VendorContractedStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
Else
Me.OverallInitiativeStatus = VendorContractedStatus
End If
ElseIf Not InitiativeDesignACD Then
'If InitiativeDesignACD is not Null, we are in the DesignApproval phase
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
'We must be in the InitiativeDesign phase
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
注意:我输入了很多变量名,不仅仅是复制/粘贴,所以请检查以确保我没有引入任何意外的输入错误
另外,使用诸如
Not LaunchAndReportingACD
之类的代码作为测试非空值的方法(如果LaunchAndReportingACD
是一个Date
,我假设你就是这么做的)是令人困惑的。当然,这是可行的,但如果你说Not IsNull(LaunchAndReportingACD>,这会更容易理解
。混淆代码会让那些在你换工作后不得不维护你的代码的人感到头疼。(也会让那些试图在早上6:00帮助回答SO问题的人感到困惑!)我想分享更新的版本,这多亏了对我的表单有效的输入。我接受了更新Not IsNull的建议,并修改了底部的另一行,到目前为止(我正在测试的59行中有5行),它工作得很好
If Not IsNull(LaunchAndReportingACD) Then
'If LaunchAndReportingACD is not Null, then project is Complete
Me.OverallInitiativeStatus = "Complete"
ElseIf Not IsNull(FinalTargetingACD) Then
'If FinalTargetingACD is not Null, we are in the LaunchAndReporting phase
Me.OverallInitiativeStatus = LaunchAndReportingStatus
ElseIf Not IsNull(CommunicationsApprovalACD) Then
'If CommunicationsApprovalACD is not Null, we are in the FinalTargeting phase,
' or the LaunchAndReporting phase (if there is no FinalTargeting phase)
If FinalTargetingStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = LaunchAndReportingStatus
Else
Me.OverallInitiativeStatus = FinalTargetingStatus
End If
ElseIf Not IsNull(CommunicationsDevelopmentACD) Then
'If CommunicationsDevelopmentACD is not Null, we are in the CommunicationsApproval phase
Me.OverallInitiativeStatus = CommunicationsApprovalStatus
ElseIf Not IsNull(VendorContractedACD) Then
'If VendorContractedACD is not Null, we are in the CommunicationsDevelopment phase
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
ElseIf Not IsNull(DesignApprovalACD) Then
'If DesignApprovalACD is not Null, we are in the VendorContracted phase,
' or the CommunicationsDevelopment phase (if there is no VendorContracted phase)
If VendorContractedStatus = "Not Applicable" Then
Me.OverallInitiativeStatus = CommunicationsDevelopmentStatus
Else
Me.OverallInitiativeStatus = VendorContractedStatus
End If
ElseIf Not IsNull(InitiativeDesignACD) Then
'If InitiativeDesignACD is not Null, we are in the DesignApproval phase
Me.OverallInitiativeStatus = DesignApprovalStatus
Else
'We must be in the InitiativeDesign phase
Me.OverallInitiativeStatus = InitiativeDesignStatus
End If
这也是显示整体状态的另一种方式。创建了一个循环函数以及一个标志,它循环通过以识别具有ECD的最后一个里程碑,然后返回下一个里程碑的状态。这在加载时在连续表单上起作用。我使用的是上面的if/then版本(因为这对我个人来说更容易管理),但我也想分享这一点,因为这是一种完全不同的方法(我个人喜欢看到人们做事情的方式不同)。再次感谢所有帮助过我的人
Private Sub Form_Current()
cycleThrough
End Sub
'Private Sub Form_Load()
'
'cycleThrough
'
'End Sub
Function cycleThrough()
Dim lastfield As String
Dim whichfield As String
Dim whichfield2 As String
Dim flag As Byte
flag = 0
Me.txt_overall.Value = "Hi"
If Not IsNull(txt_LaunchAndReportingACD.Value) Then
whichfield = "LaunchAndReporting"
flag = 1
End If
If Not IsNull(txt_FinalTargetingACD.Value) And flag = 0 Then
whichfield = "FinalTargeting"
flag = 1
End If
If Not IsNull(txt_CommunicationsApprovalACD.Value) And flag = 0 Then
whichfield = "CommunicationsApproval"
flag = 1
End If
If Not IsNull(txt_CommunicationsDevelopmentACD.Value) And flag = 0 Then
whichfield = "CommunicationsDevelopment"
flag = 1
End If
If Not IsNull(txt_VendorContractedACD.Value) And flag = 0 Then
whichfield = "VendorContracted"
flag = 1
End If
If Not IsNull(txt_DesignApprovalACD.Value) And flag = 0 Then
whichfield = "DesignApproval"
flag = 1
End If
If Not IsNull(txt_InitiativeDesignACD.Value) And flag = 0 Then
whichfield = "InitiativeDesign"
flag = 1
End If
Me.txt_overall.Value = whichfield
If whichfield = "LaunchAndReporting" Then
whichfield2 = "Green"
' then green
End If
' And txt_FinalTargetingStatus.Value <> "Not Applicable"
If whichfield = "FinalTargeting" Then
whichfield2 = txt_LaunchAndReportingStatus.Value
End If
If whichfield = "CommunicationsApproval" Then
If txt_LaunchAndReportingStatus.Value <> "Not Applicable" Then whichfield2 = txt_LaunchAndReportingStatus.Value
If txt_FinalTargetingStatus.Value <> "Not Applicable" Then whichfield2 = txt_FinalTargetingStatus.Value
End If
If whichfield = "CommunicationsDevelopment" Then
If txt_LaunchAndReportingStatus.Value <> "Not Applicable" Then whichfield2 = txt_LaunchAndReportingStatus.Value
If txt_FinalTargetingStatus.Value <> "Not Applicable" Then whichfield2 = txt_FinalTargetingStatus.Value
If txt_CommunicationsApprovalStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsApprovalStatus.Value
End If
If whichfield = "VendorContracted" Then
If txt_LaunchAndReportingStatus.Value <> "Not Applicable" Then whichfield2 = txt_LaunchAndReportingStatus.Value
If txt_FinalTargetingStatus.Value <> "Not Applicable" Then whichfield2 = txt_FinalTargetingStatus.Value
If txt_CommunicationsApprovalStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsApprovalStatus.Value
If txt_CommunicationsDevelopmentStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsDevelopmentStatus.Value
End If
If whichfield = "DesignApproval" Then
If txt_LaunchAndReportingStatus.Value <> "Not Applicable" Then whichfield2 = txt_LaunchAndReportingStatus.Value
If txt_FinalTargetingStatus.Value <> "Not Applicable" Then whichfield2 = txt_FinalTargetingStatus.Value
If txt_CommunicationsApprovalStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsApprovalStatus.Value
If txt_CommunicationsDevelopmentStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsDevelopmentStatus.Value
If txt_VendorContractedStatus.Value <> "Not Applicable" Then whichfield2 = txt_VendorContractedStatus.Value
End If
If whichfield = "InitiativeDesign" Then
If txt_LaunchAndReportingStatus.Value <> "Not Applicable" Then whichfield2 = txt_LaunchAndReportingStatus.Value
If txt_FinalTargetingStatus.Value <> "Not Applicable" Then whichfield2 = txt_FinalTargetingStatus.Value
If txt_CommunicationsApprovalStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsApprovalStatus.Value
If txt_CommunicationsDevelopmentStatus.Value <> "Not Applicable" Then whichfield2 = txt_CommunicationsDevelopmentStatus.Value
If txt_VendorContractedStatus.Value <> "Not Applicable" Then whichfield2 = txt_VendorContractedStatus.Value
If txt_DesignApprovalStatus.Value <> "Not Applicable" Then whichfield2 = txt_DesignApprovalStatus.Value
End If
Me.txt_whichStatus.Value = whichfield2
'txt_LaunchAndReportingStatus
'txt_LaunchAndReportingACD
'txt_FinalTargetingStatus
'txt_FinalTargetingACD
'txt_CommunicationsApprovalStatus
'txt_CommunicationsApprovalACD
'txt_CommunicationsDevelopmentStatus
'txt_CommunicationsDevelopmentACD
'txt_VendorContractedStatus
'txt_VendorContractedACD
'txt_DesignApprovalStatus
'txt_DesignApprovalACD
'txt_InitiativeDesignStatus
'txt_InitiativeDesignACD
End Function
Private子表单_Current()
环锭筛
端接头
'专用子表单_加载()
'
“骑自行车
'
'末端接头
函数cycleThrough()
将lastfield设置为字符串
像弦一样的暗域
作为字符串的字段2的尺寸
作为字节的Dim标志
标志=0
Me.txt_total.Value=“Hi”
如果不为空(txt_LaunchAndReportingACD.Value),则
whichfield=“启动和报告”
标志=1
如果结束
如果不为null(txt_FinalTargetingACD.Value)且标志=0,则
whichfield=“最终目标”
标志=1
如果结束
如果不是,则为NULL(txt_CommunicationsApprovalACD.Value)和标志