【问题标题】:On Error Goto Msg Doesn't work properlyOn Error Goto Msg 无法正常工作
【发布时间】:2018-01-31 02:51:36
【问题描述】:

祝大家今天好!

我目前正在编写转置一些数据的代码。我当前的代码问题是即使没有错误也会弹出“ErrMsg”。如果我在“On Error GoTo ErrMsg”之后放置“Exit Sub”,整个模块将无法继续,我也无法调用下一个模块。希望有人可以在这里帮助我!

我下面的代码运行良好,但即使没有错误,它也会显示 MsgBox。

Sub Five_Transpose()

Dim LPID As Range
Dim InvestorName As Range
Dim DataTableX As ListObject
Dim Rng As Range
Dim rngB As Range

    With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    End With

    Sheets.Add After:=ActiveSheet
    ActiveSheet.Name = "Funds Table"

    Sheets("Filtered Data").Copy After:=ActiveSheet
    ActiveSheet.Name = "X"

    On Error GoTo ErrMsg

    With Sheets("X")
    Set DataTableX = ActiveSheet.ListObjects(1)
    DataTableX.Name = "DataTableX"
    .Range("DataTableX[#All]").RemoveDuplicates Columns:=2, Header:=xlYes
    .Range(Range("A1"), Range("A1").End(xlDown)).Copy Destination:=Sheets("Funds Table").Range("B4")
    .Range(Range("B1"), Range("B1").End(xlDown)).Copy Destination:=Sheets("Funds Table").Range("A4")
    .Range("DataTableX[#All]").RemoveDuplicates Columns:=4, Header:=xlYes
    Set LPID = .Cells.Range(Range("C1"), Range("C1").End(xlDown))
    Set InvestorName = .Cells.Range(Range("D1"), Range("D1").End(xlDown))
    End With

    LPID.Copy
    Sheets("Funds Table").Range("B2").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    InvestorName.Copy
    Sheets("Funds Table").Range("B1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

    Sheets("Funds Table").Select
    Set Rng = Range(Range("B1:B3"), Range("B1:B3").End(xlToRight))
    Set rngB = Range(Range("B5"), Range("B5").End(xlDown))

    With Rng.Borders
        .LineStyle = xlContinuous
        .ThemeColor = 6
        .TintAndShade = 0
        .Weight = xlThin
    End With

    With rngB.Borders
        .LineStyle = xlContinuous
        .ThemeColor = 6
        .TintAndShade = 0
        .Weight = xlThin
    End With

    With Range("B3")
    .Font.Bold = "True"
    .Value = "Funds with IRR"
    .Interior.Pattern = xlSolid
    .Interior.ThemeColor = xlThemeColorAccent2
    End With

    Sheets("X").Delete

    With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
    End With

ErrMsg:
MsgBox ("There are no funds that are within 3 Quarters from now"), , "Message Box:"

Call Six_Continue

End Sub

【问题讨论】:

  • 你能打印出Err.Number吗?可能是0,其实没有报错,但是还是会提示msgbox
  • 只需将Exit Sub 放在ErrMsg: 之前。

标签: vba excel


【解决方案1】:

像这样格式化你的代码:

Sub Five_Transpose()

...code...

On Error GoTo ErrMsg

...code...

ExitPoint:
   Call Six_Continue
   'run any cleanup, like turning _
   'screenupdating back on, etc.
Exit Sub

ErrMsg:
   MsgBox "There are no funds that " & _
       "are within 3 Quarters from now", _
       , "Message Box"
   Resume ExitPoint

End Sub

许多人认为同时使用退出点和错误处理程序的方法是最佳实践。虽然不是总是合适,但大部分时间都是这样。

通过以这种方式设置程序,您仍然可以在退出时进行所有代码清理(至关重要,如果您要关闭和打开开关,因为它可以确保它们返回到所需的状态),您可以调用您的子程序(只要确保在此过程出错并且它依赖于此过程中的某些内容时它不会出错),并且您可以在失败时向用户提供错误消息,同时仍然优雅地令人兴奋子。

它可以正常工作,因为如果代码成功,它会继续向下通过ExitPoint 行然后退出。如果失败,它会立即跳转到错误处理程序,然后将其发送到ExitPoint

【讨论】:

  • 如果代码遇到错误,则会出现 msgbox,但在我单击“确定”后,整个 Excel 工作表都会停止响应。这有什么可能的原因吗?如果我删除“Resume ExitPoint”它会起作用,这会有什么可能的影响吗?
  • 你的Six_Continue子/函数是做什么的?
【解决方案2】:

防止错误处理代码在没有错误发生时运行 发生时,放置一个 Exit Sub、Exit Function 或 Exit Property 语句 在错误处理例程之前,如下所示 片段:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
   On Error GoTo ErrorHandler
   . . .
   Exit Sub
ErrorHandler:
   . . .
   Resume Next
End Sub

来自帮助 https://msdn.microsoft.com/en-us/library/aa266173(v=vs.60).aspx

【讨论】:

    【解决方案3】:

    这是一个如何使用错误处理的示例。我建议您在此处阅读有关错误处理的更多信息:(http://www.cpearson.com/excel/errorhandling.htm)

    sub test()
    
    'define your variables
    
    On Error GoTo errHandler:
    
    'Some codes
    
    errHandler:
     If Err.Number = -2147352567 Then
        MsgBox "Sorry, Something Went Wrong!"
        Exit Sub
     ElseIf Err.Number = 0 Then
        'no error no Action needed.
     Else
        MsgBox "An Error Occur!!" & vbCrLf & vbCrLf & _
        "Error Number: " & Err.Number & vbCrLf & _
        "Error Description: " & Err.Description
        Exit Sub
     End If
    
    End Ub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多