21

私はExcelでテーブルを循環しようとしています。この表の最初の3列にはテキストの見出しがあり、残りの列には見出しとして日付があります。これらの日付を順番にDate型変数に割り当ててから、日付に基づいていくつかの操作を実行したいと思います。

これを行うために、myTable.ListColumnsでforeachループを使用しています。最初の3列には日付ヘッダーがないため、ヘッダー文字列をdate-type変数に割り当てるときにエラーが発生した場合に、ループが次の列に直接進むようにループを設定しようとしました。

これは最初の列で機能するようです。ただし、2番目の列のヘッダーがdate-type変数に「割り当てられている」場合、マクロはエラー処理ブロック内にあるにもかかわらずエラーが発生します。

Dim myCol As ListColumn
For Each myCol In myTable.ListColumns
    On Error GoTo NextCol

    Dim myDate As Date
    myDate = CDate(myCol.Name)

    On Error GoTo 0

    'MORE CODE HERE

NextCol:
    On Error GoTo 0
Next myCol

繰り返しになりますが、エラーはループの2番目のラウンドのステートメントでスローされます

myDate = CDate(myCol.Name)

On Errorステートメントが機能しなくなる理由を誰かが説明できますか?

4

4 に答える 4

45

示されているコードを使用すると、実際には、ステートメントを実行したときにまだエラー処理ルーチンにいると見なされます。next

つまり、現在のエラー ハンドラーから再開するまで、後続のエラー ハンドラーは許可されません。

より良いアーキテクチャは次のようになります。

    Dim myCol As ListColumn
    For Each myCol In myTable.ListColumns
        On Error GoTo ErrCol
        Dim myDate As Date
        myDate = CDate(myCol.Name)
        On Error GoTo 0
        ' MORE CODE HERE '
NextCol:
    Next myCol
    Exit Sub ' or something '

ErrCol:
    Resume NextCol

これにより、通常のコードからのエラー処理が明確に区別され、別のハンドラーをセットアップしようとする前に、現在実行中のエラー ハンドラーが確実に終了します。

このサイトには、問題の適切な説明があります。


エラー処理ブロックと On Error Goto

エラーハンドラーとも呼ばれるエラー処理ブロックは、On Error Goto <label>:ステートメントを介して実行が転送されるコードのセクションです。このコードは、問題を修正してメイン コード ブロックで実行を再開するか、プロシージャの実行を終了するように設計する必要があります。On Error Goto <label>:行をスキップするだけでステートメントを使用することはできません。たとえば、次のコードは正しく機能しません。

    On Error GoTo Err1:
    Debug.Print 1 / 0
    ' more code
Err1:
    On Error GoTo Err2:
    Debug.Print 1 / 0
    ' more code
Err2:

最初のエラーが発生すると、次の行に実行が移りますErr1:。2 番目のエラーが発生したとき、エラー ハンドラはまだアクティブであるため、2 番目のエラーはOn Errorステートメントによってトラップされません。

于 2012-08-17T02:19:08.087 に答える
8

resumeエラー処理が終了したことを示すために、エラー処理コードに何らかの種類を追加する必要があります。そうしないと、最初のエラー ハンドラーがまだアクティブであり、「解決」されません。

http://www.cpearson.com/excel/errorhandling.htmを参照してください(具体的には、「エラー処理ブロックと On Error Goto」という見出しと次のセクション)。

于 2012-08-17T02:18:40.677 に答える
7

paxdiabloの受け入れられた回答へのフォローアップ。これは可能で、同じサブで 2 つのエラー トラップを次々に許可します。

Public Sub test()
    On Error GoTo Err1:
    Debug.Print 1 / 0
    ' more code
Err1:
    On Error GoTo -1     ' clears the active error handler
    On Error GoTo Err2:  ' .. so we can set up another
    Debug.Print 1 / 0
    ' more code
Err2:
    MsgBox "Got here safely"
End Sub

を使用On Error GoTo -1すると、アクティブなエラー ハンドラがキャンセルされ、別のエラー ハンドラを設定できるようになります (これは行われerr.clearません!)。これが良いアイデアかどうかは読者の課題として残されていますが、うまくいきます!

于 2015-07-21T15:48:10.453 に答える
0

Err オブジェクトのすべてのプロパティ設定をクリアすることは、エラー ハンドラをリセットすることと同じではありません。

これを試して:

Sub TestErr()
Dim i As Integer
Dim x As Double
    On Error GoTo NextLoop
    For i = 1 To 2
10:     x = i / 0
NextLoop:
        If Err <> 0 Then
            Err.Clear
            Debug.Print "Cleared i=" & i
        End If
    Next
End Sub

OPと同じように、エラーを適切にキャッチしますが、i =110行目で失敗する場合に気付くでしょう。i = 2Err.Clear

于 2015-04-20T18:47:31.750 に答える