Excel if-then-else语句的VBA

Excel if-then-else语句的VBA,excel,vba,compilation,Excel,Vba,Compilation,下面是我找到的代码,它从单元格Q13复制值,并将它们粘贴到列E中,直到列表完成。Q13每次都用新值更新。我有一个条件,如果Q13读取45,复制该值并粘贴到p列中。我知道这是一个if-then-else语句,但是我得到了两个不同的编译错误块if-without-end-if和if-without-block-if,并且意识到这很可能是我的语法。如果有人能回顾这一点,那就太棒了 Sub Test() Dim c As Range Dim ws As Worksheet: Set ws = Sheet

下面是我找到的代码,它从单元格Q13复制值,并将它们粘贴到列E中,直到列表完成。Q13每次都用新值更新。我有一个条件,如果Q13读取45,复制该值并粘贴到p列中。我知道这是一个if-then-else语句,但是我得到了两个不同的编译错误块if-without-end-if和if-without-block-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

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

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

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终止;每个…下一个循环的内部以End If终止,每个…下一个循环的外部以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

谷歌错误:下一个ws例如ws没有一个循环考虑使用一个使嵌套结构看起来。。。嵌套的。它有助于对齐代码块的开头和结尾。适当的缩进将有助于跟踪语法错误。提示:您缺少一个Next。@BruceWayne是的,Next ws是一个语法错误,因为ws不是循环变量。我从不在Next中指定循环变量,因为如果该循环变量有任何值,那么循环体可能做了太多事情,应该重构到它自己的过程范围中。在语法上,只有一个循环变量在下一个标记之后立即合法,这就是上次输入的循环的循环变量。这个Next foo语法的存在只是为了支持Next foo,bar是一个非常讨厌的东西。@BruceWayne For foo=1到10;对于bar=1到10;调试。打印foo,bar;下一个foo,bar-信不信由你,这是合法的!在UBERDUCK++上工作时学习的内容;