其他声明混淆

问题描述 投票:1回答:3
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。目前它执行SenseCheck如果初始条件If InStr(XXlist, checkmi) > 0是错误的,这不是我想要的。我并不完全确定如何解决这个问题。

excel vba excel-vba
3个回答
2
投票

这可能是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

1
投票

您已经在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

0
投票

扩展给定的答案,只是为了补充一点,您可以考虑通过为“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()潜艇之间的差异很小

© www.soinside.com 2019 - 2024. All rights reserved.