Next 没有错误 VBA

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19085096/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 16:46:19  来源:igfitidea点击:

Next Without For Error VBA

excelvbafor-loop

提问by user2829591

I have the following code and VBA is giving me a "Next Without For" Error when I definitely have both. I know that VBA can list errors that are not exactly the same as what it says they are, but I can't find any other closed loops. If someone could check this out, that would be awesome! Thanks:

我有以下代码,当我肯定同时拥有这两个代码时,VBA 给了我一个“Next without For”错误。我知道 VBA 可以列出与它所说的不完全相同的错误,但我找不到任何其他闭环。如果有人可以检查一下,那就太棒了!谢谢:

Option Explicit
Sub HW09()

    Dim ng As Integer
    Dim v As String
    Dim lg As String
    Dim ca As Integer
    Dim sd As Integer
    Dim c As Integer
    Dim r As Integer

    c = 2

    Do
        ng = InputBox("Please enter the student's numerical grade.")
        If ng < 0 Then
            ng = 0
        If ng > 100 Then
            ng = 100
        End If

        Cells(c, 2).Value (ng)
        c = c + 1

        v = InputBox("Would you like to enter another grade? Type 'Y' for yes and 'N' for no.")
        If v = "N" Then Exit Do
        End If

    Loop

    Cells(1, 2).Value ("Numerical Grade")
    Cells(1, 1).Value ("Letter Grade")

    For r = 1 To c
        If Cells(r, 2) >= 90 Then
            lg = "A"
            Cells(r, 1).Value (lg)
        If Cells(r, 2) >= 80 Then
            lg = "B"
            Cells(c, 1).Value (lg)
        If Cells(r, 2) >= 70 Then
            lg = "C"
            Cells(c, 1).Value (lg)
        If Cells(r, 2) >= 60 Then
            lg = "D"
            Cells(c, 1).Value (lg)
        Else
            lg = "F"
            Cells(c, 1).Value (lg)
        End If

        r = r + 1

    Next r

    c = c - 1

    ca = Application.WorksheetFunction.Average("(1,2):(1,c)")
    If ca >= 90 Then
        lg = "A"
    If ca >= 80 Then
        lg = "B"
    If ca >= 70 Then
        lg = "C"
    If ca >= 60 Then
        lg = "D"
    Else
        lg = "F"
    End If

    MsgBox ("The average letter grade for these " & (c) & " students is " & (lg) & ".")
    sd = c * (Application.WorksheetFunction.Sum("(1, 2)(1, c) ^ 2)")-Application.WorksheetFunction.Sum("(1, 2)(1, c)") ^ 2 / (c * (c - 1)))
    MsgBox ("The standard deviation for these grades is" & (sd) & ".")

End Sub

回答by Drew Chapin

Your problem is you are doing If... Then... If... Then...instead of If... Then... ElseIf... Then...

你的问题是你正在做If... Then... If... Then...而不是If... Then... ElseIf... Then...

If Cells(r, 2) >= 90 Then
    lg = "A"
    Cells(r, 1).Value (lg)
ElseIf Cells(r, 2) >= 80 Then
    lg = "B"
    Cells(c, 1).Value (lg)
ElseIf Cells(r, 2) >= 70 Then
    lg = "C"
    Cells(c, 1).Value (lg)
ElseIf Cells(r, 2) >= 60 Then
    lg = "D"
    Cells(c, 1).Value (lg)
Else
    lg = "F"
    Cells(c, 1).Value (lg)
End If

回答by Greg J

Every IF statementneeds to be terminated with an ENDIF.
Within the FOR/NEXT loopyou have 4 IFs, one ELSEand one ENDIFthis needs to be changed to:

每个都IF statement需要以ENDIF.
FOR/NEXT loop你有 4 IFs, one ELSEand oneENDIF这需要更改为:

IF Condition1 THEN
  'code
 ELSEIF Condition2 THEN
  'code
 ELSEIF Condition3 THEN
  'code
 ELSEIF Condition4 THEN
  'code
 ELSE 'All other possibilities
  'code
ENDIF

回答by David Zemens

I think the nested Ifstatements inside For r = 1 to c...don't close properly? Generally, each Ifalso requires an End If, and you only have one End Ifstatement. This is causing the compiler to reach the Next rstatement while it's still "inside" an Ifblock, thus the error raises, and makes sense.

我认为If里面的嵌套语句For r = 1 to c...没有正确关闭?通常,每个If还需要一个End If,而您只有一个End If语句。这导致编译器在Next r语句仍在If块“内部”时到达该语句,因此会引发错误并且是有道理的。

You may look in to using a Select Caseswitch instead of nesting several If/Thenstatements. In my experience, they're more easy to interpret when you're debugging. Something like:

您可能会考虑使用Select Caseswitch 而不是嵌套多个If/Then语句。根据我的经验,在调试时它们更容易解释。就像是:

For r = 1 To c
    Select Case Cells(r,2)
        Case >= 90
           lg = "A"

        Case >= 80
           lg = "B"

        Case >= 70
           lg = "C"

        Case >= 60
           lg = "D"
        Case Else
           lg = "F"
     End Select
     Cells(r,1).Value = lg


r = r + 1  '## You may want to omit this line, see my comments.


Next r

Note: You may want to omit the r = r+1unless you're intending to skip every other record, the Nextstatement automatically increments rby a value of 1unless otherwise specified.

注意:r = r+1除非您打算跳过所有其他记录,否则您可能希望省略,除非另有指定,否则该Next语句会自动增加r一个值1

If you do intend to skip every other record, you should do For r = 1 to c Step 2and likewise omit the r = r+1.

如果您确实打算跳过所有其他记录,则应该这样做For r = 1 to c Step 2并同样省略r = r+1.

回答by gadolf

This error occurs when the condition is not closed. You must don't forger close if conditions.

当条件未关闭时会发生此错误。如果条件允许,您一定不要伪造 close。

for example:

例如:

Public Sub start_r()

    LastRow = SPT_DB.Range("D" & Rows.count).End(xlUp).Row

Dim i As Long
For i = 3 To 132

    State = Cells(1, i)

    Dim j As Long
    For j = 2 To LastRow

        m = SPT_DB.Cells(j, 4).Value
        z = SPT_DB.Cells(j, 5).Value
        n1 = SPT_DB.Cells(j, 6).Value
        fc = SPT_DB.Cells(j, 7).Value
        am = SPT_DB.Cells(j, 8).Value
        sp = SPT_DB.Cells(j, 10).Value
        sr = SPT_DB.Cells(j, 11).Value
        liq = SPT_DB.Cells(j, 13).Value

        num1 = Val(Left(State, 1))
        num2 = Val(Mid(State, 3, 1))
        num3 = Val(Mid(State, 5, 1))
        num4 = Val(Mid(State, 7, 1))
        num5 = Val(Mid(State, 9, 1))

        Dim spt_class As spt_class
        Set spt_class = New spt_class

        Select Case num1
            Case Is = 1: Call spt_class.rd_r1
            Case Is = 2: Call spt_class.rd_r2
            Case Is = 3: Call spt_class.rd_r3
            Case Is = 4: Call spt_class.rd_r4
        End Select

        Select Case num2
            Case Is = 1: Call spt_class.msf_r1
            Case Is = 2: Call spt_class.msf_r2
            Case Is = 3: Call spt_class.msf_r3
            Case Is = 4: Call spt_class.msf_r4
            Case Is = 5: Call spt_class.msf_r5
            Case Is = 6: Call spt_class.msf_r6
        End Select

        Select Case num3
            Case Is = 0:
            Case Is = 1: Call spt_class.n1_cs_r1
            Case Is = 2: Call spt_class.n1_cs_r2
            Case Is = 3: Call spt_class.n1_cs_r3
        End Select

        Select Case num4
            Case Is = 0:
            Case Is = 1: Call spt_class.dr_r1
            Case Is = 2: Call spt_class.dr_r2
            Case Is = 3: Call spt_class.dr_r3
            Case Is = 4: Call spt_class.dr_r4
        End Select

        Select Case num5
            Case Is = 1: Call spt_class.crr_r1
            Case Is = 2: Call spt_class.crr_r2
            Case Is = 3: Call spt_class.crr_r3
            Case Is = 4: Call spt_class.crr_r4
            Case Is = 5: Call spt_class.crr_r5
            Case Is = 6: Call spt_class.crr_r6
            Case Is = 7: Call spt_class.crr_r7
            Case Is = 8: Call spt_class.crr_r8
            Case Is = 9: Call spt_class.crr_r9
        End Select

        Call spt_class.lvr_r

    Next j


        If cnt_f_1_all = 0 Then
            Cells(4, i) = 0
        Else
            Cells(4, i) = cnt_f_1_liq * 100 / cnt_f_1_all
            Cells(4, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_2_all = 0 Then
            Cells(5, i) = 0
        Else
            Cells(5, i) = cnt_f_2_liq * 100 / cnt_f_2_all
            Cells(5, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_3_all = 0 Then
            Cells(6, i) = 0
        Else
            Cells(6, i) = cnt_f_3_liq * 100 / cnt_f_3_all
            Cells(6, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_4_all = 0 Then
            Cells(7, i) = 0
        Else
            Cells(7, i) = cnt_f_4_liq * 100 / cnt_f_4_all
            Cells(7, i).NumberFormat = "#,##0.00"
        End If


        If cnt_f_n0_1_all = 0 Then
            Cells(14, i) = 0
        Else
            Cells(14, i) = cnt_f_n0_1_liq * 100 / cnt_f_n0_1_all
            Cells(14, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n0_2_all = 0 Then
            Cells(15, i) = 0
        Else
            Cells(15, i) = cnt_f_n0_2_liq * 100 / cnt_f_n0_2_all
            Cells(15, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n0_3_all = 0 Then
            Cells(16, i) = 0
        Else
            Cells(16, i) = cnt_f_n0_3_liq * 100 / cnt_f_n0_3_all
            Cells(16, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n0_4_all = 0 Then
            Cells(17, i) = 0
        Else
            Cells(17, i) = cnt_f_n0_4_liq * 100 / cnt_f_n0_4_all
            Cells(17, i).NumberFormat = "#,##0.00"
        End If


        If cnt_f_n1_1_all = 0 Then
            Cells(24, i) = 0
        Else
            Cells(24, i) = cnt_f_n1_1_liq * 100 / cnt_f_n1_1_all
            Cells(24, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n1_2_all = 0 Then
            Cells(25, i) = 0
        Else
            Cells(25, i) = cnt_f_n1_2_liq * 100 / cnt_f_n1_2_all
            Cells(25, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n1_3_all = 0 Then
            Cells(26, i) = 0
        Else
            Cells(26, i) = cnt_f_n1_3_liq * 100 / cnt_f_n1_3_all
            Cells(26, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n1_4_all = 0 Then
            Cells(27, i) = 0
        Else
            Cells(27, i) = cnt_f_n1_4_liq * 100 / cnt_f_n1_4_all
            Cells(27, i).NumberFormat = "#,##0.00"
        End If


        If cnt_f_n2_1_all = 0 Then
            Cells(34, i) = 0
        Else
            Cells(34, i) = cnt_f_n2_1_liq * 100 / cnt_f_n2_1_all
            Cells(34, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n2_2_all = 0 Then
            Cells(35, i) = 0
        Else
            Cells(35, i) = cnt_f_n2_2_liq * 100 / cnt_f_n2_2_all
            Cells(35, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n2_3_all = 0 Then
            Cells(36, i) = 0
        Else
            Cells(36, i) = cnt_f_n2_3_liq * 100 / cnt_f_n2_3_all
            Cells(36, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n2_4_all = 0 Then
            Cells(37, i) = 0
        Else
            Cells(37, i) = cnt_f_n2_4_liq * 100 / cnt_f_n2_4_all
            Cells(37, i).NumberFormat = "#,##0.00"
        End If


        If cnt_f_n3_1_all = 0 Then
            Cells(44, i) = 0
        Else
            Cells(44, i) = cnt_f_n3_1_liq * 100 / cnt_f_n3_1_all
            Cells(44, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n3_2_all = 0 Then
            Cells(45, i) = 0
        Else
            Cells(45, i) = cnt_f_n3_2_liq * 100 / cnt_f_n3_2_all
            Cells(45, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n3_3_all = 0 Then
            Cells(46, i) = 0
        Else
            Cells(46, i) = cnt_f_n3_3_liq * 100 / cnt_f_n3_3_all
            Cells(46, i).NumberFormat = "#,##0.00"
        End If
        If cnt_f_n3_4_all = 0 Then
            Cells(47, i) = 0
        Else
            Cells(47, i) = cnt_f_n3_4_liq * 100 / cnt_f_n3_4_all
            Cells(47, i).NumberFormat = "#,##0.00"
        End If

Next i

        cnt_f_1_liq = 0
        cnt_f_2_liq = 0
        cnt_f_3_liq = 0
        cnt_f_4_liq = 0
        cnt_f_1_all = 0
        cnt_f_2_all = 0
        cnt_f_3_all = 0
        cnt_f_4_all = 0

        cnt_f_n0_1_liq = 0
        cnt_f_n0_2_liq = 0
        cnt_f_n0_3_liq = 0
        cnt_f_n0_4_liq = 0
        cnt_f_n0_1_all = 0
        cnt_f_n0_2_all = 0
        cnt_f_n0_3_all = 0
        cnt_f_n0_4_all = 0

        cnt_f_n1_1_liq = 0
        cnt_f_n1_2_liq = 0
        cnt_f_n1_3_liq = 0
        cnt_f_n1_4_liq = 0
        cnt_f_n1_1_all = 0
        cnt_f_n1_2_all = 0
        cnt_f_n1_3_all = 0
        cnt_f_n1_4_all = 0

        cnt_f_n2_1_liq = 0
        cnt_f_n2_2_liq = 0
        cnt_f_n2_3_liq = 0
        cnt_f_n2_4_liq = 0
        cnt_f_n2_1_all = 0
        cnt_f_n2_2_all = 0
        cnt_f_n2_3_all = 0
        cnt_f_n2_4_all = 0

        cnt_f_n3_1_liq = 0
        cnt_f_n3_2_liq = 0
        cnt_f_n3_3_liq = 0
        cnt_f_n3_4_liq = 0
        cnt_f_n3_1_all = 0
        cnt_f_n3_2_all = 0
        cnt_f_n3_3_all = 0
        cnt_f_n3_4_all = 0

End Sub