source

Excel VBA:On ErrorGoto 문이 For-Loop 내부에서 작동하지 않음

lovecheck 2023. 4. 27. 22:31
반응형

Excel VBA:On ErrorGoto 문이 For-Loop 내부에서 작동하지 않음

엑셀에서 표를 순환해서 읽으려고 합니다.이 표의 처음 세 열에는 텍스트 제목이 있고, 나머지 열에는 날짜가 있습니다.날짜 유형 변수에 해당 날짜를 순차적으로 할당한 다음 날짜를 기준으로 일부 작업을 수행합니다.

이를 위해 테이블의 각 루프를 사용합니다.열을 나열합니다.처음 세 개의 열에 날짜 헤더가 없기 때문에 날짜 형식 변수에 헤더 문자열을 할당하는 동안 오류가 발생하면 루프가 다음 열로 바로 이동하도록 루프를 설정하려고 했습니다.

이것은 첫 번째 열에 효과가 있는 것 같습니다.그러나 두 번째 열의 헤더가 날짜 형식 변수에 '할당'되면 매크로가 오류 처리 블록 내에 있더라도 오류가 발생합니다.

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

반복합니다. 오류는 루프의 두 번째 라운드에서 발생합니다.

myDate = CDate(myCol.Name)

오류 발생 시 문이 작동을 중지하는 이유를 설명할 수 있는 사람이 있습니까?

표시된 것과 같은 코드를 사용해도 실제로는 다음과 같은 오류를 처리할 수 있습니다.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 <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:두 번째 오류가 발생할 때 오류 처리기가 여전히 활성화되므로 두 번째 오류가 다음에 의해 트랩되지 않습니다.On Error진술.

추가해야 .resume오류 처리가 끝났음을 나타내는 오류 처리 코드의 일부 종류.그렇지 않으면 첫 번째 오류 처리기가 여전히 활성 상태이며 사용자는 "해결"되지 않습니다.

http://www.cpearson.com/excel/errorhandling.htm (구체적으로 "오류 처리 블록 및 오류 발생 시 이동"이라는 제목과 다음 섹션)을 참조하십시오.

팍스디아블로의 수락된 답변에 대한 후속 조치.이는 동일한 서브에 하나씩 두 개의 오류 트랩을 허용함으로써 가능합니다.

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 처리기를할 수 있도록 및 활성오처리를취고소하다른설수다있정를할니습기처리오류류기▁cancels▁and다▁handler있▁to수 니습anderr.clear이러면 안 돼요!이것이 좋은 생각인지 아닌지는 독자들을 위한 연습으로 남겨지지만, 효과가 있습니다!

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 =1에서 10번 라인에서 할 것입니다.i = 2사용했음에도 불구하고Err.Clear

워크시트로 축소

내 표의 각 색상에 대해.열 나열

On Error GoTo endbit

Dim myDate As Date

myDate = CDate(myCol.Name)

On Error GoTo 0
'MORE CODE HERE

엔드비트: NextCol 재개

NextCol: 'Next myCol Exit Sub' 또는 기타 '

언급URL : https://stackoverflow.com/questions/11998836/excel-vba-on-error-goto-statement-not-working-inside-for-loop

반응형