【问题标题】:VBA for if -then- else statement用于 if -then- else 语句的 VBA
【发布时间】:2019-11-13 00:45:17
【问题描述】:

下面是我想出的代码,它从单元格 Q13 复制值,并将它们粘贴到 E 列中,直到列表完成(Q13 每次都使用新值更新)。我有一个条件,如果 Q13 读取“45”,则复制该值并将其粘贴到 p 列中。我知道这是一个 if -then- else 语句,但我得到了几个不同的编译错误(如果没有 end if 则阻塞,如果没有 if 则阻塞)并意识到这很可能是我的语法。如果有人可以对此进行评论,那就太棒了。

Sub Test()
Dim c As Range
Dim ws As Worksheet: Set ws = Sheet2
Dim range1 As Range: Set range1 = ws.Range("Q13")
Dim Cell As Range

For Each Cell In range1
If Cell.Value = "45" Then
    NextRow = ws.Cells(ws.Rows.Count, "P").End(xlUp).Offset(1, 0).Row
    Cell.Copy ws.Range("P" & NextRow)
    Else
 For Each c In Range("B2:B" & Range("B65536").End(xlUp).Row)
Dim R As Range
Set R = Worksheets("Sheet2").Cells(Rows.Count, "E").End(xlUp) 'last cell in Column E with data
 If Len(R.Value) > 0 Then Set R = R.Offset(1)
R.Value = Worksheets("Sheet2").Range("Q13").Value
Exit For
End If
Next ws
End If

【问题讨论】:

  • Google 错误 :) Next ws 例如 ws 没有循环
  • 正确的缩进可以帮助你找出语法错误。提示:您缺少Next
  • FWIW 没有必要在Next ws 中有ws(或任何东西):只需Next 就足够了。
  • @MathieuGuindon - Next ws 不应该抛出错误吗?启动它的 for 循环是 For each Cell...或者 VBA 实际上是否忽略了 Next 之后的任何内容? (我通常总是包含 Next 变量,例如 Next ws / Next Cell,所以我可以很容易地看到我在哪个循环中,但从未真正考虑过 VBA 是否真的“使用”了该信息。
  • @BruceWayne 是的,Next ws 是语法错误,因为 ws 不是循环变量。我从来没有在Next 中指定循环变量,因为如果那个循环变量有任何值,那么循环体可能做的事情太多,应该重构到它自己的过程范围内。在语法上只有一个循环变量在Next 标记之后是合法的,这就是最后进入的循环的循环变量。这种Next foo 语法的存在只是为了支持Next foo, bar 的纯粹可憎。

标签: excel vba compilation


【解决方案1】:

不要在Next关键字后面放循环变量,没用。它唯一能做的就是,如果你使用了错误的循环变量,VBA 会抛出一个编译器错误——就像这里的情况一样。如果循环体中有太多代码,以至于当你到达底部时你不再知道自己在哪里,那么循环体做的事情太多了。解决方案是将代码从循环体中提取到更小、更专业的过程中。

如果您不确定如何正确缩进代码,请使用indenter:它会使这种语法错误非常明显:

Dim c As Range
Dim ws As Worksheet: Set ws = Sheet2
Dim range1 As Range: Set range1 = ws.Range("Q13")
Dim Cell As Range

For Each Cell In range1
|   If Cell.Value = "45" Then
|   |   NextRow = ws.Cells(ws.Rows.Count, "P").End(xlUp).Offset(1, 0).Row
|   |   Cell.Copy ws.Range("P" & NextRow)
|   Else
|   |   For Each c In Range("B2:B" & Range("B65536").End(xlUp).Row)
|   |   |   Dim R As Range
|   \   |   Set R = Worksheets("Sheet2").Cells(Rows.Count, "E").End(xlUp) 'last cell in Column E with data
\   |\  /   If Len(R.Value) > 0 Then Set R = R.Offset(1)
 \  | \/    R.Value = Worksheets("Sheet2").Range("Q13").Value
  \ / /\    Exit For
   /\/  End If
  / Next
End If

If...Else...End If 块以Next 终止;内部For Each...Next 循环以End If 终止,外部For Each...Next 循环以End If 终止 - 你需要解开这个问题。

Dim c As Range
Dim ws As Worksheet: Set ws = Sheet2
Dim range1 As Range: Set range1 = ws.Range("Q13")
Dim Cell As Range

For Each Cell In range1
    If Cell.Value = "45" Then
        NextRow = ws.Cells(ws.Rows.Count, "P").End(xlUp).Offset(1, 0).Row
        Cell.Copy ws.Range("P" & NextRow)
    Else
        For Each c In Range("B2:B" & Range("B65536").End(xlUp).Row)
            Dim R As Range
            Set R = Worksheets("Sheet2").Cells(Rows.Count, "E").End(xlUp) 'last cell in Column E with data
            If Len(R.Value) > 0 Then Set R = R.Offset(1)
            R.Value = Worksheets("Sheet2").Range("Q13").Value
            Exit For
        Next
    End If
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多