Компилятор VBA не прерывает и не фиксирует ошибки и не выдает сообщений об ошибках при использовании UDF в условном форматировании

Смотрите новые разработки.

У меня странная проблема в Excel. у меня есть Worksheet_Change событие, которое я использую, и я пытаюсь отладить его. Я сохраняю программу и снова открываю ее, и вдруг компилятор не выходит из строя при ошибке. На самом деле, это совсем не ломается!! Я сделаю перерыв во главе саба (и следующие три строки для хорошей меры), и это просто не произойдет. Я подумал, может быть, события не были включены... Итак, я поместил окно сообщения в качестве одной из первых строк кода. Всплывающее окно сообщения.... даже с разрывом на его линии.

Это случилось однажды в определенной строке другого макроса, и я попытался скопировать все в файл.txt и вставить его обратно в более раннюю версию моей программы. Это работало месяцами, но теперь проблема вернулась.

Кодирование не очень важно, но я вставлю его ниже, чтобы пнуть и посмеяться. Он прерывается без ошибки, убираю ли я все сообщения об ошибке или нет. Я вырезал и вставил код в новый саб, и он отлично работает. Я также проверил параметры и проверил "разбить все ошибки". ничего, даже неопределенный вызов не выдаст ошибку, не остановит программу.

Private Sub Worksheet_Change(ByVal target As Range)
Application.EnableEvents = False
Dim aVar() As String
Dim iVar As Integer
On Error GoTo 0

MsgBox "you changed something" 'this is a msgbox that does pop up during execution, verifying that the sub did in fact, run. 
Call iRandomNonsense 'this is a sub that does not exist which the compiler does not tell me about any more.

If target.Columns.Count = 1 Then
    Select Case target.Column
    Case 2
        If target.Count = 1 And Cells(target.Row, 1) = "" Then _
            Cells(target.Row, 1) = Now
    Case 8
        On Error GoTo ExitSub
        aVar = Split(target.Value)
            For Each sVar In aVar
            If IsNumeric(sVar) And Len(sVar) = 5 Then
            If sVar > 30000 Then
            aVar(iVar) = "ALN-" & sVar
            Else
            aVar(iVar) = "DEV-" & sVar
            End If
            End If
            iVar = iVar + 1
        Next
        target.Value = Join(aVar, " ")
    End Select
Else
    On Error GoTo ExitSub
    target.Resize(target.Rows.Count, Cells(target.Row, target.Columns.Count).End(xlToLeft).Column + 1 - target.Column).Select
    Select Case Selection.Columns.Count
    Case 18, 21  'Paste from Scrap report
        Debug.Print "Paste from Scrap report" & Now
        Call purgeCheckboxes
        With Selection
            .Copy
            .PasteSpecial (xlValues)
        End With
        OnSelRow(4, 8).Select
        Selection.Copy Destination:=OnSelRow(1)
        'desc
        OnSelRow(6) = OnSelRow(10)
        OnSelRow(4) = OnSelRow(15)
        With Range(Cells(Selection.Row, 10), Cells(Selection.Row + Selection.Rows.Count - 1, 10))
            .FormulaR1C1 = _
                "=RC[2]&"" ""&RC[3]&"" ""&RC[-3]&"" ""&RC[4]&"" ""&RC[7]&"" ""&RC[11]"
            .Copy
            .PasteSpecial (xlValues)
        End With
        Application.CutCopyMode = False
        Range(Cells(Selection.Row, 7), Cells(Selection.Row + Selection.Rows.Count - 1, 7)).FormulaR1C1 = "TRUE"
        Range(Cells(Selection.Row, 8), Cells(Selection.Row + Selection.Rows.Count - 1, 8)).FormulaR1C1 = "T D Q 9 A Wav DMR"
        Range(Cells(Selection.Row, 9), Cells(Selection.Row + Selection.Rows.Count - 1, 9)).FormulaR1C1 = "2"
        Range(Cells(Selection.Row, 11), Cells(Selection.Row + Selection.Rows.Count - 1, 11)).Select
        Range(Selection, Cells(Selection.Row, UsedRange.Columns.Count)).Select
        Selection.ClearContents
        ActiveWindow.ScrollColumn = 1
    End Select
    Call RefreshCondFormats
End If
ExitSub:
On Error GoTo 0
Application.EnableEvents = True
End Sub

Новая разработка: я последовал совету в одном из комментариев. "Длинный выстрел: у вас есть какое-либо условное форматирование, которое использует UDF? - Рори вчера". Это исправило ошибку разрыва, когда я удалил формулу пользователя в моем условном форматировании. Теперь компилятор останавливается, как и положено, и когда я закомментирую "iRandomNonsense", он прерывается по моей команде. Когда я возвращаю форматирование обратно, оно снова облажается.

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

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

2 ответа

Решение

Если вы используете UDF в условном форматировании, может возникнуть такая проблема. Это наиболее вероятно, если у вас нет обработки ошибок, или если вы пытаетесь получить доступ к любым свойствам, кроме .Value или же .Formula, Часто можно обойти эту проблему - например, используя альтернативные вычисления или поместив UDF в ячейку - но иногда вам может просто не повезти.

Я предлагаю использовать средство для очистки кода Роба Бови, чтобы избавиться от накопленного p-кода, который может вызвать такие ошибки. Когда Excel VBA начинает вести себя странно, очистка кода часто решает проблему.
http://www.appspro.com/Utilities/CodeCleaner.htm

Другие вопросы по тегам