我得到了第二个代码块的“运行时错误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
答案 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步:从适用的If
和Else
分支中提取功能和程序;消除重复的分支,不要重复自己。
一旦你掌握了有用的东西,就把它带到Code Review进行进一步的重构和简化。