1

なぜ onTime メソッドの前に on Error Resume next ステートメントが必要なのか疑問に思っていました。明らかに、エラーが発生し、機能に影響を与えていないように見えるためですが、私はただ興味があります。

誰でも私を啓発できますか?

リクエストに応じて投稿されたコード!

これはワークシート モジュールにあります。

Const scrollRowName = "WindowScrollRow"
Dim ws As DataViewSheetClass
Public nextTime As Double
Public latestTime As Double


Private Sub startDog()
If Me.ProtectContents Then
    nextTime = Now + TimeSerial(0, 0, 3)
    If Me.ProtectContents Then Application.OnTime nextTime, Me.CodeName & ".kickDog"
End If
End Sub

Private Sub kickDog()
Static prevWsRow As Long

    If Me Is ActiveSheet And Me.ProtectContents Then
        wsRow = ActiveWindow.scrollRow
        If wsRow <> prevWsRow Then
            With Application
              .screenUpdating = False
              .StatusBar = "Calculating Formats"
              .EnableEvents = False

              scrollRow.Value2 = ActiveWindow.scrollRow

              .EnableEvents = True
              .StatusBar = False

              prevWsRow = wsRow
              .screenUpdating = True
            End With
        End If

        Debug.Print timeStamp & ": Woof!" & Chr(9) & wsRow & Chr(9) & scrollRow.Value2

        nextTime = Now + TimeSerial(0, 0, 3)
        latestTime = nextTime + TimeSerial(0, 0, 10)
        Application.OnTime nextTime, Me.CodeName & ".kickDog", latestTime
    Else
        killDog
    End If
End Sub

Private Sub killDog()
    On Error GoTo rebootObjects
    scrollRow.Value2 = 1
    On Error Resume Next
    Application.OnTime nextTime, Me.CodeName & ".Worksheet_Deactivate", latestTime, False
    On Error GoTo 0
    Exit Sub
rebootObjects:
    Set scrollRow = Me.Range(scrollRowName)
    scrollRow.Value2 = 1
    Resume Next
End Sub

Private Sub Worksheet_Activate()
    Debug.Print timeStamp & ": " & "Summary Activate Start:" & Chr(9) & MicroTimer - t
    t = MicroTimer
    On Error GoTo enableAndExit
    Set ws = New DataViewSheetClass
    Application.EnableEvents = False
    With ws
        .addedActiveArea = Range("WeeksTable")
        .addedActiveArea = Range("SummaryTotals")
        .SparkTargetBehaviour = HEAVY
    End With

enableAndExit:
    Err.Clear
    Application.EnableEvents = True
    Set scrollRow = Me.Range(scrollRowName)
    Set volatileRange = Me.Range(volatileRangeName)
    startDog
    Debug.Print timeStamp & ": " & "Summary Activated:" & Chr(9) & MicroTimer - t
    t = MicroTimer
End Sub

Private Sub Worksheet_Deactivate()
    killDog        
    Set ws = Nothing
End Sub
4

2 に答える 2

0

必須ではなく、コードを書くにはひどくハックな方法です。「On Error Resume Next」が許容されるシナリオはほとんどありません。考慮する必要があるのは次の 2 つです。

Public function Example1() as Boolean
   dim blnReturnValue as Boolean

   On error goto errHandler

     ... Do stuff here that might error
     ... All code can error!

     blnReturnValue = True  ' Set return flag to success

   cleanExit:
      On Error Resume Next  ' <-- Only Place where "On Error Resume Next" is acceptable
      ... Finalise things here, close objects etc. 

      Example1 = blnReturnValue   ' Return the result

      Exit Function  ' Single Exit point
   errHandler:
      ... Handle the error appropriately here

      Resume CleanExit    ' Ensure the function cleans up after itself
End Function

または、エラーが予想されるが、実際には続行する必要がある場合:

Public function Example2() as Boolean
   dim blnReturnValue as Boolean

   On Error Goto errHandler

       blnReturnValue = True  ' default return flag to success

       ... Execute error prone code here
       ... This line will still run after returning from the error handler

       Example2 = blnReturnValue ' Will be False if an error occurred, otherwise true
       Exit Function   'Single Exit Point
   errHandler:
       blnReturnValue = False  ' Set return flag to Failure
       msgbox err.description
       Resume Next   ' Resume at the next line after the error occurred 

End Function
于 2016-09-07T21:51:34.583 に答える