错误16:expression太复杂 – 嵌套select案例

我得到了第二个代码块的“运行时错误16:expression式太复杂”。 我在网上阅读,嵌套expression式的最大允许数量是8,但是如果嵌套语句由每个“select案例”定义,那么我还没有打到。 这是可能的,因为案件依赖于一个variables? 第一个代码块显示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 

这实际上只是一个大的嵌套条件结构。 不要使用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块。 这应该已经照顾了“expression太复杂”的编译错误。

重构第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 

将其replace为:

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

重构步骤3 :在适用的情况下从IfElse分支中提取function和程序; 消除重复的分支, 不要重复自己

一旦你有一些工作,把它带到Code Review进一步的重构和简化的想法。