ErrorHandler не работает -> ошибка компиляции / объект не найден - PullRequest
0 голосов
/ 13 февраля 2019

Я создал файл Excel с парой элементов ActiveX.Пока что файл работает так, как задумано, теперь я работаю с «пользовательскими ошибками», которые могут возникнуть в повседневной работе.Для последующего использования элементы activeX (Toggle-, Command- & SpinButtons) очень важны, поэтому я создал несколько подпрограмм для восстановления каждого элемента.Они работают как положено.

Проблема: что теперь, если кто-то удалит кнопку?Я пытался работать с If-Statements (если> element <ничего тогда ...), но это не сработало.Следующим подходом было «При ошибке GoTo».Итак, я создал ErrorHandler и, как обычный код, он работает так, как задумано.Обработчик создает SpinButton с нужным именем.Если я встраиваю ошибку в свой код (a = 1/0), то обработчик выполняет свою работу, но это просто «in vitro». </p>

In vivo, если моего желаемого> элемента <нет, мойкод заканчивается ошибкой (компиляция error_ метод или объект не найден), но мой обработчик ничего не делает, несмотря на то, что это его единственная цель. </p>

Мой код:

Sub Cal_SpinButton_Nr()
Subroutine: 
    On Error GoTo CreateObject:
With Tabelle5.SpinButton_Nr
    .Left = 198
    .Height = 65.25
    .Top = 1.5
    .Width = 54.75
    .Orientation = fmOrientationVertical
    .BackColor = &H8000000F
    .ForeColor = &H80000012
End With

Exit Sub
CreateObject:
Tabelle5.OLEObjects.Add("Forms.SpinButton.1").Name = "SpinButton_Nr2"
'Resume Subroutine
End Sub

Опция Explicit включенаи подпрограмма не содержит переменных.Пока есть объект (SpinButton_Nr), он работает.Без объекта я получаю ошибку компиляции.

Прямо сейчас "Resume Subroutine" отключен, чтобы избежать бесконечного цикла (я выучил свой урок, сначала отключив "exit sub" и нажав F5 ...), обычная функцияэто запустить тот же саб снова, чтобы поставить новый объект в нужном месте.По причинам («in vitro») тестирования новый объект называется _Nr2, позже это просто _Nr.

Теперь вопрос: почему ошибка компиляции не покрывается заявлением «on error»?Как можно изменить код для правильной работы?

Синтаксис должен быть следующим: «Если> элемент <существует, задайте свойства, если <code><element> нет, то создайте его и установите свойства впоследствии.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я предлагаю следующее:

Таким образом, вы на самом деле проверяете, есть ли кнопка прокрутки, если не создали ее, прежде чем начать форматирование.Никакой нечетной обработки ошибок и переходов в вашей процедуре.

Option Explicit

Sub Cal_SpinButton_Nr()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Tabelle5") '<-- tab name
    'OR
    'Set ws = Tabelle5 '<-- VBA code name

    Dim SpinBtn As Object
    On Error Resume Next 'next line errors if no spinbutton exists
    Set SpinBtn = ws.OLEObjects("SpinButton_Nr")
    On Error Goto 0 'always re-activate error reporting!

    'if no spinbutton is found create it before formatting starts
    If SpinBtn Is Nothing Then
        Set SpinBtn = ws.OLEObjects.Add("Forms.SpinButton.1")
        SpinBtn.Name = "SpinButton_Nr"
    End If

    'format spin button
    With SpinBtn
        .Left = 198
        .Height = 65.25
        .Top = 1.5
        .Width = 54.75

        'not that for these .Object is necessary because of using .OLEObjects("SpinButton_Nr")
        .Object.Orientation = fmOrientationVertical
        .Object.BackColor = &H8000000F
        .Object.ForeColor = &H80000012
    End With
End Sub
0 голосов
/ 13 февраля 2019

Ошибки компиляции - это ошибки, возникающие во время компиляции.Они не могут быть охвачены заявлением OnError.Ошибки, охватываемые OnError, являются ошибками во время выполнения, которые появляются после компиляции и во время выполнения.

"Пока существует объект (SpinButton_Nr), он работает. Без объекта я получаю компиляциюошибка."- Если вы хотите получить ошибку времени выполнения, а не ошибку компиляции, привязка объекта должна быть выполнена во время выполнения.

Представьте себе следующий сценарий с Tabelle5 в качестве переменной рабочего листа в Excel:

Sub CompileTimeError()
    With Tabelle5
        Debug.Print .Cells(1, 1)
    End With
End Sub

Это не скомпилируется, потому что VBE не найдет объект Tabelle5.Однако, если вы хотите ошибку во время выполнения, это возможное решение:

Sub RunTimeError()

    Dim nameOfWorksheet As String
    nameOfWorksheet = "Tabelle5"
    With Worksheets(nameOfWorksheet)
        Debug.Print .Cells(1, 1)
    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...