为什么Excel有时会产生“错误”的错误信息?

3

看下面的代码;我缺少一个End With,但是当编译时出现错误:Next without For,这是不正确的。

Option Explicit
Public Sub Payments()
    Dim ws As Worksheet
    '--> Format the original workbook
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .UsedRange.EntireColumn.Hidden = False

    Next

End Sub

我曾在其他错误情况下见到过这种行为,其中问题没有得到恰当的沟通。这是为什么呢?
3个回答

8
错误并不是不正确的。从解释器的角度来看,它遇到的第一个问题是你在 With 块中有一个 Next,这显然是一个错误。
编译器和解释器(除了 clang C 编译器可能是个例外)并不擅长猜测你“想要”的两个可能的错误中哪一个是你实际想要的。

+1 点赞 :-) 我不得不放弃我的帖子 LOL - Siddharth Rout
更加准确地说,在With块内部的Next是一个错误,因为该块内没有For语句? - Jook
@Jook:确切地说,解释器知道有错误,并且通过向上搜索作用域来确定用户想要使用哪个是一个相当无意义的练习,只是为了生成一个错误消息。而且这可能并不正确。 - Michael Myers
没错,我刚刚自己测试了一下 - 这是一个很好的练习:首先在“next”前面添加一个“for”来调试,然后添加一个“end with”在“next”后面调试,最后在“end with”后面添加一个“next”来调试。 - Jook

4
您收到的错误信息是正确的。"Next without For"是错误信息,因为您的代码试图在执行"With"代码块时终止"For"代码块。 "Next"和"End With"都是终止语句,嵌套块必须按正确的顺序终止。
更通俗易懂的错误信息是:"您正在尝试终止一个'For'代码块,但当前处于其他类型的代码块中,因此我不知道该怎么做。"实际上,您处于一个"With"代码块中,但编译器不够聪明以在其错误消息中包含该信息。因此,错误消息是正确的,但肯定可以改进。
我误解了示例中代码错误的故意性质。这里是一个无误差版本,供参考:
Option Explicit
Public Sub Payments()
    Dim ws As Worksheet
    '--> Format the original workbook
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .UsedRange.EntireColumn.Hidden = False
        End With
    Next
End Sub

1
您的问题是有效的。然而,这就是VB编译器/解释器的工作方式。
使用以下代码,它会抛出

编译错误:没有With的End With

Public Sub Payments()
    Dim ws As Worksheet
    '--> Format the original workbook
    With ws
        .UsedRange.EntireColumn.Hidden = False
    For Each ws In ThisWorkbook.Worksheets
    End With

End Sub

看起来它是后进先出的(即找到了End With,但前一个元素不是With)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接