If trigger = "Reconcile" Then
If InStr(XXlist, checkmi) > 0 Then
If checkmi = "XX1000" Then
a = a + 1
Call XX1000Check(location, a, checkmi)
End If
If checkmi = "XX1001" Then
Call XX1001Check(location, checkmi)
End If
Else: Call SenseCheck(location, location2, location7, checkmi)
End If
End If
我希望我的代码检查Checkmi
是否等于其中一个硬编码(XX1000,XX1001),然后调用相应的VBA代码。但是,如果没有针对该特定代码的特定VBA模块,我希望它调用通用的SenseCheck
。目前它执行SenseChec
k如果初始条件If InStr(XXlist, checkmi) > 0
是错误的,这不是我想要的。我并不完全确定如何解决这个问题。
这可能是SELECT ... CASE语法的一个好地方
SELECT CASE checkmi
CASE "XX1000"
a = a + 1
Call XX1000Check(location, a, checkmi)
CASE "XX1001"
Call XX1001Check(location, checkmi)
CASE ELSE
SenseCheck(location, location2, location7, checkmi)
END SELECT
您已经在If
下面终止了End If
声明:
If checkmi = "XX1001" Then
Call XX1001Check(location, checkmi)
End If '<~~ termination point
你有一个开放的If
声明,你放置了你的Else
声明。
If InStr(XXlist, checkmi) > 0 Then
If checkmi = "XX1000" Then
a = a + 1
Call XX1000Check(location, a, checkmi)
End If
If checkmi = "XX1001" Then
Call XX1001Check(location, checkmi)
End If '<~~ termination point as pointed above
Else: Call SenseCheck(location, location2, location7, checkmi)
End If '<~~ termination point
所以Else
声明将与最顶端的非终止If
声明相关联。
这是你的第一个If
声明If InStr(XXlist, checkmi) > 0 Then
。
编辑1:要更正您的代码,请在终止整个Else
语句之前包含If
语句,并使用ElseIf
合并,但如果您有更多条件,则使用Select Case
是可取的。
If InStr(XXlist, checkmi) > 0 Then
If checkmi = "XX1000" Then
a = a + 1
Call XX1000Check(location, a, checkmi)
ElseIf checkmi = "XX1001" Then '<~~ incorporate ElseIf statement
Call XX1001Check(location, checkmi)
Else '<~~ transfer the Else statement here
Call SenseCheck(location, location2, location7, checkmi)
End If
End If
扩展给定的答案,只是为了补充一点,您可以考虑通过为“XX1000”和“XX1001”checkmi
值采用相同的子来增强代码并改进其维护
这是通过Sub / Function可以拥有的“可选”参数来实现的唯一要求,它们必须保留为签名中的最后一个参数
例如:
Sub XX100XCheck(checkmi As String, location As Long, Optional a As Variant)
需要传递前两个参数,并将第三个参数作为可选参数。并通过声明后者的Variant
类型,您可以检查它是否已经实际通过:
Sub XX100XCheck(checkmi As String, location As Long, Optional a As Variant)
If Not IsMissing(a) Then 'if "optional" 'a' parameter has actually been passed
' here place the code to process "optional" 'a' parameter
End If
'... rest of your code to handle "fixed" parameters
End Sub
这样你的问题代码就是:
Select Case checkmi
Case "XX1000"
a = a + 1
XX100XCheck checkmi, location, a ' call XX100Check sub passing all kind of parameters ("fixed" and "optional")
Case "XX1001"
XX100XCheck checkmi, location ' call the same sub as above, but now you're not passing it the "optional" a parameter
Case Else
SenseCheck(location, location2, location7, checkmi)
End Select
你可以在哪里使用(和维持)一个子(即XX100XCheck()
)而不是两个(即XX1000Check()
和XX1001Check()
)
当然这可能不是一种强制性的编码模式,因为它可能与另一种“良好实践”不一致,这种“良好实践”要求简单和简单的例程与“一体化”的例程相反。
所以这是一个平衡的问题(一如既往),我的建议是从你的代码猜测两个XX...Check()
潜艇之间的差异很小