【问题标题】:What am I missing in this code: "Else without if error"?我在这段代码中遗漏了什么:“否则没有 if 错误”?
【发布时间】:2019-05-26 17:49:52
【问题描述】:

我正在尝试运行此代码,该代码首先声明wsD,然后根据“数据”选项卡中的单元格声明WsS。我不断收到一个

else 没有 if 错误。

Set wsD = ThisWorkbook.Sheets("Data")

    If wsD.Range("C4") = "AL" Then Set wsS = ThisWorkbook.Sheets("AL_Sim")
    ElseIf wsD.Range("C4") = "COLL" Then Set wsS = ThisWorkbook.Sheets("COLL_Sim")
    ElseIf wsD.Range("C4") = "COMP" Then Set wsS = ThisWorkbook.Sheets("COMP_Sim")
    ElseIf wsD.Range("C4") = "GL" Then Set wsS = ThisWorkbook.Sheets("GL_Sim")
    ElseIf wsD.Range("C4") = "EPL" Then Set wsS = ThisWorkbook.Sheets("EPL_Sim")
    ElseIf wsD.Range("C4") = "LAW" Then Set wsS = ThisWorkbook.Sheets("LAW_Sim")
    ElseIf wsD.Range("C4") = "POL" Then Set wsS = ThisWorkbook.Sheets("POL_Sim")

    End If
Next

【问题讨论】:

  • 这是一个 for 循环吗?在您的代码中看不到 for 。请粘贴所有您的代码

标签: excel vba if-statement


【解决方案1】:

If 语句有两种合法语法。

内联:

If {bool-expression} Then {statement}

并阻止:

If {bool-expression} Then
    {statements}
End If

因此,如果在Then 关键字之后的同一行中有一条语句,VBA 会将If 语句解析为内联语法。

因此,既然语句是完整的,那么以ElseIf 开头的下一条语句对编译器来说是没有意义的:存在“else without if”。

【讨论】:

    【解决方案2】:

    中有一个鲜为人知的事实(或者我喜欢这样称呼它,微软的小恶作剧..),即 If..Then..End If 条件实际上有两种既定形式:

    1. 单行语法
    2. 多行语法

    根据MSDN,您基本上将多行和单行语法混为一mush

    检查Then 关键字后面的内容以确定是否存在 语句是单行 If如果不是评论 出现在同一行的Then 之后,该语句被视为 单行 If 语句。 如果不存在 Then,则它必须是 多行If...Then...Else

    单行语句示例:

    If <condition> Then <expression>
    

    和多行(你试图做什么)

    If <condition> Then
      <expression>
    ElseIf <condition> Then 'optional, note comment isn't evaluated as single-line expression
      <expression>
    End If
    

    总而言之,您的代码引发了错误,因为 ElseIfIf..Then 语句之后被评估为 &lt;expression&gt;,而不是像您预期的那样评估条件它到。


    不成文的规则是,总是用多行语法书写
    不仅你会避开不必要的错误(就像你刚刚 遇到),但它也无疑更容易阅读和 编码员的标准。

    【讨论】:

      【解决方案3】:

      你需要换行:

      If wsD.Range("C4") = "AL" Then
          Set wsS = ThisWorkbook.Sheets("AL_Sim")
      ElseIf wsD.Range("C4") = "COLL" Then
          Set wsS = ThisWorkbook.Sheets("COLL_Sim")
      ElseIf wsD.Range("C4") = "COMP" Then
          Set wsS = ThisWorkbook.Sheets("COMP_Sim")
      ElseIf wsD.Range("C4") = "GL" Then
          Set wsS = ThisWorkbook.Sheets("GL_Sim")
      ElseIf wsD.Range("C4") = "EPL" Then
          Set wsS = ThisWorkbook.Sheets("EPL_Sim")
      ElseIf wsD.Range("C4") = "LAW" Then
          Set wsS = ThisWorkbook.Sheets("LAW_Sim")
      ElseIf wsD.Range("C4") = "POL" Then
          Set wsS = ThisWorkbook.Sheets("POL_Sim")
      End If
      

      Select Case 在这里会更好:

      Select Case wsD.Range("C4")
          Case Is = "AL"
              Set wsS = ThisWorkbook.Sheets("AL_Sim")
          Case Is = "COLL"
              Set wsS = ThisWorkbook.Sheets("COLL_Sim")
          Case Is = "COMP"
              Set wsS = ThisWorkbook.Sheets("COMP_Sim")
          Case Is = "GL"
              Set wsS = ThisWorkbook.Sheets("GL_Sim")
          Case Is = "EPL"
              Set wsS = ThisWorkbook.Sheets("EPL_Sim")
          Case Is = "LAW"
              Set wsS = ThisWorkbook.Sheets("LAW_Sim")
          Case Is = "POL"
              Set wsS = ThisWorkbook.Sheets("POL_Sim")
      End Select
      

      【讨论】:

      • 您也可以简化 Select Case,基于 Range 值和“_Sim”的连接。
      • 同意,还有其他修改,比如使用With 删除所有ThisWorkbook 引用,但我不知道其余代码是什么样的,所以我想要提供一个假设最少的解决方案。
      • 谢谢!没想到一条新线会有所作为。
      • 不客气,如果此解决方案解决了您遇到的问题,请将其标记为正确答案。
      猜你喜欢
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2011-08-31
      • 2023-03-31
      • 1970-01-01
      • 2022-06-12
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多