Использование On Error Goto, чтобы попытаться найти причину ошибки - PullRequest
0 голосов
/ 08 февраля 2020

Я получаю несоответствие типов при запуске моего кода. Есть ли способ использовать On Error Goto, чтобы помочь мне отладить его? Вот мой код.

Private Sub FH_CNC_HideOrders_Click()
    On Error GoTo errHandler

    If Me.FH_CNC_HideOrders.Caption = "Hide" Then
        'Intiansiate objects and setup variables
        Dim tbl As ListObject
        Dim c As Range
        Dim colStartDate As Range
        Dim FoundDate As Date
        'Set object/variable values
        Set tbl = ActiveWorkbook.Worksheets("Production Tracking").ListObjects("Table293")

        With tbl
            'Search "Start Date" (Col2), top to bottom, searching for the first cell with a color index of 15 and the "End Date" (Col3) which has an index color of anything other than 15
            Set colStartDate = .ListColumns("CNC Begins").DataBodyRange

            For Each c In colStartDate.Cells
                'MsgBox "c.Value:" & c.Value & "   |   c.Interior.ColorIndex:" & c.Interior.ColorIndex & "   |   c.Address:" & c.Address _
                    & Chr(10) & Chr(10) & "c.Offset.Value):" & c.Offset(0, 1).Value & "   |   c.Interior.ColorIndex:" & c.Offset(0, 1).Interior.ColorIndex & "   |   c.Address:" & c.Offset(0, 1).Address

                If c.Interior.ColorIndex = 15 And c.Offset(0, 1).Interior.ColorIndex <> 15 Then
                    FoundDate = c.Value
                    Exit For
                End If
            Next c

            For Each c In colStartDate.Cells

                If Not c.EntireRow.Hidden = True Then
errHandler:
                Msbox c.Value
                Exit Sub
                    'Hide dates prior to colStartDate but not empty cells
                    If Not IsEmpty(c.Value) Then
                        If Not c.Value >= FoundDate And IsDate(c.Value) Then


                            c.EntireRow.Hidden = True
                            'MsgBox c.Address
                        End If
                    End If
                End If
            Next c

        End With

        Me.FH_CNC_HideOrders.Caption = "Show"
    ElseIf Me.FH_CNC_HideOrders.Caption = "Show" Then
        Me.FH_CNC_HideOrders.Caption = "Hide"
    End If
End Sub

Я поместил комментарий в коде, где я хотел бы MsgBox значение в случае ошибки.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Вы "можете", но я действительно не понимаю, почему вы "должны".

Если вы можете получить ошибку несоответствия, потому что c содержит не дату, почему бы не проверить c и узнать?

If IsDate(c.Value) Then ...

Или, может быть, вместо того, чтобы проверять, является ли это дата, выясните, какой это тип дней?

Select Case VarType(c.Value)
    Case 2 to 6
        MsgBox "These are not dates"
         Exit Sub
    Case 7
        c.EntireRow.Hidden = True
     Case Else
         ....

Или, если вы не хотите беспокоиться о них Константы VBA ...

If TypeName(c.Value) = "String" Then MsgBox "This is not a date"
0 голосов
/ 08 февраля 2020

Давайте проясним это. Обработка ошибок не должна использоваться, чтобы найти проблемы с вашим кодом. VBA уже проделал хорошую работу в этом направлении и остановит программу или откажется компилировать.

Обработка ошибок предназначена для исключений, т. Е. Когда вы используете ресурс вне вашего контроля, который может привести к сбою программы из-за отсутствия по своей вине. В этом случае вы должны перехватить ошибку и решить, что с ней делать.

Чтобы устранить ошибки logi c в вашем коде, убедитесь, что вы сделали следующее.

  1. Удалите все сообщения об ошибках, которые у вас есть, из вашего кода.

  2. У вас есть Option Explicit в начале каждого модуля / класса

  3. Вы можете выполнить проект Debug.Compile без каких-либо ошибок.

  4. Вы установили надстройку Fantasti c RubberDuck и исправили все найденные результаты проверки кода.

Теперь вы должны остаться в ситуации, когда единственными ошибками, с которыми вы сталкиваетесь, являются ошибки, вызванные внешними событиями (исключениями).

Для этих окончательных ошибок не используйте Типичный On error Перейти к типу обработки ошибок вы видите во многих примерах (и как используется в вашем коде). Вместо этого инкапсулируйте строку, которая может вызвать ошибку между On Error Resume Next и On Error GoTo 0: тем самым эмулируя структуру «Try catch», наблюдаемую в других известных языках программирования.

В этой статье содержится хорошая информация о Лучшая практика обработки ошибок https://rubberduckvba.wordpress.com/2019/05/

Из вышеперечисленного № 4 наиболее вероятно, где вы найдете любые тонкие ошибки, которые вы сделали.

Удачи

...