【问题标题】:Syntax Errors in VBAVBA 中的语法错误
【发布时间】:2016-12-26 19:57:09
【问题描述】:

我不断收到错误(没有 if 或循环没有 do),我真的不知道为什么......有人可以帮忙吗?!谢谢!

Do Until (Range("I4").Value = 0)

    For i = 2 To lLastrow

                If Range("G" & i).Value = 0 Then
                    i = i + 1

                ElseIf Range("G" & i).Value < 0 Then
                      Do Until (Range("G" & i).Value = 0)
                      For j = 0 To i
                         If Range("F" & i - j).Value < 0 Then
                               Range("F" & i - j).Value = Range("F" & i - j).Value + 1
                              Else: j = j + 1
                              End If
                             Application.Calculate
                        Loop
                    ElseIf Range("G" & i).Value > 0 Then
                        Do Until (Range("G" & i).Value = 0)
                            For k = 0 To i
                             If Range("F" & i - k).Value > 0 Then
                              Range("F" & i - k).Value = Range("F" & i - k).Value - 1
                                   Else: k = k + 1
                                   End If
                               Application.Calculate
                        Loop
                End If


            Application.Calculate
Loop

【问题讨论】:

  • 您的For 循环缺少Next
  • 这就是正确缩进很重要的原因。

标签: vba loops if-statement syntax


【解决方案1】:

您缺少 Next 声明为所有您 Forloops

试试下面的代码

Do Until (Range("I4").Value = 0)

    For i = 2 To lLastrow
      If Range("G" & i).Value = 0 Then
        i = i + 1
      ElseIf Range("G" & i).Value < 0 Then
        Do Until (Range("G" & i).Value = 0)
           For j = 0 To i
             If Range("F" & i - j).Value < 0 Then
                Range("F" & i - j).Value = Range("F" & i - j).Value + 1
             Else
                j = j + 1
             End If
             Application.Calculate
             Next'You missed this
         Loop
       ElseIf Range("G" & i).Value > 0 Then
          Do Until (Range("G" & i).Value = 0)
            For k = 0 To i
              If Range("F" & i - k).Value > 0 Then
                 Range("F" & i - k).Value = Range("F" & i - k).Value - 1
              Else
                k = k + 1
            End If
            Application.Calculate
            Next 'You missed this
          Loop
       End If

        Application.Calculate
    Next 'You missed this
Loop

【讨论】:

    【解决方案2】:

    尝试用您拥有的代码替换下面的代码。您的每个 For 循环都缺少 NextDoLoop 一起出现,同样ForNext 一起出现(它们构成了循环的基础)。

    这是代码,我也清理了它以便更容易理解。

    Do Until (Range("I4").Value = 0)
        For i = 2 To lLastrow
            If Range("G" & i).Value = 0 Then
                i = i + 1
            ElseIf Range("G" & i).Value < 0 Then
                Do Until (Range("G" & i).Value = 0)
                    For j = 0 To i
                        If Range("F" & i - j).Value < 0 Then
                            Range("F" & i - j).Value = Range("F" & i - j).Value + 1
                        Else
                            j = j + 1
                        End If
                        Application.Calculate
                    Next j
                Loop
            ElseIf Range("G" & i).Value > 0 Then
                Do Until (Range("G" & i).Value = 0)
                    For k = 0 To i
                        If Range("F" & i - k).Value > 0 Then
                            Range("F" & i - k).Value = Range("F" & i - k).Value - 1
                        Else
                            k = k + 1
                        End If
                        Application.Calculate
                    Next k
                Loop
            End If
        Next i
        Application.Calculate
    Loop
    

    【讨论】:

    • +1 花时间干净地缩进代码。此外,为了改进代码控制和调试,我总是让每个Next 后跟它的迭代器变量(Next jNext kNext i)。您可能也想编辑您的代码并将其放入其中
    • 按照您的建议添加了下一个后缀
    • @user3598756 IMO 将迭代器变量添加到 Next 语句只是轻微的混乱 - 如果您需要它们以提高可读性,那么您的代码可能过于嵌套(其中, 6 层深,绝对是这里的情况),你应该重构(提取方法)而不是添加 more 视觉噪音。
    • @Mat's Mug 同意经验丰富的开发人员使用,但对于刚刚学习基础知识的人(对于 OP 来说这似乎是正确的),我认为了解它们之间的关系是有帮助的。如果没有迭代器,它会使关系更难可视化。当我编码时,我不添加迭代器。
    • 谢谢大家!是的,非常学习基础知识,感谢您的提示
    【解决方案3】:

    这就是为什么正确一致缩进很重要:

    Do Until (Range("I4").Value = 0)
    |   For i = 2 To lLastrow
    |   |   If Range("G" & i).Value = 0 Then
    |   |   |   i = i + 1
    |   |   ElseIf Range("G" & i).Value < 0 Then
    |   |   |   Do Until (Range("G" & i).Value = 0)
    |   |   |   |   For j = 0 To i
    |   |   |   |   |   If Range("F" & i - j).Value < 0 Then
    |   |   |   |   |   |   Range("F" & i - j).Value = Range("F" & i - j).Value + 1
    |   |   |   |   |   Else
    |   |   |   |   |   |   j = j + 1
    |   |   |   |   |   End If
    |   |   |   |   |   Application.Calculate
    |   |   |   |   Next '<<<<<<< MISSING!!
    |   |   |   Loop
    |   |   ElseIf Range("G" & i).Value > 0 Then
    |   |   |   Do Until (Range("G" & i).Value = 0)
    |   |   |   |   For k = 0 To i
    |   |   |   |   |   If Range("F" & i - k).Value > 0 Then
    |   |   |   |   |   |   Range("F" & i - k).Value = Range("F" & i - k).Value - 1
    |   |   |   |   |   Else
    |   |   |   |   |   |   k = k + 1
    |   |   |   |   |   End If
    |   |   |   |   |   Application.Calculate
    |   |   |   |   Next '<<<<<<< MISSING!!
    |   |   |   Loop
    |   |   End If
    |   |   Application.Calculate
    |   Next '<<<<<<< MISSING!!
    Loop
    

    现在,这里有 6 层嵌套,而且有很多重复。这表明您需要从内部嵌套代码中重构提取过程,以消除冗余并提高代码的可读性和可维护性(一次修改应该 表示一个地方更改代码)。

    如果您的代码按预期工作,我建议您将其(整个过程,甚至整个模块!)交给Code Review 进行清理和改进和巩固您的代码的提示(例如,您可能不'不需要像你那样经常Calculate,而且不合格的Range 调用会隐式引用活动工作表——这可能会导致以后出现意外错误!)。

    【讨论】:

    • 感谢您的提示,我现在就去那里!非常依赖基础知识,所以我知道它很不整洁,对不起!
    • @AlexW 如果您坚持并定期在Code Review 上提交您的工作代码以供审查,您将很快学会如何编写干净、可维护的代码。另一边见!
    • 我希望如此!我会继续练习
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多