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 コンパイラーは例外の可能性があります) は、考えられる 2 つのエラーのうち、どちらが「意図した」エラーであるかを推測するのが得意ではありません。

于 2012-09-27T14:52:54.243 に答える
4

表示されるエラー メッセージは正しいです。Forコード ブロックの実行中にコード ブロックを終了しようとしているため、"Next without For" というエラー メッセージが表示されますWithNextEnd 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 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

後入れ先出しのように見えます (つまり、 foundEnd Withですが、前の要素はWith.

于 2012-09-27T14:53:51.217 に答える