在VBA MS Access中嵌套If/Then

在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

我有一个包含7个不同里程碑的表格,包括每个里程碑的ACD和状态。我试图编写代码来创建一个总体状态,方法是从最后一个里程碑开始编写if/then to,检查ACD字段中的日期,并返回相应的状态。如果里程碑7有日期,则返回里程碑状态7。如果没有日期,那么它将检查milestone6acd是否有日期,如果有,则返回milestonestatus7。如果没有,它将检查milestone5 acd,如果有日期,则返回milestone6状态

这就是我所拥有的,而且效果很好

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)和标志