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

我也看到了这种行为以及其他错误,其中问题没有正确传达。为什么是这样?

4

3 回答 3

8

错误并非不正确。从解释器的角度来看,它遇到的第一个问题是你有一个Next内部With块,这当然是一个错误。

编译器和解释器( clang C 编译器可能例外)不擅长猜测两个可能的错误中的哪一个是您“想要”出现的错误。

于 2012-09-27T14:52:54.243 回答
4

您收到的错误消息是正确的。“Next without For”是错误消息,因为您的代码试图终止For代码块,同时仍在执行With代码块。NextEnd With都是终止语句,嵌套块必须以正确的顺序终止。

对错误消息的更通俗易懂的解读是:“您正在尝试终止一段For代码,但您当前处于某种类型的代码块中,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
于 2012-09-27T14:51:03.310 回答
1

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

编译错误:End With without 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

看起来它是后进先出(即 found End With,但前一个元素不是With.

于 2012-09-27T14:53:51.217 回答