我在这段代码中遗漏了什么:"如果没有错误,还有什么?"

act*_*o99 3 excel vba if-statement

我正在尝试运行此代码,该代码首先声明wsD,然后WsS依赖于"数据"选项卡中的单元格.我一直在接受

否则没有错误.

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 9

If声明有两种法律语法.

排队:

If {bool-expression} Then {statement}
Run Code Online (Sandbox Code Playgroud)

并阻止:

If {bool-expression} Then
    {statements}
End If
Run Code Online (Sandbox Code Playgroud)

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

因此,由于语句完成,下一个语句开头ElseIf对编译器没有意义:有一个"else if if".


Raw*_*lus 7

有一个鲜为人知的事实(或者我怎么想提及它,微软的小恶作剧.),该If..Then..End If条件有实际上是两个既定形式:

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

根据MSDN,您基本上将多行和单行语法混合成一个糊状:

接下来的Then关键字进行检查以确定语句是否是单行If.如果Then在同一行之后出现除注释之外的任何内容,则该语句将被视为单行If语句.如果Then不存在,则必须是多行的开头If...Then...Else.

单行语句示例:

If <condition> Then <expression>
Run Code Online (Sandbox Code Playgroud)

和多行(你试图做什么):

If <condition> Then
  <expression>
ElseIf <condition> Then 'optional, note comment isn't evaluated as single-line expression
  <expression>
End If
Run Code Online (Sandbox Code Playgroud)

所以总结起来,你的代码抛出一个错误,因为ElseIf得到了作为评价<expression>If..Then声明,而不是评估一个有条件像你想要它.


不成文的规则是,总是用多行语法编写.
您不仅可以避免不必要的错误(就像您刚刚遇到的那样),而且在编码器中也很容易阅读和标准.


小智 6

您需要在新行上执行操作:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)