错误16:表达式太复杂 - 嵌套选择案例

时间:2017-10-11 20:25:00

标签: excel vba excel-vba

我得到了第二个代码块的“运行时错误16:表达太复杂”。我在网上看到,嵌套表达式的最大允许数量是8,但如果嵌套语句是由每个“选择案例”定义的,那么我还没有点击它。是否可能是因为案例依赖于变量?第一个代码块显示egapend的可能值,而第二个代码块显示返回错误的代码。在此先感谢您的帮助。

首先:

Select Case ge1e2
    Case Is <= 0
        Select Case ge2e3
            Case Is <= 0
                egap18a = 0
                egap18b = 0
            Case Is > 0
                egap18a = 0
                egap18b = ge2e3
                egapend = Sheet1.[z1IE]
        End Select
    Case Is > 0
        Select Case ge2e3
            Case Is <= 0
                egap18a = ge1e2
                egap18b = 0
                egapend = Sheet1.[z1CZ]
            Case Is > 0
                Select Case ge1e2
                    Case Is >= 180
                        egap18a = ge1e2
                        egap18b = ge2e3
                        egapend = Sheet1.[z1CZ]
                    Case Is < 180
                        egap18a = ge1e2
                        egap18b = ge2e3
                        egapend = Sheet1.[z1IE]
                End Select
        End Select
End Select

第二

Dim e1length As Long
Dim e2length As Long
Dim cp121 As Boolean

e1length = DateDiff("d", Sheet1.[z1CZ], Sheet1.[z1DA])
e2length = DateDiff("d", Sheet1.[z1IE], Sheet1.[z1IF])

Select Case extendedgap
    Case True
        Select Case egapend
            Case Sheet1.[z1IE] 'end of egap is start of E2
                Select Case e2length 'was borrower employed by E2 for more than 6 months?
                    Case Is >= 180
                        cp121 = True
                    Case Is < 180
                        Select Case ge1e2 'if not, was there a gap between E1 and E2
                            Case Is > 1
                                cp121 = False
                            Case Else
                                Select Case DateDiff("d", Sheet1.[z1IE], Sheet1.[z1DA]) 'If not, was employment between E1/E2 6 mos?
                                    Case Is >= 180
                                        cp121 = True
                                    Case Is < 180
                                        cp121 = False
                                End Select
                        End Select
                End Select
            Case Sheet1.[z1CZ] 'end of egap is start of E1
                Select Case DateDiff("d", Sheet1.[z1CZ], Sheet1.[z1DA]) 'was borrower employed by E1 for at least 6 mos?
                    Case Is >= 180
                        cp121 = True
                    Case Is < 180
                        cp121 = False
                End Select
        End Select

1 个答案:

答案 0 :(得分:9)

它实际上只是一个大型嵌套条件结构。不要使用Select...Case。使用它,例如当你查看一些枚举值时:

Select Case MsgBox("Yes, no, or cancel?", vbYesNoCancel)
    Case vbYes
        'stuff
    Case vbNo
        'stuff
    Case vbCancel
        'stuff
End Select

重构步骤1 :将所有这些2分支Select...Case块转换为If...Else...End If块。这应该已经处理过太复杂的表达了#34;编译错误。

重构步骤2 :实现布尔分配:

例如,在一个地方 两个地方你有:

Select Case DateDiff("d", Sheet1.[z1IE], Sheet1.[z1DA]) 'If not, was employment between E1/E2 6 mos?
    Case Is >= 180
        cp121 = True
    Case Is < 180
        cp121 = False
End Select

将其替换为:

cp121 = (DateDiff("d", Sheet1.[z1IE], Sheet1.[z1DA]) >= 180)

重构第3步:从适用的IfElse分支中提取功能和程序;消除重复的分支,不要重复自己

一旦你掌握了有用的东西,就把它带到Code Review进行进一步的重构和简化。