On Error GoTo语句仍在执行,尽管没有生成错误

时间:2014-12-30 15:35:09

标签: excel vba excel-vba error-handling goto

我的代码如下,奇怪的是即使代码中没有错误,Errorhandler程序仍在执行......可能是什么问题?

运行没有任何错误处理程序的代码不会产生任何错误,但是当我包含错误处理语句时,msgbox下的Errorhandler仍会出现!

代码

Public Sub ExportGraphs(Optional PivotExport As Boolean)
' Exports only graphs on the "Mainwindow" sheet to a new worksheet

    Dim wsh As Worksheet: Set wsh = Sheets.Add
    Dim source_sht As Worksheet: Set source_sht = Sheets("Mainwindow")

    ActiveWindow.Zoom = 70


    On Error GoTo Errorhandler
    With wsh

        If source_sht.OLEObjects("Btn_CurrentTime").Object.Value = True Then
        .Name = source_sht.OLEObjects("CombBox_Instruments").Object.Value & " " & source_sht.OLEObjects("DTPicker_FROM").Object.Value _
                & "-" & source_sht.OLEObjects("DTPicker_TO").Object.Value
        Else
        .Name = source_sht.OLEObjects("CombBox_Instruments").Object.Value & " " & "Max_Possible_To" _
                & "-" & source_sht.OLEObjects("DTPicker_TO").Object.Value

        End If

    End With

    Dim source_chart As ChartObject
    Dim target_rng As Range: Set target_rng = wsh.Range("A1")

    For Each source_chart In source_sht.ChartObjects
        source_chart.CopyPicture xlScreen, xlBitmap
        target_rng.PasteSpecial
        Set target_rng = target_rng.Offset(20, 0)
        Next

    If PivotExport = True Then

    Debug.Print "se"

    End If

Errorhandler:
        MsgBox "An export sheet for this ticker and timeline already exists"

End Sub

2 个答案:

答案 0 :(得分:4)

@dee提供了正确答案。

Errorhandler:只是占位符。它并不像你想象的那样运作。您正在使用它像If... Then...语句:

If Error Then
   Show MsgBox
Else
    Skip MsgBox
End If

由于错误处理程序只是一个占位符而不是If... Then...,占位符之后的代码将运行,无论错误或无错误。要解决此问题,请在Exit Sub行上方添加Errorhandler:

Exit Sub

Errorhandler:
    MsgBox "An export sheet for this ticker and timeline already exists"

End Sub

答案 1 :(得分:4)

在这段代码中,ErrorHandler:就是所谓的line label

Errorhandler:
        MsgBox "An export sheet for this ticker and timeline already exists"

End Sub

行标签不是可执行代码,而只是一个标记,可以告诉其他代码通过任何 GoTo Statement跳转到哪里。有了这些知识,它们显然不是错误处理程序所独有的。

此处的解决方案是使用Exit StatementSub“早期”返回。

Exit Sub

Errorhandler:
        MsgBox "An export sheet for this ticker and timeline already exists"

End Sub

其他人可能不同意我,但我喜欢构建我的错误处理,以便代码始终停止在Exit Sub上执行。如果代码在End Sub上结束执行,则出现问题。