首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在这段代码中遗漏了什么:“否则没有错误”?

我在这段代码中遗漏了什么:“否则没有错误”?
EN

Stack Overflow用户
提问于 2018-09-25 21:15:08
回答 3查看 575关注 0票数 3

我试图运行这段代码,它首先声明wsD,然后根据"Data“选项卡中的单元格声明WsS。我一直得到一个

否则就不会出错。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 21:17:44

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

代码语言:javascript
复制
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会更好:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2018-09-25 21:27:58

If语句有两个合法的语法。

内联:

代码语言:javascript
复制
If {bool-expression} Then {statement}

和区块:

代码语言:javascript
复制
If {bool-expression} Then
    {statements}
End If

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

因此,由于语句已经完成,下一个以ElseIf开头的语句对编译器没有任何意义:有一个“否则如果”。

票数 10
EN

Stack Overflow用户

发布于 2018-09-25 21:32:59

有一个鲜为人知的事实(或者我喜欢怎么称呼它,微软的一个小小的恶作剧)在If..Then..End If中,vba条件实际上有两个已建立的表单:

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

您基本上将多行和单行语法混合为一个mush,如MSDN所示。

将检查Then关键字后面的内容,以确定语句是否为单行If。如果在同一行的Then 之后出现了注释以外的任何其他内容,则该语句将被视为单行If语句。如果没有Then,则必须将其作为多行If...Then...Else的开始。

单行语句的示例:

代码语言:javascript
复制
If <condition> Then <expression>

和多行(你想要做的)

代码语言:javascript
复制
If <condition> Then
  <expression>
ElseIf <condition> Then 'optional, note comment isn't evaluated as single-line expression
  <expression>
End If

因此,总之,您的代码抛出了一个错误,因为ElseIfIf..Then语句之后被计算为一个<expression>,而不是按照您的意愿对一个条件进行计算。

不成文的规则是,总是用多行语法编写。 不仅你会避免不必要的错误(就像你刚刚遇到的那样),而且它也无疑更容易阅读和编码者之间的标准。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52506801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档